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