/* 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;
}
