about summary refs log tree commit diff
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.tar.gz
glibc-cd201e387c261f9684a76a51e63f194bf49faa3f.tar.xz
glibc-cd201e387c261f9684a76a51e63f194bf49faa3f.zip
(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 a8c07f1cbb..1844f2b838 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;							      \
   }