Author: iratqq
Date: Sun Dec 14 15:51:36 2008
New Revision: 5671
Modified:
trunk/uim/iconv.c
Log:
* uim/iconv.c (uim_iconv_code_conv):
- Don't move index value of input string.
store second buffer and return it.
Modified: trunk/uim/iconv.c
==============================================================================
--- trunk/uim/iconv.c (original)
+++ trunk/uim/iconv.c Sun Dec 14 15:51:36 2008
@@ -256,7 +256,9 @@
size_t outbufsiz, outs;
char *outbuf, *out;
size_t ret = 0;
+ size_t nconv = 0;
size_t idx = 0;
+ char *str = NULL;
if (UIM_CATCH_ERROR_BEGIN())
return NULL;
@@ -271,12 +273,11 @@
out = outbuf = uim_malloc(outbufsiz);
while (ins > 0) {
- out = outbuf + idx;
+ out = outbuf;
outs = outbufsiz;
ret = iconv(cd, (ICONV_CONST char **)&in, &ins, &out, &outs);
- idx += outbufsiz - outs;
-
+ nconv = outbufsiz - outs;
if (ret == (size_t)-1) {
switch (errno) {
case EINVAL:
@@ -295,13 +296,21 @@
} else {
/* XXX: irreversible characters */
}
+ if (nconv > 0) {
+ if (str == NULL)
+ str = uim_malloc(nconv + 1);
+ else
+ str = uim_realloc(str, idx + nconv + 1);
+ memcpy(&str[idx], outbuf, nconv);
+ idx += nconv;
+ }
}
do {
- out = outbuf + idx;
+ out = outbuf;
outs = outbufsiz;
ret = iconv(cd, NULL, NULL, &out, &outs);
- idx += outbufsiz - outs;
+ nconv = outbufsiz - outs;
if (ret == (size_t)-1) {
outbufsiz *= 2;
@@ -310,14 +319,29 @@
} else {
/* XXX: irreversible characters */
}
+ if (nconv > 0) {
+ if (str == NULL)
+ str = uim_malloc(nconv + 1);
+ else
+ str = uim_realloc(str, idx + nconv + 1);
+ memcpy(&str[idx], outbuf, nconv);
+ idx += nconv;
+ }
} while (ret == (size_t)-1);
- *out = '\0';
+ if (str == NULL)
+ str = uim_strdup("");
+ else
+ str[idx] = '\0';
+ free(outbuf);
+
UIM_CATCH_ERROR_END();
- return outbuf;
+ return str;
err:
+ free(outbuf);
+
UIM_CATCH_ERROR_END();
return uim_strdup("");