char *outbuf = 0;
size_t outbufferlength;
size_t result;
+ char *ip;
char *op ;
size_t inbytes = 0;
size_t outbytes ;
if (from == NULL)
from = default_encoding;
+ conv = create_iconv (to, from);
+
+ if ( (iconv_t) -1 == conv )
+ return xstrdup (text);
+
+ /* Put the converter into the initial shift state, in case there was any
+ state information left over from its last usage. */
+ iconv (conv, NULL, 0, NULL, 0);
+
for ( outbufferlength = 1 ; outbufferlength != 0; outbufferlength <<= 1 )
if ( outbufferlength > length)
break;
+ ip = text;
+
outbuf = pool_malloc (pool, outbufferlength);
op = outbuf;
inbytes = length;
- conv = create_iconv (to, from);
-
- if ( (iconv_t) -1 == conv )
- return xstrdup (text);
-
do {
- const char *ip = text;
- result = iconv (conv, (ICONV_CONST char **) &text, &inbytes,
+ result = iconv (conv, (ICONV_CONST char **) &ip, &inbytes,
&op, &outbytes);
if ( -1 == result )
}
/* Fall through */
case E2BIG:
+ iconv (conv, NULL, 0, NULL, 0);
pool_free (pool, outbuf);
outbufferlength <<= 1;
outbuf = pool_malloc (pool, outbufferlength);
op = outbuf;
outbytes = outbufferlength;
inbytes = length;
- text = ip;
+ ip = text;
break;
default:
/* should never happen */