|  | #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; | 
|  | } |