Author: ek.kato
Date: Thu Mar  6 06:38:15 2008
New Revision: 5277

Modified:
  trunk/uim/iconv.c
  trunk/xim/compose.cpp
  trunk/xim/locale.cpp

Log:
* Reset iconv(3) conversion state, patched by G-HAL (#14812).

* xim/locale.cpp (UTF8_Locale::utf8_to_native_str) : Reset
 conversion state.
* xim/compose.cpp (mb_string_to_utf8) : Ditto.
* uim/iconv.c (uim_iconv_code_conv)
 - Add space for '\0' and terminate the string explicitly.
 - Reset conversion state.


Modified: trunk/uim/iconv.c
==============================================================================
--- trunk/uim/iconv.c   (original)
+++ trunk/uim/iconv.c   Thu Mar  6 06:38:15 2008
@@ -267,11 +267,13 @@
      len = strlen(str);
      bufsize = (len + sizeof("")) * MBCHAR_LEN_MAX;
      realbuf = alloca(bufsize);
-      memset(realbuf, 0, bufsize);
+      bufsize--;

      inbuf = str;
      outbuf = realbuf;
      iconv(ic, (ICONV_CONST char **)&inbuf, &len, &outbuf, &bufsize);
+      iconv(ic, NULL, NULL, &outbuf, &bufsize);
+      *outbuf = '\0';
      src = realbuf;
    } else {
      src = str;

Modified: trunk/xim/compose.cpp
==============================================================================
--- trunk/xim/compose.cpp       (original)
+++ trunk/xim/compose.cpp       Thu Mar  6 06:38:15 2008
@@ -1234,6 +1234,14 @@
        utf8[0] = '\0';
        return 0;
    }
+    ret_val = iconv(cd, NULL, NULL, &outchar, &outbytesleft);
+    if (ret_val == (size_t)-1 && errno != E2BIG) {
+       //perror("error in iconv");
+       uim_iconv->release(cd);
+       free(outbuf);
+       utf8[0] = '\0';
+       return 0;
+    }
    uim_iconv->release(cd);

    *outchar = '\0';

Modified: trunk/xim/locale.cpp
==============================================================================
--- trunk/xim/locale.cpp        (original)
+++ trunk/xim/locale.cpp        Thu Mar  6 06:38:15 2008
@@ -277,7 +277,12 @@
    inbytesleft = strlen(inbuf);
    outbytesleft = outbufsize - 1;
ret_val = iconv(m_iconv_cd, (ICONV_CONST char **)&inchar, &inbytesleft, &outchar, &outbytesleft);
-
+    if (ret_val == (size_t)-1 && errno != E2BIG) {
+       //perror("error in iconv");
+       free(outbuf);
+       return NULL;
+    }
+    ret_val = iconv(m_iconv_cd, NULL, NULL, &outchar, &outbytesleft);
    if (ret_val == (size_t)-1 && errno != E2BIG) {
        //perror("error in iconv");
        free(outbuf);

Reply via email to