* iconv/loop.c: Use CLEAR_STATE if defined to clear __state element.
* 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 <aviro@redhat.com>.
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; \
{ \
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]; \
\
bytebuf[0] |= wch; \
}
+#define CLEAR_STATE \
+ state->__count = 0
+
+
#include <iconv/loop.c>
#include <iconv/skeleton.c>
/* 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 <drepper@cygnus.com>, 1998.
result = __GCONV_OK;
/* Clear the state buffer. */
+#ifdef CLEAR_STATE
+ CLEAR_STATE;
+#else
state->__count &= ~7;
+#endif
}
else if (result == __GCONV_INCOMPLETE_INPUT)
{
#undef UPDATE_PARAMS
#undef ONEBYTE_BODY
#undef UNPACK_BYTES
+#undef CLEAR_STATE
#undef LOOP_NEED_STATE
#undef LOOP_NEED_FLAGS
#undef LOOP_NEED_DATA