From: Ulrich Drepper Date: Thu, 16 Jan 2003 07:21:24 +0000 (+0000) Subject: Update. X-Git-Tag: upstream/2.30~20243 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=41f112ad228d4cd587712b747472a3a9f7e20e5a;p=external%2Fglibc.git Update. * iconv/loop.c: Use CLEAR_STATE if defined to clear __state element. --- diff --git a/ChangeLog b/ChangeLog index 57e1c65..43a4e7c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * iconv/gconv_simple.c (STORE_REST): Explicitly store the total expected size into state. (UNPACK_BYTES): Do the reverse. + * iconv/loop.c: Use CLEAR_STATE if defined to clear __state element. * wcsmbs/tst-mbrtowc.c (utf8_test_1): Add test for the bug. Reported by Al Viro . diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c index 124c8e7..69489d8 100644 --- a/iconv/gconv_simple.c +++ b/iconv/gconv_simple.c @@ -1081,7 +1081,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step, ch <<= r * 6; \ \ /* Store the number of bytes expected for the entire sequence. */ \ - ch = ch << 3 | cnt; \ + state->__count |= cnt << 8; \ \ /* Store the value. */ \ state->__value.__wch = ch; \ @@ -1091,10 +1091,9 @@ ucs4le_internal_loop_single (struct __gconv_step *step, { \ static const unsigned char inmask[5] = { 0xc0, 0xe0, 0xf0, 0xf8, 0xfc }; \ wint_t wch = state->__value.__wch; \ - size_t ntotal = wch & 7; \ - wch >>= 3; \ + size_t ntotal = state->__count >> 8; \ \ - inlen = state->__count; \ + inlen = state->__count & 255; \ \ bytebuf[0] = inmask[ntotal - 2]; \ \ @@ -1109,6 +1108,10 @@ ucs4le_internal_loop_single (struct __gconv_step *step, bytebuf[0] |= wch; \ } +#define CLEAR_STATE \ + state->__count = 0 + + #include #include diff --git a/iconv/loop.c b/iconv/loop.c index b0b76f3..d792f4a 100644 --- a/iconv/loop.c +++ b/iconv/loop.c @@ -1,5 +1,5 @@ /* Conversion loop frame work. - Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1998-2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -428,7 +428,11 @@ SINGLE(LOOPFCT) (struct __gconv_step *step, result = __GCONV_OK; /* Clear the state buffer. */ +#ifdef CLEAR_STATE + CLEAR_STATE; +#else state->__count &= ~7; +#endif } else if (result == __GCONV_INCOMPLETE_INPUT) { @@ -479,6 +483,7 @@ gconv_btowc (struct __gconv_step *step, unsigned char c) #undef UPDATE_PARAMS #undef ONEBYTE_BODY #undef UNPACK_BYTES +#undef CLEAR_STATE #undef LOOP_NEED_STATE #undef LOOP_NEED_FLAGS #undef LOOP_NEED_DATA