diff options
Diffstat (limited to 'wcsmbs')
-rw-r--r-- | wcsmbs/mbrtowc.c | 4 | ||||
-rw-r--r-- | wcsmbs/tst-mbrtowc.c | 103 |
2 files changed, 93 insertions, 14 deletions
diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c index 7c05680d91..8a24d18fe1 100644 --- a/wcsmbs/mbrtowc.c +++ b/wcsmbs/mbrtowc.c @@ -42,7 +42,6 @@ __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 = 0; /* Set information for this step. */ data.__invocation_counter = 0; @@ -58,7 +57,6 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) outbuf = (char *) buf; s = ""; n = 1; - flush = 1; } /* Tell where we want the result. */ @@ -72,7 +70,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, flush, 1)); + NULL, &dummy, 0, 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/tst-mbrtowc.c b/wcsmbs/tst-mbrtowc.c index 5b6a412d47..235a1c322a 100644 --- a/wcsmbs/tst-mbrtowc.c +++ b/wcsmbs/tst-mbrtowc.c @@ -27,24 +27,18 @@ static int check_ascii (const char *locname); -/* Test for mbrtowc, contributed by Markus Kuhn <mkuhn@acm.org>. */ +/* UTF-8 single byte feeding test for mbrtowc(), + contributed by Markus Kuhn <mkuhn@acm.org>. */ static int -utf8_test (void) +utf8_test_1 (void) { - /* UTF-8 single byte feeding test for mbrtowc(). */ wchar_t wc; mbstate_t s; - const char *locale = "de_DE.UTF-8"; - if (!setlocale (LC_CTYPE, locale)) - { - fprintf (stderr, "locale '%s' not available!\n", locale); - exit (1); - } wc = 42; /* arbitrary number */ memset (&s, 0, sizeof (s)); /* get s into initial state */ - assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) - 2); /* 1st byte processed */ - assert (mbrtowc (&wc, "\x89", 1, &s) == (size_t) - 2); /* 2nd byte processed */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (&wc, "\x89", 1, &s) == (size_t) -2); /* 2nd byte processed */ assert (wc == 42); /* no value has not been stored into &wc yet */ assert (mbrtowc (&wc, "\xA0", 1, &s) == 1); /* 3nd byte processed */ assert (wc == 0x2260); /* E2 89 A0 = U+2260 (not equal) decoded correctly */ @@ -54,6 +48,93 @@ utf8_test (void) return 0; } +/* Test for NUL byte processing via empty string. */ +static int +utf8_test_2 (void) +{ + wchar_t wc; + mbstate_t s; + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (NULL, "", 1, &s) == 0); /* valid terminator */ + assert (mbsinit (&s)); + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (NULL, "", 1, &s) == (size_t) -1); /* invalid terminator */ + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (&wc, "\x89", 1, &s) == (size_t) -2); /* 2nd byte processed */ + assert (mbrtowc (NULL, "", 1, &s) == (size_t) -1); /* invalid terminator */ + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (&wc, "\x89", 1, &s) == (size_t) -2); /* 2nd byte processed */ + assert (mbrtowc (&wc, "\xA0", 1, &s) == 1); /* 3nd byte processed */ + assert (mbrtowc (NULL, "", 1, &s) == 0); /* valid terminator */ + assert (mbsinit (&s)); + + return 0; +} + +/* Test for NUL byte processing via NULL string. */ +static int +utf8_test_3 (void) +{ + wchar_t wc; + mbstate_t s; + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (NULL, NULL, 0, &s) == 0); /* valid terminator */ + assert (mbsinit (&s)); + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (NULL, NULL, 0, &s) == (size_t) -1); /* invalid terminator */ + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (&wc, "\x89", 1, &s) == (size_t) -2); /* 2nd byte processed */ + assert (mbrtowc (NULL, NULL, 0, &s) == (size_t) -1); /* invalid terminator */ + + wc = 42; /* arbitrary number */ + memset (&s, 0, sizeof (s)); /* get s into initial state */ + assert (mbrtowc (&wc, "\xE2", 1, &s) == (size_t) -2); /* 1st byte processed */ + assert (mbrtowc (&wc, "\x89", 1, &s) == (size_t) -2); /* 2nd byte processed */ + assert (mbrtowc (&wc, "\xA0", 1, &s) == 1); /* 3nd byte processed */ + assert (mbrtowc (NULL, NULL, 0, &s) == 0); /* valid terminator */ + assert (mbsinit (&s)); + + return 0; +} + +static int +utf8_test (void) +{ + const char *locale = "de_DE.UTF-8"; + int error = 0; + + if (!setlocale (LC_CTYPE, locale)) + { + fprintf (stderr, "locale '%s' not available!\n", locale); + exit (1); + } + + error |= utf8_test_1 (); + error |= utf8_test_2 (); + error |= utf8_test_3 (); + + return error; +} + int main (void) |