Commit 675575f5 by DJ Delorie Committed by DJ Delorie

charset.c (convert_using_iconv): Close out any shift states, returning to the initial state.

* charset.c (convert_using_iconv): Close out any shift states,
returning to the initial state.

From-SVN: r130785
parent a2b67787
2007-12-11 DJ Delorie <dj@redhat.com>
* charset.c (convert_using_iconv): Close out any shift states,
returning to the initial state.
2007-12-06 Tom Tromey <tromey@redhat.com>
PR c/29172:
......
......@@ -548,6 +548,15 @@ convert_no_conversion (iconv_t cd ATTRIBUTE_UNUSED,
/* And this one uses the system iconv primitive. It's a little
different, since iconv's interface is a little different. */
#if HAVE_ICONV
#define CONVERT_ICONV_GROW_BUFFER \
do { \
outbytesleft += OUTBUF_BLOCK_SIZE; \
to->asize += OUTBUF_BLOCK_SIZE; \
to->text = XRESIZEVEC (uchar, to->text, to->asize); \
outbuf = (char *)to->text + to->asize - outbytesleft; \
} while (0)
static bool
convert_using_iconv (iconv_t cd, const uchar *from, size_t flen,
struct _cpp_strbuf *to)
......@@ -570,16 +579,24 @@ convert_using_iconv (iconv_t cd, const uchar *from, size_t flen,
iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
if (__builtin_expect (inbytesleft == 0, 1))
{
/* Close out any shift states, returning to the initial state. */
if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t)-1)
{
if (errno != E2BIG)
return false;
CONVERT_ICONV_GROW_BUFFER;
if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t)-1)
return false;
}
to->len = to->asize - outbytesleft;
return true;
}
if (errno != E2BIG)
return false;
outbytesleft += OUTBUF_BLOCK_SIZE;
to->asize += OUTBUF_BLOCK_SIZE;
to->text = XRESIZEVEC (uchar, to->text, to->asize);
outbuf = (char *)to->text + to->asize - outbytesleft;
CONVERT_ICONV_GROW_BUFFER;
}
}
#else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment