specs/patches/scim-with-solaris-iconv-patch.diff
changeset 706 ca594d31f781
parent 705 c5b0af57a88c
child 707 dfbe6c035259
equal deleted inserted replaced
705:c5b0af57a88c 706:ca594d31f781
     1 --- scim-1.4.7.orig/src/scim_iconv.cpp	2007�� 10��  9�� �� 00:42:09
       
     2 +++ scim-1.4.7/src/scim_iconv.cpp	2007�� 12�� 29�� �� 16:30:48
       
     3 @@ -97,11 +97,11 @@
       
     4      iconv_t new_iconv_to_unicode;
       
     5  
       
     6      if (scim_is_little_endian ()) {
       
     7 -        new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-4LE");
       
     8 -        new_iconv_to_unicode = iconv_open ("UCS-4LE", encoding.c_str ());
       
     9 +        new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-2LE");
       
    10 +        new_iconv_to_unicode = iconv_open ("UCS-2LE", encoding.c_str ());
       
    11      } else {
       
    12 -        new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-4BE");
       
    13 -        new_iconv_to_unicode = iconv_open ("UCS-4BE", encoding.c_str ());
       
    14 +        new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-2BE");
       
    15 +        new_iconv_to_unicode = iconv_open ("UCS-2BE", encoding.c_str ());
       
    16      }
       
    17  
       
    18      if (new_iconv_from_unicode == (iconv_t) -1 ||
       
    19 @@ -144,17 +144,23 @@
       
    20      size_t src_buf_size = 0;
       
    21      size_t ret;
       
    22  
       
    23 +    ucs2_t *ucs2src = new ucs2_t[src_len];
       
    24 +    for (int i = 0; i < src_len; i++) {
       
    25 +	ucs2src[i] = (ucs2_t)src[i];
       
    26 +    }
       
    27 +
       
    28      iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size); 
       
    29  
       
    30      char *dest_buf_ptr = dest_buf;
       
    31 -    ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
       
    32 +    ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) ucs2src;
       
    33  
       
    34      dest_buf_size = SCIM_MAX_BUFSIZE * MB_LEN_MAX;
       
    35 -    src_buf_size = src_len * sizeof (ucs4_t);
       
    36 +    src_buf_size = src_len * sizeof (ucs2_t);
       
    37  
       
    38      ret = iconv (m_impl->m_iconv_from_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); 
       
    39      dest.assign (dest_buf, dest_buf_ptr);
       
    40  
       
    41 +    delete[] ucs2src;
       
    42      return ret != (size_t) -1;
       
    43  }
       
    44  
       
    45 @@ -172,18 +178,24 @@
       
    46      char dest_buf [SCIM_MAX_BUFSIZE * MB_LEN_MAX];
       
    47      size_t src_buf_size = 0;
       
    48      size_t dest_buf_size = 0;
       
    49 +
       
    50      size_t ret;
       
    51 +    ucs2_t *ucs2src = new ucs2_t[src_len];
       
    52 +    for (int i = 0; i < src_len; i++) {
       
    53 +	ucs2src[i] = (ucs2_t)src[i];
       
    54 +    }
       
    55  
       
    56      iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size); 
       
    57  
       
    58      char *dest_buf_ptr = dest_buf;
       
    59 -    ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
       
    60 +    ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) ucs2src;
       
    61  
       
    62 -    src_buf_size = src_len * sizeof (ucs4_t);
       
    63 +    src_buf_size = src_len * sizeof (ucs2_t);
       
    64      dest_buf_size = SCIM_MAX_BUFSIZE * MB_LEN_MAX;
       
    65  
       
    66      ret = iconv (m_impl->m_iconv_from_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); 
       
    67  
       
    68 +    delete[] ucs2src;
       
    69      return ret != (size_t) -1;
       
    70  }
       
    71  
       
    72 @@ -199,20 +211,30 @@
       
    73      if (m_impl->m_iconv_to_unicode == (iconv_t) -1) return false;
       
    74  
       
    75      ucs4_t dest_buf [SCIM_MAX_BUFSIZE];
       
    76 +    ucs2_t ucs2_dest_buf [SCIM_MAX_BUFSIZE];
       
    77  
       
    78      size_t dest_buf_size = 0;
       
    79      size_t src_buf_size = 0;
       
    80      size_t ret;
       
    81 +    int  i;
       
    82  
       
    83      iconv (m_impl->m_iconv_to_unicode, 0, &src_buf_size, 0, &dest_buf_size); 
       
    84  
       
    85 -    char *dest_buf_ptr = (char*) dest_buf;
       
    86 +    char *dest_buf_ptr = (char*) ucs2_dest_buf;
       
    87      ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
       
    88  
       
    89 -    dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs4_t);
       
    90 +    dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs2_t);
       
    91      src_buf_size = src_len;
       
    92  
       
    93      ret = iconv (m_impl->m_iconv_to_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); 
       
    94 +
       
    95 +    size_t dest_cnt = (SCIM_MAX_BUFSIZE * sizeof (ucs2_t) - dest_buf_size)
       
    96 +		/ sizeof (ucs2_t);
       
    97 +		
       
    98 +    for (i = 0; i < dest_cnt; i++) {
       
    99 +	dest_buf[i] = (ucs4_t)ucs2_dest_buf[i] & 0x0000ffff;
       
   100 +    }
       
   101 +    dest_buf_ptr = (char *)&dest_buf[i];
       
   102      dest.assign (dest_buf, (ucs4_t*) dest_buf_ptr);
       
   103  
       
   104      return ret != (size_t) -1;
       
   105 @@ -235,16 +257,21 @@
       
   106      size_t dest_buf_size = 0;
       
   107      size_t ret;
       
   108  
       
   109 -    iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size); 
       
   110 +    ucs2_t *ucs2src = new ucs2_t[src_len];
       
   111 +    for (int i = 0; i < src_len; i++) {
       
   112 +	ucs2src[i] = (ucs2_t)src[i];
       
   113 +    }
       
   114 +    iconv (m_impl->m_iconv_to_unicode, 0, &src_buf_size, 0, &dest_buf_size); 
       
   115  
       
   116      char *dest_buf_ptr = (char*) dest_buf;
       
   117 -    ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src;
       
   118 +    ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) ucs2src;
       
   119  
       
   120      src_buf_size = src_len;
       
   121 -    dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs4_t);
       
   122 +    dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs2_t);
       
   123  
       
   124      ret = iconv (m_impl->m_iconv_to_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); 
       
   125  
       
   126 +    delete[] ucs2src;
       
   127      return ret != (size_t) -1;
       
   128  }
       
   129  
       
   130 --- scim-1.4.7.orig/src/scim_types.h.in	2007�� 10��  9�� �� 00:42:09
       
   131 +++ scim-1.4.7/src/scim_types.h.in	2007�� 12�� 29�� �� 16:30:48
       
   132 @@ -50,6 +54,7 @@
       
   133  #else
       
   134      typedef uint32 ucs4_t;
       
   135  #endif
       
   136 +typedef uint16 ucs2_t;
       
   137  
       
   138  typedef std::basic_string<char> String;
       
   139  typedef std::basic_string<ucs4_t> WideString;