summaryrefslogtreecommitdiffstats
path: root/gl/nl_langinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'gl/nl_langinfo.c')
-rw-r--r--gl/nl_langinfo.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/gl/nl_langinfo.c b/gl/nl_langinfo.c
new file mode 100644
index 00000000..e81c81e7
--- /dev/null
+++ b/gl/nl_langinfo.c
@@ -0,0 +1,260 @@
1/* nl_langinfo() replacement: query locale dependent information.
2
3 Copyright (C) 2007-2010 Free Software Foundation, Inc.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (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
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18#include <config.h>
19
20/* Specification. */
21#include <langinfo.h>
22
23#if REPLACE_NL_LANGINFO
24
25/* Override nl_langinfo with support for added nl_item values. */
26
27# include <locale.h>
28# include <string.h>
29
30# undef nl_langinfo
31
32char *
33rpl_nl_langinfo (nl_item item)
34{
35 switch (item)
36 {
37# if GNULIB_defined_CODESET
38 case CODESET:
39 {
40 const char *locale;
41 static char buf[2 + 10 + 1];
42
43 locale = setlocale (LC_CTYPE, NULL);
44 if (locale != NULL && locale[0] != '\0')
45 {
46 /* If the locale name contains an encoding after the dot, return
47 it. */
48 const char *dot = strchr (locale, '.');
49
50 if (dot != NULL)
51 {
52 const char *modifier;
53
54 dot++;
55 /* Look for the possible @... trailer and remove it, if any. */
56 modifier = strchr (dot, '@');
57 if (modifier == NULL)
58 return dot;
59 if (modifier - dot < sizeof (buf))
60 {
61 memcpy (buf, dot, modifier - dot);
62 buf [modifier - dot] = '\0';
63 return buf;
64 }
65 }
66 }
67 return "";
68 }
69# endif
70# if GNULIB_defined_ERA
71 case ERA:
72 /* The format is not standardized. In glibc it is a sequence of strings
73 of the form "direction:offset:start_date:end_date:era_name:era_format"
74 with an empty string at the end. */
75 return "";
76 case ERA_D_FMT:
77 /* The %Ex conversion in strftime behaves like %x if the locale does not
78 have an alternative time format. */
79 item = D_FMT;
80 break;
81 case ERA_D_T_FMT:
82 /* The %Ec conversion in strftime behaves like %c if the locale does not
83 have an alternative time format. */
84 item = D_T_FMT;
85 break;
86 case ERA_T_FMT:
87 /* The %EX conversion in strftime behaves like %X if the locale does not
88 have an alternative time format. */
89 item = T_FMT;
90 break;
91 case ALT_DIGITS:
92 /* The format is not standardized. In glibc it is a sequence of 10
93 strings, appended in memory. */
94 return "\0\0\0\0\0\0\0\0\0\0";
95# endif
96 default:
97 break;
98 }
99 return nl_langinfo (item);
100}
101
102#else
103
104/* Provide nl_langinfo from scratch. */
105
106# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
107
108/* Native Windows platforms. */
109
110# define WIN32_LEAN_AND_MEAN /* avoid including junk */
111# include <windows.h>
112
113# include <stdio.h>
114
115# else
116
117/* An old Unix platform without locales, such as Linux libc5 or BeOS. */
118
119# endif
120
121# include <locale.h>
122
123char *
124nl_langinfo (nl_item item)
125{
126 switch (item)
127 {
128 /* nl_langinfo items of the LC_CTYPE category */
129 case CODESET:
130# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
131 {
132 static char buf[2 + 10 + 1];
133
134 /* Woe32 has a function returning the locale's codepage as a number. */
135 sprintf (buf, "CP%u", GetACP ());
136 return buf;
137 }
138# elif defined __BEOS__
139 return "UTF-8";
140# else
141 return "ISO-8859-1";
142# endif
143 /* nl_langinfo items of the LC_NUMERIC category */
144 case RADIXCHAR:
145 return localeconv () ->decimal_point;
146 case THOUSEP:
147 return localeconv () ->thousands_sep;
148 /* nl_langinfo items of the LC_TIME category.
149 TODO: Really use the locale. */
150 case D_T_FMT:
151 case ERA_D_T_FMT:
152 return "%a %b %e %H:%M:%S %Y";
153 case D_FMT:
154 case ERA_D_FMT:
155 return "%m/%d/%y";
156 case T_FMT:
157 case ERA_T_FMT:
158 return "%H:%M:%S";
159 case T_FMT_AMPM:
160 return "%I:%M:%S %p";
161 case AM_STR:
162 return "AM";
163 case PM_STR:
164 return "PM";
165 case DAY_1:
166 return "Sunday";
167 case DAY_2:
168 return "Monday";
169 case DAY_3:
170 return "Tuesday";
171 case DAY_4:
172 return "Wednesday";
173 case DAY_5:
174 return "Thursday";
175 case DAY_6:
176 return "Friday";
177 case DAY_7:
178 return "Saturday";
179 case ABDAY_1:
180 return "Sun";
181 case ABDAY_2:
182 return "Mon";
183 case ABDAY_3:
184 return "Tue";
185 case ABDAY_4:
186 return "Wed";
187 case ABDAY_5:
188 return "Thu";
189 case ABDAY_6:
190 return "Fri";
191 case ABDAY_7:
192 return "Sat";
193 case MON_1:
194 return "January";
195 case MON_2:
196 return "February";
197 case MON_3:
198 return "March";
199 case MON_4:
200 return "April";
201 case MON_5:
202 return "May";
203 case MON_6:
204 return "June";
205 case MON_7:
206 return "July";
207 case MON_8:
208 return "August";
209 case MON_9:
210 return "September";
211 case MON_10:
212 return "October";
213 case MON_11:
214 return "November";
215 case MON_12:
216 return "December";
217 case ABMON_1:
218 return "Jan";
219 case ABMON_2:
220 return "Feb";
221 case ABMON_3:
222 return "Mar";
223 case ABMON_4:
224 return "Apr";
225 case ABMON_5:
226 return "May";
227 case ABMON_6:
228 return "Jun";
229 case ABMON_7:
230 return "Jul";
231 case ABMON_8:
232 return "Aug";
233 case ABMON_9:
234 return "Sep";
235 case ABMON_10:
236 return "Oct";
237 case ABMON_11:
238 return "Nov";
239 case ABMON_12:
240 return "Dec";
241 case ERA:
242 return "";
243 case ALT_DIGITS:
244 return "\0\0\0\0\0\0\0\0\0\0";
245 /* nl_langinfo items of the LC_MONETARY category
246 TODO: Really use the locale. */
247 case CRNCYSTR:
248 return "-";
249 /* nl_langinfo items of the LC_MESSAGES category
250 TODO: Really use the locale. */
251 case YESEXPR:
252 return "^[yY]";
253 case NOEXPR:
254 return "^[nN]";
255 default:
256 return "";
257 }
258}
259
260#endif