Added tests, exposing problems in wcsrtombs() and mbsrtowcs().

This commit is contained in:
Oliver Tappe 2011-12-12 17:14:02 +01:00
parent 0ad71bca30
commit 8057318361
2 changed files with 105 additions and 12 deletions

View File

@ -33,6 +33,62 @@ int main(int argc, char *argv[])
wchar_t wc;
size_t ret;
int mode;
wchar_t buf[BUFSIZE];
const char *src;
mbstate_t temp_state;
printf("POSIX ...\n");
{
char input[] = "Buesser";
char isoInput[] = "B\374\337er"; /* "Büßer" */
memset(&state, '\0', sizeof(mbstate_t));
{
size_t i;
for (i = 0; i < BUFSIZE; i++)
buf[i] = (wchar_t) 0xBADFACE;
}
wc = (wchar_t) 0xBADFACE;
ret = mbrtowc(&wc, input, 1, &state);
assert(ret == 1);
assert(wc == 'B');
assert(mbsinit (&state));
input[0] = '\0';
wc = (wchar_t) 0xBADFACE;
ret = mbrtowc(&wc, input + 1, 1, &state);
assert(ret == 1);
assert(wctob (wc) == (unsigned char) 'u');
assert(mbsinit (&state));
input[1] = '\0';
src = input + 2;
temp_state = state;
ret = mbsrtowcs(NULL, &src, BUFSIZE, &temp_state);
assert(ret == 5);
assert(src == input + 2);
assert(mbsinit (&state));
src = input + 2;
ret = mbsrtowcs(buf, &src, BUFSIZE, &state);
assert(ret == 5);
assert(src == NULL);
assert(wctob (buf[0]) == (unsigned char) 'e');
assert(buf[1] == 's');
assert(buf[2] == 's');
assert(buf[3] == 'e');
assert(buf[4] == 'r');
assert(buf[5] == 0);
assert(buf[6] == (wchar_t) 0xBADFACE);
assert(mbsinit (&state));
src = isoInput;
ret = mbsrtowcs(buf, &src, BUFSIZE, &state);
assert(ret == (size_t)-1);
assert(src == isoInput + 1);
}
/* configure should already have checked that the locale is supported. */
if (setlocale(LC_ALL, "") == NULL) {
@ -74,10 +130,6 @@ int main(int argc, char *argv[])
for (mode = '1'; mode <= '4'; ++mode) {
int unlimited;
for (unlimited = 0; unlimited < 2; unlimited++) {
wchar_t buf[BUFSIZE];
const char *src;
mbstate_t temp_state;
{
size_t i;
for (i = 0; i < BUFSIZE; i++)
@ -141,6 +193,7 @@ int main(int argc, char *argv[])
printf("UTF-8 ...\n");
{
char input[] = "B\303\274\303\237er"; /* "Büßer" */
char isoInput[] = "B\374\337er"; /* "Büßer" */
memset(&state, '\0', sizeof(mbstate_t));
if (setlocale (LC_ALL, "en_US.UTF-8") == NULL) {
@ -189,6 +242,11 @@ int main(int argc, char *argv[])
} else
assert(buf[2] == (wchar_t) 0xBADFACE);
assert(mbsinit (&state));
src = isoInput;
ret = mbsrtowcs(buf, &src, BUFSIZE, &state);
assert(ret == (size_t)-1);
assert(src == isoInput + 1);
}
break;

View File

@ -33,14 +33,7 @@ main (int argc, char *argv[])
{
int mode;
/* configure should already have checked that the locale is supported. */
if (setlocale(LC_ALL, "") == NULL)
{
fprintf(stderr, "unable to set standard locale\n");
return 1;
}
for (mode = '1'; mode <= '4'; ++mode)
for (mode = '0'; mode <= '4'; ++mode)
{
wchar_t input[10];
size_t n;
@ -56,6 +49,42 @@ main (int argc, char *argv[])
switch (mode)
{
case '0':
/* Locale encoding is POSIX */
printf("POSIX ...\n");
{
const char original[] = "Buesser";
ret = mbstowcs (input, original, 10);
assert(ret == 7);
for (n = 0; n < 10; n++)
{
src = input;
ret = wcsrtombs (NULL, &src, n, NULL);
assert(ret == 7);
assert(src == input);
src = input;
ret = wcsrtombs (buf, &src, n, NULL);
assert(ret == (n <= 7 ? n : 7));
assert(src == (n <= 7 ? input + n : NULL));
assert(memcmp (buf, original, ret) == 0);
if (src == NULL)
assert(buf[ret] == '\0');
assert(buf[ret + (src == NULL) + 0] == '_');
assert(buf[ret + (src == NULL) + 1] == '_');
assert(buf[ret + (src == NULL) + 2] == '_');
}
input[2] = 0xDEADBEEFul;
src = input;
ret = wcsrtombs(buf, &src, BUFSIZE, NULL);
assert(ret == (size_t)-1);
assert(src == input + 2);
}
break;
case '1':
/* Locale encoding is ISO-8859-1 or ISO-8859-15. */
printf("ISO8859-1 ...\n");
@ -131,6 +160,12 @@ main (int argc, char *argv[])
assert(buf[ret + (src == NULL) + 1] == '_');
assert(buf[ret + (src == NULL) + 2] == '_');
}
input[2] = 0xDEADBEEFul;
src = input;
ret = wcsrtombs(buf, &src, BUFSIZE, NULL);
assert(ret == (size_t)-1);
assert(src == input + 2);
}
break;