Line data Source code
1 : /* hard-locale.c -- Determine whether a locale is hard.
2 :
3 : Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004, 2006, 2007 Free
4 : Software 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 3 of the License, or
9 : (at your option) 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, see <http://www.gnu.org/licenses/>. */
18 :
19 : #include <config.h>
20 :
21 : #include "hard-locale.h"
22 :
23 : #include <locale.h>
24 : #include <stdlib.h>
25 : #include <string.h>
26 :
27 : #ifdef __GLIBC__
28 : # define GLIBC_VERSION __GLIBC__
29 : #else
30 : # define GLIBC_VERSION 0
31 : #endif
32 :
33 : /* Return true if the current CATEGORY locale is hard, i.e. if you
34 : can't get away with assuming traditional C or POSIX behavior. */
35 : bool
36 402 : hard_locale (int category)
37 : {
38 402 : bool hard = true;
39 402 : char const *p = setlocale (category, NULL);
40 :
41 402 : if (p)
42 : {
43 : if (2 <= GLIBC_VERSION)
44 : {
45 402 : if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
46 402 : hard = false;
47 : }
48 : else
49 : {
50 : char *locale = strdup (p);
51 : if (locale)
52 : {
53 : /* Temporarily set the locale to the "C" and "POSIX" locales
54 : to find their names, so that we can determine whether one
55 : or the other is the caller's locale. */
56 : if (((p = setlocale (category, "C"))
57 : && strcmp (p, locale) == 0)
58 : || ((p = setlocale (category, "POSIX"))
59 : && strcmp (p, locale) == 0))
60 : hard = false;
61 :
62 : /* Restore the caller's locale. */
63 : setlocale (category, locale);
64 : free (locale);
65 : }
66 : }
67 : }
68 :
69 402 : return hard;
70 : }
|