From a691312d8794d5516402bb6bb0d3e90c40ba188b Mon Sep 17 00:00:00 2001 From: Carmelo Amoroso Date: Wed, 9 Jul 2008 15:05:36 +0000 Subject: Added several tests for locale support (8 bit and multibyte UTF-8) Basically all tests have been taken from glibc. For testing multibyte encoding EUC_JP parts have been commented out and added new section for UTF-8 that is the only multibyte codeset currently supported on uCLibc. Some tests are still failing due to unsupported/missing features, other have been fixed. Signed-off-by: Filippo Arcidiacono Signed-off-by: Carmelo Amoroso --- test/locale/dump-ctype.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 test/locale/dump-ctype.c (limited to 'test/locale/dump-ctype.c') diff --git a/test/locale/dump-ctype.c b/test/locale/dump-ctype.c new file mode 100644 index 000000000..a1f24c656 --- /dev/null +++ b/test/locale/dump-ctype.c @@ -0,0 +1,164 @@ +/* Dump the character classes and character maps of a locale to a bunch + of individual files which can be processed with diff, sed etc. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Bruno Haible , 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Usage example: + $ dump-ctype de_DE.UTF-8 + */ + +#include +#include +#include +#include +#include +#include +#include + +static const char *program_name = "dump-ctype"; +static const char *locale; + +static const char *class_names[] = + { + "alnum", "alpha", "blank", "cntrl", "digit", "graph", "lower", + "print", "punct", "space", "upper", "xdigit" + }; + +static const char *map_names[] = + { + "tolower", "toupper", "totitle" + }; + +static void dump_class (const char *class_name) +{ + wctype_t class; + FILE *f; + unsigned int ch; + + class = wctype (class_name); + if (class == (wctype_t) 0) + { + fprintf (stderr, "%s %s: noexistent class %s\n", program_name, + locale, class_name); + return; + } + + f = fopen (class_name, "w"); + if (f == NULL) + { + fprintf (stderr, "%s %s: cannot open file %s/%s\n", program_name, + locale, locale, class_name); + exit (1); + } + + for (ch = 0; ch < 0x10000; ch++) + if (iswctype (ch, class)) + fprintf (f, "0x%04X\n", ch); + + if (ferror (f) || fclose (f)) + { + fprintf (stderr, "%s %s: I/O error on file %s/%s\n", program_name, + locale, locale, class_name); + exit (1); + } +} + +static void dump_map (const char *map_name) +{ + wctrans_t map; + FILE *f; + unsigned int ch; + + map = wctrans (map_name); + if (map == (wctrans_t) 0) + { + fprintf (stderr, "%s %s: noexistent map %s\n", program_name, + locale, map_name); + return; + } + + f = fopen (map_name, "w"); + if (f == NULL) + { + fprintf (stderr, "%s %s: cannot open file %s/%s\n", program_name, + locale, locale, map_name); + exit (1); + } + + for (ch = 0; ch < 0x10000; ch++) + if (towctrans (ch, map) != ch) + fprintf (f, "0x%04X\t0x%04X\n", ch, towctrans (ch, map)); + + if (ferror (f) || fclose (f)) + { + fprintf (stderr, "%s %s: I/O error on file %s/%s\n", program_name, + locale, locale, map_name); + exit (1); + } +} + +int +main (int argc, char *argv[]) +{ + size_t i; + + if (argc != 2) + { + fprintf (stderr, "Usage: dump-ctype locale\n"); + exit (1); + } + locale = argv[1]; + + if (setlocale (LC_ALL, locale) == NULL) + { + fprintf (stderr, "%s: setlocale cannot switch to locale %s\n", + program_name, locale); + exit (1); + } + + if (mkdir (locale, 0777) < 0) + { + char buf[100]; + int save_errno = errno; + + sprintf (buf, "%s: cannot create directory %s", program_name, locale); + errno = save_errno; + perror (buf); + exit (1); + } + + if (chdir (locale) < 0) + { + char buf[100]; + int save_errno = errno; + + sprintf (buf, "%s: cannot chdir to %s", program_name, locale); + errno = save_errno; + perror (buf); + exit (1); + } + + for (i = 0; i < sizeof (class_names) / sizeof (class_names[0]); i++) + dump_class (class_names[i]); + + for (i = 0; i < sizeof (map_names) / sizeof (map_names[0]); i++) + dump_map (map_names[i]); + + return 0; +} -- cgit v1.2.3