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.  */
40bool
41hard_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