123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /* 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, see
- <http://www.gnu.org/licenses/>. */
- #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;
- }
|