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