diff options
author | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-07-09 15:05:36 +0000 |
---|---|---|
committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-07-09 15:05:36 +0000 |
commit | a691312d8794d5516402bb6bb0d3e90c40ba188b (patch) | |
tree | dcac242fcad7d24a4f452722de26c56cfaf8c98a /test/locale/tst-langinfo.c | |
parent | 56df95fe5d0778352abe09225d6587b88643d135 (diff) |
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 <filippo.arcidiacono@st.com>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Diffstat (limited to 'test/locale/tst-langinfo.c')
-rw-r--r-- | test/locale/tst-langinfo.c | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/test/locale/tst-langinfo.c b/test/locale/tst-langinfo.c new file mode 100644 index 000000000..e95f0da53 --- /dev/null +++ b/test/locale/tst-langinfo.c @@ -0,0 +1,284 @@ +/* Test program for nl_langinfo() function. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>. + + 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. */ + +#include <langinfo.h> +#include <locale.h> +#include <stdio.h> +#include <string.h> + + +struct map +{ + const char *str; + int val; +} map[] = +{ +#define VAL(name) { #name, name } + VAL (ABDAY_1), + VAL (ABDAY_2), + VAL (ABDAY_3), + VAL (ABDAY_4), + VAL (ABDAY_5), + VAL (ABDAY_6), + VAL (ABDAY_7), + VAL (ABMON_1), + VAL (ABMON_10), + VAL (ABMON_11), + VAL (ABMON_12), + VAL (ABMON_2), + VAL (ABMON_3), + VAL (ABMON_4), + VAL (ABMON_5), + VAL (ABMON_6), + VAL (ABMON_7), + VAL (ABMON_8), + VAL (ABMON_9), + VAL (ALT_DIGITS), + VAL (AM_STR), + VAL (CRNCYSTR), + VAL (CURRENCY_SYMBOL), + VAL (DAY_1), + VAL (DAY_2), + VAL (DAY_3), + VAL (DAY_4), + VAL (DAY_5), + VAL (DAY_6), + VAL (DAY_7), + VAL (DECIMAL_POINT), + VAL (D_FMT), + VAL (D_T_FMT), + VAL (ERA), + VAL (ERA_D_FMT), + VAL (ERA_D_T_FMT), + VAL (ERA_T_FMT), + VAL (ERA_YEAR), + VAL (FRAC_DIGITS), + VAL (GROUPING), + VAL (INT_CURR_SYMBOL), + VAL (INT_FRAC_DIGITS), + VAL (MON_1), + VAL (MON_10), + VAL (MON_11), + VAL (MON_12), + VAL (MON_2), + VAL (MON_3), + VAL (MON_4), + VAL (MON_5), + VAL (MON_6), + VAL (MON_7), + VAL (MON_8), + VAL (MON_9), + VAL (MON_DECIMAL_POINT), + VAL (MON_GROUPING), + VAL (MON_THOUSANDS_SEP), + VAL (NEGATIVE_SIGN), + VAL (NOEXPR), + VAL (NOSTR), + VAL (N_CS_PRECEDES), + VAL (N_SEP_BY_SPACE), + VAL (N_SIGN_POSN), + VAL (PM_STR), + VAL (POSITIVE_SIGN), + VAL (P_CS_PRECEDES), + VAL (P_SEP_BY_SPACE), + VAL (P_SIGN_POSN), + VAL (RADIXCHAR), + VAL (THOUSANDS_SEP), + VAL (THOUSEP), + VAL (T_FMT), + VAL (T_FMT_AMPM), + VAL (YESEXPR), + VAL (YESSTR) +}; + + +static int +map_paramstr (const char *str) +{ + int low = 0; + int high = sizeof (map) / sizeof (map[0]); + + while (low < high) + { + int med = (low + high) / 2; + int cmpres; + + cmpres = strcmp (str, map[med].str); + if (cmpres == 0) + return map[med].val; + else if (cmpres > 0) + low = med + 1; + else + high = med; + } + + return -1; +} + + +#ifdef DEBUG +# define REASON(str) printf ("\"%s\" ignored: %s\n", buf, str) +#else +# define REASON(str) +#endif + +int +main (void) +{ + int result = 0; + + while (! feof (stdin)) + { + char buf[1000]; + char *rp; + char *locale; + char *paramstr; + char *expected; + char *actual; + int param; + + if (fgets (buf, sizeof (buf), stdin) == NULL) + break; + + /* Split the fields. There are three is them: + 1. locale + 2. langinfo() parameter + 3. expected result; this can be a string with white space etc. + */ + rp = buf; + while (*rp == ' ' || *rp == '\t') + ++rp; + + if (*rp == '#') + { + /* It's a comment line. Ignore it. */ + REASON ("comment"); + continue; + } + locale = rp; + + while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n') + ++rp; + if (*rp == '\0' || *rp == '\n') + { + /* Incomplete line. */ + REASON ("incomplete line"); + continue; + } + *rp++ = '\0'; + + while (*rp == ' ' || *rp == '\t') + ++rp; + paramstr = rp; + + while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n') + ++rp; + if (*rp == '\0' || *rp == '\n') + { + /* Incomplete line. */ + REASON ("incomplete line"); + continue; + } + *rp++ = '\0'; + + while (*rp == ' ' || *rp == '\t') + ++rp; + + if (*rp == '"') + { + char *wp; + + expected = wp = ++rp; + while (*rp != '"' && *rp != '\n' && *rp != '\0') + { + if (*rp == '\\') + { + ++rp; + if (*rp == '\0') + break; + if (*rp >= '0' && *rp <= '9') + { + int val = *rp - '0'; + if (rp[1] >= '0' && rp[1] <= '9') + { + ++rp; + val *= 10; + val += *rp - '0'; + if (rp[1] >= '0' && rp[1] <= '9') + { + ++rp; + val *= 10; + val += *rp - '0'; + } + } + *rp = val; + } + } + *wp++ = *rp++; + } + + if (*rp != '"') + { + REASON ("missing '\"'"); + continue; + } + + *wp = '\0'; + } + else + { + expected = rp; + while (*rp != '\0' && *rp != '\n') + ++rp; + *rp = '\0'; + } + + param = map_paramstr (paramstr); + if (param == -1) + { + /* Invalid parameter. */ + REASON ("invalid parameter"); + continue; + } + + /* Set the locale and check whether it worked. */ + printf ("LC_ALL=%s nl_langinfo(%s)", locale, paramstr); + setlocale (LC_ALL, locale); + if (strcmp (locale, setlocale (LC_ALL, NULL)) != 0) + { + puts (": failed to set locale"); + result = 1; + continue; + } + + actual = nl_langinfo (param); + printf (" = \"%s\", ", actual); + + if (strcmp (actual, expected) == 0) + puts ("OK"); + else + { + printf ("FAILED (expected: %s)\n", expected); + result = 1; + } + } + + return result; +} |