Added tests, exposing problems in wcsrtombs() and mbsrtowcs().
This commit is contained in:
parent
0ad71bca30
commit
8057318361
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user