diff --git a/ChangeLog b/ChangeLog index 3a73d1c53b..ef1d856bce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2000-06-28 Ulrich Drepper + * wcsmbs/mbrtowc.c: Set flush to 1 for conversion function calls + depending on whether the input string is empty or not. + + * wcsmbs/mbrtowc.c: Calling function without input means clearing the + given state and not avoiding this by modifying a local object. + * wcsmbs/wcrtomb.c: Likewise. + + * iconv/skeleton.c: If no EMIT_SHIFT_TO_INIT is defined clear state + object since some incomplete characters might be in there. + * iconvdata/euc-jp.c: In conversion to UCS4, handling invalid sequences with first by 0x8e correctly. diff --git a/localedata/ChangeLog b/localedata/ChangeLog index 1f61a85259..483038a784 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,5 +1,10 @@ 2000-06-28 Ulrich Drepper + * tests-mbwc/dat_mbrlen.c: Correct some tests. Remove old WAIVER + comments. + * tests-mbwc/tst_mbrlen.c: Enable code to respect t_ini. Also clear + internal state of mbrlen. + * Makefile (do-tst-ctype): Add do-tst-mbswcs to list of dependencies. (TEST_MBWC_ENV): Remove unnecessary slash. * tst-ctype.sh: Add de_DE.UTF-8 to list of tested locales. diff --git a/localedata/tests-mbwc/dat_mbrlen.c b/localedata/tests-mbwc/dat_mbrlen.c index f1f9e15294..8fdef8bf8a 100644 --- a/localedata/tests-mbwc/dat_mbrlen.c +++ b/localedata/tests-mbwc/dat_mbrlen.c @@ -85,9 +85,7 @@ TST_MBRLEN tst_mbrlen_loc [] = { { { { 1, 0, 1, 0, }, - /* assuming ascii */ { 1, EILSEQ, 1, -1, }, - /* assuming ascii */ { 1, EILSEQ, 1, -1, }, } } @@ -102,16 +100,20 @@ TST_MBRLEN tst_mbrlen_loc [] = { { { { 1, "\317\302", 1, 0, 0 }, +#ifdef SHOJI_IS_RIGHT { 0, "", 0, 0, 0 }, +#else + /* XXX This test depends on the internal state being empty. + XXX Therefore we must explicitly clean it. */ + { 0, "", 0, 0, 1 }, +#endif { 1, "\317\302", USE_MBCURMAX, 0, 0 }, } }, { { { 1, 0, 1, -2, }, - /* returned -2 */ { 1, 0, 1, 0, }, - /* returned 1 */ { 1, 0, 1, 2, }, } } @@ -127,8 +129,13 @@ TST_MBRLEN tst_mbrlen_loc [] = { { { { 1, 0, 1, -2, }, - /* returned -2 */ +#ifdef SHOJI_IS_RIGHT { 1, 0, 1, +2, }, +#else + /* XXX ISO C explicitly says that the return value does not + XXX reflect the bytes contained in the state. */ + { 1, 0, 1, +1, }, +#endif { 1, 0, 1, 2, }, } } diff --git a/localedata/tests-mbwc/tst_mbrlen.c b/localedata/tests-mbwc/tst_mbrlen.c index a067acb266..5b31d32149 100644 --- a/localedata/tests-mbwc/tst_mbrlen.c +++ b/localedata/tests-mbwc/tst_mbrlen.c @@ -53,12 +53,13 @@ tst_mbrlen (FILE * fp, int debug_flg) } ps = (t_flg == 0) ? NULL : &s; -#if 0 + if (t_ini != 0) { memset (&s, 0, sizeof (s)); + mbrlen (NULL, 0, NULL); } -#endif + TST_CLEAR_ERRNO; ret = mbrlen (s_in, n, ps); TST_SAVE_ERRNO; diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c index d78a38bd43..034ccfec41 100644 --- a/wcsmbs/mbrtowc.c +++ b/wcsmbs/mbrtowc.c @@ -35,7 +35,6 @@ static mbstate_t state; size_t __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) { - mbstate_t temp_state; wchar_t buf[1]; struct __gconv_step_data data; int status; @@ -43,6 +42,7 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) size_t dummy; const unsigned char *inbuf; char *outbuf = (char *) (pwc ?: buf); + int flush; /* Set information for this step. */ data.__invocation_counter = 0; @@ -58,9 +58,10 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) outbuf = (char *) buf; s = ""; n = 1; - temp_state = *data.__statep; - data.__statep = &temp_state; + flush = 1; } + else + flush = *s == '\0' ? 1 : 0; /* Tell where we want the result. */ data.__outbuf = outbuf; @@ -73,7 +74,7 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) inbuf = (const unsigned char *) s; status = DL_CALL_FCT (__wcsmbs_gconv_fcts.towc->__fct, (__wcsmbs_gconv_fcts.towc, &data, &inbuf, inbuf + n, - NULL, &dummy, 0, 1)); + NULL, &dummy, flush, 1)); /* There must not be any problems with the conversion but illegal input characters. The output buffer must be large enough, otherwise the diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c index ec75e579a4..ad0e0a98a1 100644 --- a/wcsmbs/wcrtomb.c +++ b/wcsmbs/wcrtomb.c @@ -37,7 +37,6 @@ static mbstate_t state; size_t __wcrtomb (char *s, wchar_t wc, mbstate_t *ps) { - mbstate_t temp_state; char buf[MB_CUR_MAX]; struct __gconv_step_data data; int status; @@ -57,8 +56,6 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps) { s = buf; wc = L'\0'; - temp_state = *data.__statep; - data.__statep = &temp_state; } /* Tell where we want to have the result. */