| /* Test program for nl_langinfo() function. | 
 |    Copyright (C) 2000-2016 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 | 
 |  | 
 | static int | 
 | do_test (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; | 
 | } | 
 |  | 
 | #define TEST_FUNCTION do_test () | 
 | #include "../test-skeleton.c" |