diff options
Diffstat (limited to 'localedata/tst-langinfo.c')
-rw-r--r-- | localedata/tst-langinfo.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/localedata/tst-langinfo.c b/localedata/tst-langinfo.c new file mode 100644 index 0000000..f287688 --- /dev/null +++ b/localedata/tst-langinfo.c @@ -0,0 +1,263 @@ +#include <langinfo.h> +#include <locale.h> +#include <stdio.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 <= 'p') + { + 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; +} |