|  | /* Copyright (C) 2000-2016 Free Software Foundation, Inc. | 
|  | This file is part of the GNU C Library. | 
|  | Contributed by Ulrich Drepper <drepper@gnu.org>, 2000. | 
|  |  | 
|  | The GNU C Library is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU Lesser General Public | 
|  | License as published by the Free Software Foundation; either | 
|  | version 2.1 of the License, or (at your option) any later version. | 
|  |  | 
|  | The GNU C Library is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | Lesser General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU Lesser General Public | 
|  | License along with the GNU C Library; if not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #include <ctype.h> | 
|  | #include <langinfo.h> | 
|  | #include <locale.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <unistd.h> | 
|  | #include <wchar.h> | 
|  | #include <wctype.h> | 
|  | #include <sys/types.h> | 
|  |  | 
|  |  | 
|  | #define ZERO  "\xe2\x82\x80" | 
|  | #define ONE   "\xe2\x82\x81" | 
|  | #define TWO   "\xe2\x82\x82" | 
|  | #define THREE "\xe2\x82\x83" | 
|  | #define FOUR  "\xe2\x82\x84" | 
|  | #define FIVE  "\xe2\x82\x85" | 
|  | #define SIX   "\xe2\x82\x86" | 
|  | #define SEVEN "\xe2\x82\x87" | 
|  | #define EIGHT "\xe2\x82\x88" | 
|  | #define NINE  "\xe2\x82\x89" | 
|  |  | 
|  | static struct printf_int_test | 
|  | { | 
|  | int n; | 
|  | const char *format; | 
|  | const char *expected; | 
|  | } printf_int_tests[] = | 
|  | { | 
|  | {       0, "%I'10d", "       " ZERO }, | 
|  | {       1, "%I'10d", "       " ONE }, | 
|  | {       2, "%I'10d", "       " TWO }, | 
|  | {       3, "%I'10d", "       " THREE }, | 
|  | {       4, "%I'10d", "       " FOUR }, | 
|  | {       5, "%I'10d", "       " FIVE }, | 
|  | {       6, "%I'10d", "       " SIX }, | 
|  | {       7, "%I'10d", "       " SEVEN }, | 
|  | {       8, "%I'10d", "       " EIGHT }, | 
|  | {       9, "%I'10d", "       " NINE }, | 
|  | {      11, "%I'10d", "    " ONE ONE }, | 
|  | {      12, "%I'10d", "    " ONE TWO }, | 
|  | {     123, "%I10d",  " " ONE TWO THREE }, | 
|  | {     123, "%I'10d", " " ONE TWO THREE }, | 
|  | {    1234, "%I10d",  ONE TWO THREE FOUR }, | 
|  | {    1234, "%I'10d", ONE "," TWO THREE FOUR }, | 
|  | {   12345, "%I'10d", ONE TWO "," THREE FOUR FIVE }, | 
|  | {  123456, "%I'10d", ONE TWO THREE "," FOUR FIVE SIX }, | 
|  | { 1234567, "%I'10d", ONE "," TWO THREE FOUR "," FIVE SIX SEVEN } | 
|  | }; | 
|  | #define nprintf_int_tests \ | 
|  | (sizeof (printf_int_tests) / sizeof (printf_int_tests[0])) | 
|  |  | 
|  | #define WZERO  L"\x2080" | 
|  | #define WONE   L"\x2081" | 
|  | #define WTWO   L"\x2082" | 
|  | #define WTHREE L"\x2083" | 
|  | #define WFOUR  L"\x2084" | 
|  | #define WFIVE  L"\x2085" | 
|  | #define WSIX   L"\x2086" | 
|  | #define WSEVEN L"\x2087" | 
|  | #define WEIGHT L"\x2088" | 
|  | #define WNINE  L"\x2089" | 
|  |  | 
|  | static struct wprintf_int_test | 
|  | { | 
|  | int n; | 
|  | const wchar_t *format; | 
|  | const wchar_t *expected; | 
|  | } wprintf_int_tests[] = | 
|  | { | 
|  | {       0, L"%I'10d", L"         " WZERO }, | 
|  | {       1, L"%I'10d", L"         " WONE }, | 
|  | {       2, L"%I'10d", L"         " WTWO }, | 
|  | {       3, L"%I'10d", L"         " WTHREE }, | 
|  | {       4, L"%I'10d", L"         " WFOUR }, | 
|  | {       5, L"%I'10d", L"         " WFIVE }, | 
|  | {       6, L"%I'10d", L"         " WSIX }, | 
|  | {       7, L"%I'10d", L"         " WSEVEN }, | 
|  | {       8, L"%I'10d", L"         " WEIGHT }, | 
|  | {       9, L"%I'10d", L"         " WNINE }, | 
|  | {      11, L"%I'10d", L"        " WONE WONE }, | 
|  | {      12, L"%I'10d", L"        " WONE WTWO }, | 
|  | {     123, L"%I10d",  L"       " WONE WTWO WTHREE }, | 
|  | {     123, L"%I'10d", L"       " WONE WTWO WTHREE }, | 
|  | {    1234, L"%I10d",  L"      " WONE WTWO WTHREE WFOUR }, | 
|  | {    1234, L"%I'10d", L"     " WONE L"," WTWO WTHREE WFOUR }, | 
|  | {   12345, L"%I'10d", L"    " WONE WTWO L"," WTHREE WFOUR WFIVE }, | 
|  | {  123456, L"%I'10d", L"   " WONE WTWO WTHREE L"," WFOUR WFIVE WSIX }, | 
|  | { 1234567, L"%I'10d", L" " WONE L"," WTWO WTHREE WFOUR L"," WFIVE WSIX WSEVEN } | 
|  | }; | 
|  | #define nwprintf_int_tests \ | 
|  | (sizeof (wprintf_int_tests) / sizeof (wprintf_int_tests[0])) | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | int cnt; | 
|  | int failures; | 
|  | int status; | 
|  |  | 
|  | if (setlocale (LC_ALL, "test7") == NULL) | 
|  | { | 
|  | puts ("cannot set locale `test7'"); | 
|  | exit (1); | 
|  | } | 
|  | printf ("CODESET = \"%s\"\n", nl_langinfo (CODESET)); | 
|  |  | 
|  | /* First: printf tests.  */ | 
|  | failures = 0; | 
|  | for (cnt = 0; cnt < (int) nprintf_int_tests; ++cnt) | 
|  | { | 
|  | char buf[100]; | 
|  | ssize_t n; | 
|  |  | 
|  | n = snprintf (buf, sizeof buf, printf_int_tests[cnt].format, | 
|  | printf_int_tests[cnt].n); | 
|  |  | 
|  | printf ("%3d: got \"%s\", expected \"%s\"", | 
|  | cnt, buf, printf_int_tests[cnt].expected); | 
|  |  | 
|  | if (n != (ssize_t) strlen (printf_int_tests[cnt].expected) | 
|  | || strcmp (buf, printf_int_tests[cnt].expected) != 0) | 
|  | { | 
|  | puts ("  -> FAILED"); | 
|  | ++failures; | 
|  | } | 
|  | else | 
|  | puts ("  -> OK"); | 
|  | } | 
|  |  | 
|  | printf ("%d failures in printf tests\n", failures); | 
|  | status = failures != 0; | 
|  |  | 
|  | /* wprintf tests.  */ | 
|  | failures = 0; | 
|  | for (cnt = 0; cnt < (int) nwprintf_int_tests; ++cnt) | 
|  | { | 
|  | wchar_t buf[100]; | 
|  | ssize_t n; | 
|  |  | 
|  | n = swprintf (buf, sizeof buf / sizeof (buf[0]), | 
|  | wprintf_int_tests[cnt].format, | 
|  | wprintf_int_tests[cnt].n); | 
|  |  | 
|  | printf ("%3d: got \"%ls\", expected \"%ls\"", | 
|  | cnt, buf, wprintf_int_tests[cnt].expected); | 
|  |  | 
|  | if (n != (ssize_t) wcslen (wprintf_int_tests[cnt].expected) | 
|  | || wcscmp (buf, wprintf_int_tests[cnt].expected) != 0) | 
|  | { | 
|  | puts ("  -> FAILED"); | 
|  | ++failures; | 
|  | } | 
|  | else | 
|  | puts ("  -> OK"); | 
|  | } | 
|  |  | 
|  | printf ("%d failures in wprintf tests\n", failures); | 
|  | status = failures != 0; | 
|  |  | 
|  | /* ctype tests.  This makes sure that the multibyte character digit | 
|  | representations are not handle in this table.  */ | 
|  | failures = 0; | 
|  | for (cnt = 0; cnt < 256; ++cnt) | 
|  | if (cnt >= '0' && cnt <= '9') | 
|  | { | 
|  | if (! isdigit (cnt)) | 
|  | { | 
|  | printf ("isdigit ('%c') == 0\n", cnt); | 
|  | ++failures; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | if (isdigit (cnt)) | 
|  | { | 
|  | printf ("isdigit (%d) != 0\n", cnt); | 
|  | ++failures; | 
|  | } | 
|  | } | 
|  |  | 
|  | printf ("%d failures in ctype tests\n", failures); | 
|  | status = failures != 0; | 
|  |  | 
|  | /* wctype tests.  This makes sure the second set of digits is also | 
|  | recorded.  */ | 
|  | failures = 0; | 
|  | for (cnt = 0; cnt < 256; ++cnt) | 
|  | if (cnt >= '0' && cnt <= '9') | 
|  | { | 
|  | if (! iswdigit (cnt)) | 
|  | { | 
|  | printf ("iswdigit (L'%c') == 0\n", cnt); | 
|  | ++failures; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | if (iswdigit (cnt)) | 
|  | { | 
|  | printf ("iswdigit (%d) != 0\n", cnt); | 
|  | ++failures; | 
|  | } | 
|  | } | 
|  |  | 
|  | for (cnt = 0x2070; cnt < 0x2090; ++cnt) | 
|  | if (cnt >= 0x2080 && cnt <= 0x2089) | 
|  | { | 
|  | if (! iswdigit (cnt)) | 
|  | { | 
|  | printf ("iswdigit (U%04X) == 0\n", cnt); | 
|  | ++failures; | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | if (iswdigit (cnt)) | 
|  | { | 
|  | printf ("iswdigit (U%04X) != 0\n", cnt); | 
|  | ++failures; | 
|  | } | 
|  | } | 
|  |  | 
|  | printf ("%d failures in wctype tests\n", failures); | 
|  | status = failures != 0; | 
|  |  | 
|  | return status; | 
|  | } | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |