aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-04-27 05:36:45 +0000
committerUlrich Drepper <drepper@redhat.com>2000-04-27 05:36:45 +0000
commitcd201e387c261f9684a76a51e63f194bf49faa3f (patch)
tree89971721272f57f3b6cfb04590df4a546e5cdbed
parent548f51f6be65dc24db751e7fed792df48e865df5 (diff)
downloadglibc-cd201e387c261f9684a76a51e63f194bf49faa3f.zip
glibc-cd201e387c261f9684a76a51e63f194bf49faa3f.tar.gz
glibc-cd201e387c261f9684a76a51e63f194bf49faa3f.tar.bz2
(utf8_internal_loop): Correctly reconstruct stored character in state in UNPACK_BYTES macro.
-rw-r--r--iconv/gconv_simple.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index a8c07f1..1844f2b 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -939,21 +939,42 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
#define UNPACK_BYTES \
{ \
wint_t wch = state->__value.__wch; \
+ size_t ntotal; \
inlen = state->__count; \
\
if (state->__value.__wch <= 0x7ff) \
- bytebuf[0] = 0xc0; \
+ { \
+ bytebuf[0] = 0xc0; \
+ ntotal = 2; \
+ } \
else if (state->__value.__wch <= 0xffff) \
- bytebuf[0] = 0xe0; \
+ { \
+ bytebuf[0] = 0xe0; \
+ ntotal = 3; \
+ } \
else if (state->__value.__wch <= 0x1fffff) \
- bytebuf[0] = 0xf0; \
+ { \
+ bytebuf[0] = 0xf0; \
+ ntotal = 4; \
+ } \
else if (state->__value.__wch <= 0x3ffffff) \
- bytebuf[0] = 0xf8; \
+ { \
+ bytebuf[0] = 0xf8; \
+ ntotal = 5; \
+ } \
else \
- bytebuf[0] = 0xfc; \
+ { \
+ bytebuf[0] = 0xfc; \
+ ntotal = 6; \
+ } \
\
- while (inlen-- > 1) \
- bytebuf[inlen] = 0x80 | (wch & 0x3f); \
+ do \
+ { \
+ if (--ntotal < inlen) \
+ bytebuf[ntotal] = 0x80 | (wch & 0x3f); \
+ wch >>= 6; \
+ } \
+ while (ntotal > 1); \
\
bytebuf[0] |= wch; \
}