| #include <locale.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <wchar.h> |
| |
| |
| static int do_test (const char *loc); |
| |
| |
| int |
| main (void) |
| { |
| int result; |
| |
| result = do_test ("C"); |
| result |= do_test ("de_DE.ISO-8859-1"); |
| result |= do_test ("de_DE.UTF-8"); |
| result |= do_test ("ja_JP.EUC-JP"); |
| |
| return result; |
| } |
| |
| |
| static const struct |
| { |
| const wchar_t *fmt; |
| const wchar_t *wfmt; |
| const wchar_t *arg; |
| int retval; |
| const char *res; |
| const wchar_t *wres; |
| int only_C_locale; |
| } tests[] = |
| { |
| { L"%[abc]", L"%l[abc]", L"aabbccddaabb", 1 ,"aabbcc", L"aabbcc", 0 }, |
| { L"%[^def]", L"%l[^def]", L"aabbccddaabb", 1, "aabbcc", L"aabbcc", 0 }, |
| { L"%[^abc]", L"%l[^abc]", L"aabbccddaabb", 0, "", L"", 0 }, |
| { L"%[a-c]", L"%l[a-c]", L"aabbccddaabb", 1, "aabbcc", L"aabbcc", 1 }, |
| { L"%[^d-f]", L"%l[^d-f]", L"aabbccddaabb", 1, "aabbcc", L"aabbcc", 1 }, |
| { L"%[^a-c]", L"%l[^a-c]", L"aabbccddaabb", 0, "", L"", 1 }, |
| { L"%[^a-c]", L"%l[^a-c]", L"bbccddaabb", 0, "", L"", 1 } |
| }; |
| |
| |
| static int |
| do_test (const char *loc) |
| { |
| size_t n; |
| int result = 0; |
| |
| if (setlocale (LC_ALL, loc) == NULL) |
| { |
| printf ("cannot set locale \"%s\": %m\n", loc); |
| return 1; |
| } |
| |
| printf ("\nnew locale: \"%s\"\n", loc); |
| |
| for (n = 0; n < sizeof (tests) / sizeof (tests[0]); ++n) |
| { |
| char buf[100]; |
| wchar_t wbuf[100]; |
| |
| if (tests[n].only_C_locale && strcmp (loc, "C") != 0) |
| continue; |
| |
| if (swscanf (tests[n].arg, tests[n].fmt, buf) != tests[n].retval) |
| { |
| printf ("swscanf (\"%S\", \"%S\", ...) failed\n", |
| tests[n].arg, tests[n].fmt); |
| result = 1; |
| } |
| else if (tests[n].retval != 0 && strcmp (buf, tests[n].res) != 0) |
| { |
| printf ("swscanf (\"%S\", \"%S\", ...) return \"%s\", expected \"%s\"\n", |
| tests[n].arg, tests[n].fmt, buf, tests[n].res); |
| result = 1; |
| } |
| else |
| printf ("swscanf (\"%S\", \"%S\", ...) OK\n", |
| tests[n].arg, tests[n].fmt); |
| |
| if (swscanf (tests[n].arg, tests[n].wfmt, wbuf) != tests[n].retval) |
| { |
| printf ("swscanf (\"%S\", \"%S\", ...) failed\n", |
| tests[n].arg, tests[n].wfmt); |
| result = 1; |
| } |
| else if (tests[n].retval != 0 && wcscmp (wbuf, tests[n].wres) != 0) |
| { |
| printf ("swscanf (\"%S\", \"%S\", ...) return \"%S\", expected \"%S\"\n", |
| tests[n].arg, tests[n].wfmt, wbuf, tests[n].wres); |
| result = 1; |
| } |
| else |
| printf ("swscanf (\"%S\", \"%S\", ...) OK\n", |
| tests[n].arg, tests[n].wfmt); |
| } |
| |
| return result; |
| } |