char *outbuf = 0;
size_t outbufferlength;
size_t result;
+ char *ip;
char *op ;
size_t inbytes = 0;
size_t outbytes ;
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;
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 */