| 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 intmap_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)#endifintmain (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;}
 |