Pass on comments from SCD.
[gnupg.git] / common / localename.c
1 /* localename.c - Determine the current selected locale.
2    Copyright (C) 1995-1999, 2000-2003, 2007, 
3                  2008 Free Software Foundation, Inc.
4
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public License
7    as published by the Free Software Foundation; either version 2.1,
8    or (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18 /* Written by Ulrich Drepper <drepper@gnu.org>, 1995.  */
19 /* Win32 code written by Tor Lillqvist <tml@iki.fi>.  */
20 /* Modified for GpgOL use by Werner Koch <wk@gnupg.org>, 2005.  */ 
21 /* Modified for GnuPG use by Werner Koch <wk@gnupg.org>, 2007 */
22
23 #ifdef HAVE_CONFIG_H
24 # include <config.h>
25 #endif
26
27 #include <stdlib.h>
28 #include <string.h>
29 #ifdef HAVE_LOCALE_H
30 #include <locale.h>
31 #endif
32 #include <gpg-error.h> /* We need gettext_localename for W32. */
33
34 #include "../common/w32help.h"
35
36 /* XPG3 defines the result of 'setlocale (category, NULL)' as:
37    "Directs 'setlocale()' to query 'category' and return the current
38     setting of 'local'."
39    However it does not specify the exact format.  Neither do SUSV2 and
40    ISO C 99.  So we can use this feature only on selected systems (e.g.
41    those using GNU C Library).  */
42 #if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2)
43 # define HAVE_LOCALE_NULL
44 #endif
45
46 /* Use a dummy value for LC_MESSAGES in case it is not defined.  This
47    works becuase we always test for HAVE_LC_MESSAGES and the core
48    fucntion takes the category as a string as well.  */
49 #ifndef HAVE_LC_MESSAGES
50 #define LC_MESSAGES 0
51 #endif
52
53
54 /* Determine the current locale's name, and canonicalize it into XPG syntax
55      language[_territory[.codeset]][@modifier]
56    The codeset part in the result is not reliable; the locale_charset()
57    should be used for codeset information instead.
58    The result must not be freed; it is statically allocated.  */
59
60 #ifndef HAVE_W32_SYSTEM
61 static const char *
62 do_nl_locale_name (int category, const char *categoryname)
63 {
64   const char *retval;
65
66   /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
67      On some systems this can be done by the 'setlocale' function itself.  */
68 # if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
69   (void)categoryname;
70   retval = setlocale (category, NULL);
71 # else 
72   /* Setting of LC_ALL overwrites all other.  */
73   retval = getenv ("LC_ALL");
74   if (retval == NULL || retval[0] == '\0')
75     {
76       /* Next comes the name of the desired category.  */
77       retval = getenv (categoryname);
78       if (retval == NULL || retval[0] == '\0')
79         {
80           /* Last possibility is the LANG environment variable.  */
81           retval = getenv ("LANG");
82           if (retval == NULL || retval[0] == '\0')
83             /* We use C as the default domain.  POSIX says this is
84                implementation defined.  */
85             retval = "C";
86         }
87     }
88 # endif
89
90   return retval;
91 }
92 #endif /* HAVE_W32_SYSTEM */
93
94
95
96 /* Return the locale used for translatable messages.  The standard C
97    and POSIX are locale names are mapped to an empty string.  If a
98    locale can't be found an empty string will be returned.  */
99 const char *
100 gnupg_messages_locale_name (void)
101 {
102   const char *s;
103
104 #ifdef HAVE_W32_SYSTEM
105   /* We use the localename function libgpg-error.  */
106   s = gettext_localename ();
107 #else
108   s = do_nl_locale_name (LC_MESSAGES, "LC_MESSAGES");
109 #endif
110   if (!s)
111     s = "";
112   else if (!strcmp (s, "C") || !strcmp (s, "POSIX"))
113     s = "";
114
115   return s;
116 }
117