mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
(utf8_internal_loop): Correctly reconstruct stored character in state in UNPACK_BYTES macro.
This commit is contained in:
@ -939,21 +939,42 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
#define UNPACK_BYTES \
|
#define UNPACK_BYTES \
|
||||||
{ \
|
{ \
|
||||||
wint_t wch = state->__value.__wch; \
|
wint_t wch = state->__value.__wch; \
|
||||||
|
size_t ntotal; \
|
||||||
inlen = state->__count; \
|
inlen = state->__count; \
|
||||||
\
|
\
|
||||||
if (state->__value.__wch <= 0x7ff) \
|
if (state->__value.__wch <= 0x7ff) \
|
||||||
bytebuf[0] = 0xc0; \
|
{ \
|
||||||
|
bytebuf[0] = 0xc0; \
|
||||||
|
ntotal = 2; \
|
||||||
|
} \
|
||||||
else if (state->__value.__wch <= 0xffff) \
|
else if (state->__value.__wch <= 0xffff) \
|
||||||
bytebuf[0] = 0xe0; \
|
{ \
|
||||||
|
bytebuf[0] = 0xe0; \
|
||||||
|
ntotal = 3; \
|
||||||
|
} \
|
||||||
else if (state->__value.__wch <= 0x1fffff) \
|
else if (state->__value.__wch <= 0x1fffff) \
|
||||||
bytebuf[0] = 0xf0; \
|
{ \
|
||||||
|
bytebuf[0] = 0xf0; \
|
||||||
|
ntotal = 4; \
|
||||||
|
} \
|
||||||
else if (state->__value.__wch <= 0x3ffffff) \
|
else if (state->__value.__wch <= 0x3ffffff) \
|
||||||
bytebuf[0] = 0xf8; \
|
{ \
|
||||||
|
bytebuf[0] = 0xf8; \
|
||||||
|
ntotal = 5; \
|
||||||
|
} \
|
||||||
else \
|
else \
|
||||||
bytebuf[0] = 0xfc; \
|
{ \
|
||||||
|
bytebuf[0] = 0xfc; \
|
||||||
|
ntotal = 6; \
|
||||||
|
} \
|
||||||
\
|
\
|
||||||
while (inlen-- > 1) \
|
do \
|
||||||
bytebuf[inlen] = 0x80 | (wch & 0x3f); \
|
{ \
|
||||||
|
if (--ntotal < inlen) \
|
||||||
|
bytebuf[ntotal] = 0x80 | (wch & 0x3f); \
|
||||||
|
wch >>= 6; \
|
||||||
|
} \
|
||||||
|
while (ntotal > 1); \
|
||||||
\
|
\
|
||||||
bytebuf[0] |= wch; \
|
bytebuf[0] |= wch; \
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user