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);