| /* Test program for nl_langinfo() function. |
| Copyright (C) 2000-2014 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; |
| } |