* 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.
This commit is contained in:
Ulrich Drepper 2000-06-28 21:46:28 +00:00
parent 777e222ddb
commit f1f1b6b95a
6 changed files with 35 additions and 14 deletions

View file

@ -1,5 +1,15 @@
2000-06-28 Ulrich Drepper <drepper@redhat.com>
* 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.

View file

@ -1,5 +1,10 @@
2000-06-28 Ulrich Drepper <drepper@redhat.com>
* 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.

View file

@ -85,9 +85,7 @@ TST_MBRLEN tst_mbrlen_loc [] = {
{
{
{ 1, 0, 1, 0, },
/* <WAIVER_? x 2> assuming ascii */
{ 1, EILSEQ, 1, -1, },
/* <WAIVER_? x 2> 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, },
/* <WAIVER_?> returned -2 */
{ 1, 0, 1, 0, },
/* <WAIVER_?> returned 1 */
{ 1, 0, 1, 2, },
}
}
@ -127,8 +129,13 @@ TST_MBRLEN tst_mbrlen_loc [] = {
{
{
{ 1, 0, 1, -2, },
/* <WAIVER_?> 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, },
}
}

View file

@ -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;

View file

@ -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

View file

@ -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. */