Home | History | Annotate | Download | only in lib
      1 /* hard-locale.c -- Determine whether a locale is hard.
      2 
      3    Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004 Free Software
      4    Foundation, Inc.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 2, or (at your option)
      9    any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software Foundation,
     18    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
     19 
     20 #ifdef HAVE_CONFIG_H
     21 # include <config.h>
     22 #endif
     23 
     24 #include "hard-locale.h"
     25 
     26 #include <locale.h>
     27 #include <stdlib.h>
     28 #include <string.h>
     29 
     30 #include "strdup.h"
     31 
     32 #ifdef __GLIBC__
     33 # define GLIBC_VERSION __GLIBC__
     34 #else
     35 # define GLIBC_VERSION 0
     36 #endif
     37 
     38 /* Return true if the current CATEGORY locale is hard, i.e. if you
     39    can't get away with assuming traditional C or POSIX behavior.  */
     40 bool
     41 hard_locale (int category)
     42 {
     43   bool hard = true;
     44   char const *p = setlocale (category, NULL);
     45 
     46   if (p)
     47     {
     48       if (2 <= GLIBC_VERSION)
     49 	{
     50 	  if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
     51 	    hard = false;
     52 	}
     53       else
     54 	{
     55 	  char *locale = strdup (p);
     56 	  if (locale)
     57 	    {
     58 	      /* Temporarily set the locale to the "C" and "POSIX" locales
     59 		 to find their names, so that we can determine whether one
     60 		 or the other is the caller's locale.  */
     61 	      if (((p = setlocale (category, "C"))
     62 		   && strcmp (p, locale) == 0)
     63 		  || ((p = setlocale (category, "POSIX"))
     64 		      && strcmp (p, locale) == 0))
     65 		hard = false;
     66 
     67 	      /* Restore the caller's locale.  */
     68 	      setlocale (category, locale);
     69 	      free (locale);
     70 	    }
     71 	}
     72     }
     73 
     74   return hard;
     75 }
     76