| /* Copyright (C) 2000-2014 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])) |
| |
| |
| int |
| main (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; |
| } |