diff options
author | eugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2008-05-29 18:35:21 +0000 |
---|---|---|
committer | eugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2008-05-29 18:35:21 +0000 |
commit | 94ef7fd59c03212f515df1c7ed4637ad76198f81 (patch) | |
tree | 4100caa086876e979bb6b75de15871986893c664 /libass/ass.c | |
parent | 8e59a530c453f8d7c8d36611ae975fc3528afc30 (diff) | |
download | libass-94ef7fd59c03212f515df1c7ed4637ad76198f81.tar.bz2 libass-94ef7fd59c03212f515df1c7ed4637ad76198f81.tar.xz |
Clear iconv conversion state also in libass.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26923 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libass/ass.c')
-rw-r--r-- | libass/ass.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/libass/ass.c b/libass/ass.c index 4b803db..c532328 100644 --- a/libass/ass.c +++ b/libass/ass.c @@ -846,13 +846,19 @@ static char* sub_recode(char* data, size_t size, char* codepage) char* ip; char* op; size_t rc; + int clear = 0; outbuf = malloc(size); ip = data; op = outbuf; - while (ileft) { - rc = iconv(icdsc, &ip, &ileft, &op, &oleft); + while (1) { + if (ileft) + rc = iconv(icdsc, &ip, &ileft, &op, &oleft); + else {// clear the conversion state and leave + clear = 1; + rc = iconv(icdsc, NULL, NULL, &op, &oleft); + } if (rc == (size_t)(-1)) { if (errno == E2BIG) { size_t offset = op - outbuf; @@ -864,7 +870,9 @@ static char* sub_recode(char* data, size_t size, char* codepage) mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorRecodingFile); return NULL; } - } + } else + if (clear) + break; } outbuf[osize - oleft - 1] = 0; } |