blob: 7f7bdd291c060d95c495885c1161df4ff11c14bf [file] [log] [blame]
Guido van Rossum220ecc81997-11-18 21:03:39 +00001/***********************************************************
Guido van Rossum239a2181998-04-28 16:08:19 +00002Copyright (C) 1997 Martin von Loewis
Guido van Rossum220ecc81997-11-18 21:03:39 +00003
4Permission to use, copy, modify, and distribute this software and its
5documentation for any purpose and without fee is hereby granted,
6provided that the above copyright notice appear in all copies.
7
8This software comes with no warranty. Use at your own risk.
Fredrik Lundh8f017a02000-07-08 19:57:37 +00009
Guido van Rossum220ecc81997-11-18 21:03:39 +000010******************************************************************/
11
Fred Drake68933b92000-08-10 21:41:08 +000012#include "Python.h"
13
Guido van Rossum220ecc81997-11-18 21:03:39 +000014#include <stdio.h>
15#include <errno.h>
16#include <locale.h>
17#include <string.h>
Guido van Rossum5cd70f41998-06-19 04:33:30 +000018#include <ctype.h>
Fredrik Lundh8f017a02000-07-08 19:57:37 +000019
Martin v. Löwis9b75dca2001-08-10 13:58:50 +000020#ifdef HAVE_LANGINFO_H
21#include <langinfo.h>
22#endif
23
Fredrik Lundh8f017a02000-07-08 19:57:37 +000024#if defined(MS_WIN32)
25#define WINDOWS_LEAN_AND_MEAN
26#include <windows.h>
Guido van Rossum239a2181998-04-28 16:08:19 +000027#endif
Guido van Rossum220ecc81997-11-18 21:03:39 +000028
Fredrik Lundh8f017a02000-07-08 19:57:37 +000029#ifdef macintosh
Jack Jansen307d7a42000-07-15 22:31:45 +000030#include "macglue.h"
Fredrik Lundh8f017a02000-07-08 19:57:37 +000031#endif
32
Guido van Rossum1ca8bb32001-03-02 06:28:17 +000033#ifdef RISCOS
34char *strdup(const char *);
35#endif
36
Fredrik Lundh8f017a02000-07-08 19:57:37 +000037static char locale__doc__[] = "Support for POSIX locales.";
Guido van Rossum220ecc81997-11-18 21:03:39 +000038
39static PyObject *Error;
40
41/* support functions for formatting floating point numbers */
42
Fredrik Lundh8f017a02000-07-08 19:57:37 +000043static char setlocale__doc__[] =
Guido van Rossum220ecc81997-11-18 21:03:39 +000044"(integer,string=None) -> string. Activates/queries locale processing."
45;
46
47/* to record the LC_NUMERIC settings */
Fredrik Lundh8f017a02000-07-08 19:57:37 +000048static PyObject* grouping = NULL;
49static PyObject* thousands_sep = NULL;
50static PyObject* decimal_point = NULL;
Guido van Rossum220ecc81997-11-18 21:03:39 +000051/* if non-null, indicates that LC_NUMERIC is different from "C" */
Fredrik Lundh8f017a02000-07-08 19:57:37 +000052static char* saved_numeric = NULL;
Guido van Rossum220ecc81997-11-18 21:03:39 +000053
54/* the grouping is terminated by either 0 or CHAR_MAX */
55static PyObject*
Fredrik Lundh8f017a02000-07-08 19:57:37 +000056copy_grouping(char* s)
Guido van Rossum220ecc81997-11-18 21:03:39 +000057{
Fredrik Lundh8f017a02000-07-08 19:57:37 +000058 int i;
59 PyObject *result, *val = NULL;
60
61 if (s[0] == '\0')
62 /* empty string: no grouping at all */
63 return PyList_New(0);
64
65 for (i = 0; s[i] != '\0' && s[i] != CHAR_MAX; i++)
66 ; /* nothing */
67
68 result = PyList_New(i+1);
69 if (!result)
70 return NULL;
71
72 i = -1;
73 do {
74 i++;
75 val = PyInt_FromLong(s[i]);
76 if (!val)
77 break;
78 if (PyList_SetItem(result, i, val)) {
79 Py_DECREF(val);
Fredrik Lundh89610a42000-07-08 20:07:24 +000080 val = NULL;
Fredrik Lundh8f017a02000-07-08 19:57:37 +000081 break;
82 }
83 } while (s[i] != '\0' && s[i] != CHAR_MAX);
84
85 if (!val) {
86 Py_DECREF(result);
87 return NULL;
Guido van Rossum220ecc81997-11-18 21:03:39 +000088 }
Fredrik Lundh8f017a02000-07-08 19:57:37 +000089
90 return result;
Guido van Rossum220ecc81997-11-18 21:03:39 +000091}
92
93static void
Fredrik Lundh8f017a02000-07-08 19:57:37 +000094fixup_ulcase(void)
Guido van Rossum220ecc81997-11-18 21:03:39 +000095{
Fredrik Lundh8f017a02000-07-08 19:57:37 +000096 PyObject *mods, *strop, *string, *ulo;
97 unsigned char ul[256];
98 int n, c;
Guido van Rossum220ecc81997-11-18 21:03:39 +000099
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000100 /* find the string and strop modules */
101 mods = PyImport_GetModuleDict();
102 if (!mods)
103 return;
104 string = PyDict_GetItemString(mods, "string");
105 if (string)
106 string = PyModule_GetDict(string);
107 strop=PyDict_GetItemString(mods, "strop");
108 if (strop)
109 strop = PyModule_GetDict(strop);
110 if (!string && !strop)
111 return;
112
113 /* create uppercase map string */
114 n = 0;
115 for (c = 0; c < 256; c++) {
116 if (isupper(c))
117 ul[n++] = c;
118 }
119 ulo = PyString_FromStringAndSize((const char *)ul, n);
Fredrik Lundh89610a42000-07-08 20:07:24 +0000120 if (!ulo)
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000121 return;
122 if (string)
123 PyDict_SetItemString(string, "uppercase", ulo);
124 if (strop)
125 PyDict_SetItemString(strop, "uppercase", ulo);
126 Py_DECREF(ulo);
127
128 /* create lowercase string */
129 n = 0;
130 for (c = 0; c < 256; c++) {
131 if (islower(c))
132 ul[n++] = c;
133 }
134 ulo = PyString_FromStringAndSize((const char *)ul, n);
135 if (!ulo)
136 return;
137 if (string)
138 PyDict_SetItemString(string, "lowercase", ulo);
139 if (strop)
140 PyDict_SetItemString(strop, "lowercase", ulo);
141 Py_DECREF(ulo);
142
143 /* create letters string */
144 n = 0;
145 for (c = 0; c < 256; c++) {
146 if (isalpha(c))
147 ul[n++] = c;
148 }
149 ulo = PyString_FromStringAndSize((const char *)ul, n);
150 if (!ulo)
151 return;
152 if (string)
153 PyDict_SetItemString(string, "letters", ulo);
154 Py_DECREF(ulo);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000155}
156
157
158static PyObject*
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000159PyLocale_setlocale(PyObject* self, PyObject* args)
Guido van Rossum220ecc81997-11-18 21:03:39 +0000160{
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000161 int category;
162 char *locale = NULL, *result;
163 PyObject *result_object;
164 struct lconv *lc;
Guido van Rossum220ecc81997-11-18 21:03:39 +0000165
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000166 if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale))
Fredrik Lundh89610a42000-07-08 20:07:24 +0000167 return NULL;
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000168
169 if (locale) {
170 /* set locale */
171 result = setlocale(category, locale);
172 if (!result) {
173 /* operation failed, no setting was changed */
174 PyErr_SetString(Error, "locale setting not supported");
175 return NULL;
176 }
177 result_object = PyString_FromString(result);
178 if (!result)
179 return NULL;
180 /* record changes to LC_NUMERIC */
181 if (category == LC_NUMERIC || category == LC_ALL) {
182 if (strcmp(locale, "C") == 0 || strcmp(locale, "POSIX") == 0) {
183 /* user just asked for default numeric locale */
184 if (saved_numeric)
185 free(saved_numeric);
186 saved_numeric = NULL;
187 } else {
188 /* remember values */
189 lc = localeconv();
190 Py_XDECREF(grouping);
191 grouping = copy_grouping(lc->grouping);
192 Py_XDECREF(thousands_sep);
193 thousands_sep = PyString_FromString(lc->thousands_sep);
194 Py_XDECREF(decimal_point);
195 decimal_point = PyString_FromString(lc->decimal_point);
196 saved_numeric = strdup(locale);
197 /* restore to "C" */
198 setlocale(LC_NUMERIC, "C");
199 }
200 }
201 /* record changes to LC_CTYPE */
202 if (category == LC_CTYPE || category == LC_ALL)
203 fixup_ulcase();
204 /* things that got wrong up to here are ignored */
205 PyErr_Clear();
206 } else {
207 /* get locale */
208 /* restore LC_NUMERIC first, if appropriate */
209 if (saved_numeric)
210 setlocale(LC_NUMERIC, saved_numeric);
211 result = setlocale(category, NULL);
212 if (!result) {
213 PyErr_SetString(Error, "locale query failed");
214 return NULL;
215 }
216 result_object = PyString_FromString(result);
217 /* restore back to "C" */
218 if (saved_numeric)
219 setlocale(LC_NUMERIC, "C");
Guido van Rossum220ecc81997-11-18 21:03:39 +0000220 }
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000221 return result_object;
Guido van Rossum220ecc81997-11-18 21:03:39 +0000222}
223
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000224static char localeconv__doc__[] =
Guido van Rossum220ecc81997-11-18 21:03:39 +0000225"() -> dict. Returns numeric and monetary locale-specific parameters."
226;
227
228static PyObject*
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000229PyLocale_localeconv(PyObject* self, PyObject* args)
Guido van Rossum220ecc81997-11-18 21:03:39 +0000230{
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000231 PyObject* result;
232 struct lconv *l;
233 PyObject *x;
234
235 if (!PyArg_NoArgs(args))
Fredrik Lundh89610a42000-07-08 20:07:24 +0000236 return NULL;
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000237
238 result = PyDict_New();
Fredrik Lundh89610a42000-07-08 20:07:24 +0000239 if (!result)
240 return NULL;
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000241
242 /* if LC_NUMERIC is different in the C library, use saved value */
243 l = localeconv();
244
245 /* hopefully, the localeconv result survives the C library calls
246 involved herein */
247
248#define RESULT_STRING(s)\
249 x = PyString_FromString(l->s);\
250 if (!x) goto failed;\
251 PyDict_SetItemString(result, #s, x);\
252 Py_XDECREF(x)
253
254#define RESULT_INT(i)\
255 x = PyInt_FromLong(l->i);\
256 if (!x) goto failed;\
257 PyDict_SetItemString(result, #i, x);\
258 Py_XDECREF(x)
Guido van Rossum220ecc81997-11-18 21:03:39 +0000259
260 /* Numeric information */
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000261 if (saved_numeric){
262 /* cannot use localeconv results */
263 PyDict_SetItemString(result, "decimal_point", decimal_point);
264 PyDict_SetItemString(result, "grouping", grouping);
265 PyDict_SetItemString(result, "thousands_sep", thousands_sep);
266 } else {
267 RESULT_STRING(decimal_point);
268 RESULT_STRING(thousands_sep);
269 x = copy_grouping(l->grouping);
270 if (!x)
271 goto failed;
272 PyDict_SetItemString(result, "grouping", x);
273 Py_XDECREF(x);
274 }
275
276 /* Monetary information */
277 RESULT_STRING(int_curr_symbol);
278 RESULT_STRING(currency_symbol);
279 RESULT_STRING(mon_decimal_point);
280 RESULT_STRING(mon_thousands_sep);
281 x = copy_grouping(l->mon_grouping);
282 if (!x)
283 goto failed;
284 PyDict_SetItemString(result, "mon_grouping", x);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000285 Py_XDECREF(x);
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000286 RESULT_STRING(positive_sign);
287 RESULT_STRING(negative_sign);
288 RESULT_INT(int_frac_digits);
289 RESULT_INT(frac_digits);
290 RESULT_INT(p_cs_precedes);
291 RESULT_INT(p_sep_by_space);
292 RESULT_INT(n_cs_precedes);
293 RESULT_INT(n_sep_by_space);
294 RESULT_INT(p_sign_posn);
295 RESULT_INT(n_sign_posn);
296 return result;
Guido van Rossum220ecc81997-11-18 21:03:39 +0000297
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000298 failed:
299 Py_XDECREF(result);
300 Py_XDECREF(x);
301 return NULL;
Guido van Rossum220ecc81997-11-18 21:03:39 +0000302}
303
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000304static char strcoll__doc__[] =
Guido van Rossum220ecc81997-11-18 21:03:39 +0000305"string,string -> int. Compares two strings according to the locale."
306;
307
308static PyObject*
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000309PyLocale_strcoll(PyObject* self, PyObject* args)
Guido van Rossum220ecc81997-11-18 21:03:39 +0000310{
311 char *s1,*s2;
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000312
313 if (!PyArg_ParseTuple(args, "ss:strcoll", &s1, &s2))
314 return NULL;
315 return PyInt_FromLong(strcoll(s1, s2));
Guido van Rossum220ecc81997-11-18 21:03:39 +0000316}
317
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000318static char strxfrm__doc__[] =
Guido van Rossum220ecc81997-11-18 21:03:39 +0000319"string -> string. Returns a string that behaves for cmp locale-aware."
320;
321
322static PyObject*
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000323PyLocale_strxfrm(PyObject* self, PyObject* args)
Guido van Rossum220ecc81997-11-18 21:03:39 +0000324{
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000325 char *s, *buf;
326 size_t n1, n2;
327 PyObject *result;
328
Fredrik Lundh89610a42000-07-08 20:07:24 +0000329 if (!PyArg_ParseTuple(args, "s:strxfrm", &s))
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000330 return NULL;
331
332 /* assume no change in size, first */
333 n1 = strlen(s) + 1;
334 buf = PyMem_Malloc(n1);
335 if (!buf)
336 return PyErr_NoMemory();
337 n2 = strxfrm(buf, s, n1);
338 if (n2 > n1) {
339 /* more space needed */
340 buf = PyMem_Realloc(buf, n2);
341 if (!buf)
342 return PyErr_NoMemory();
343 strxfrm(buf, s, n2);
344 }
345 result = PyString_FromString(buf);
346 PyMem_Free(buf);
347 return result;
Guido van Rossum220ecc81997-11-18 21:03:39 +0000348}
349
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000350#if defined(MS_WIN32)
351static PyObject*
352PyLocale_getdefaultlocale(PyObject* self, PyObject* args)
353{
354 char encoding[100];
355 char locale[100];
356
Fredrik Lundh89610a42000-07-08 20:07:24 +0000357 if (!PyArg_NoArgs(args))
358 return NULL;
359
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000360 sprintf(encoding, "cp%d", GetACP());
361
362 if (GetLocaleInfo(LOCALE_USER_DEFAULT,
363 LOCALE_SISO639LANGNAME,
364 locale, sizeof(locale))) {
365 int i = strlen(locale);
366 locale[i++] = '_';
367 if (GetLocaleInfo(LOCALE_USER_DEFAULT,
368 LOCALE_SISO3166CTRYNAME,
369 locale+i, sizeof(locale)-i))
370 return Py_BuildValue("ss", locale, encoding);
371 }
372
373 /* If we end up here, this windows version didn't know about
374 ISO639/ISO3166 names (it's probably Windows 95). Return the
375 Windows language identifier instead (a hexadecimal number) */
376
377 locale[0] = '0';
378 locale[1] = 'x';
379 if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTLANGUAGE,
380 locale+2, sizeof(locale)-2)) {
381 return Py_BuildValue("ss", locale, encoding);
382 }
383
384 /* cannot determine the language code (very unlikely) */
385 Py_INCREF(Py_None);
386 return Py_BuildValue("Os", Py_None, encoding);
387}
388#endif
389
Jack Jansen307d7a42000-07-15 22:31:45 +0000390#if defined(macintosh)
391static PyObject*
392PyLocale_getdefaultlocale(PyObject* self, PyObject* args)
393{
394 return Py_BuildValue("Os", Py_None, PyMac_getscript());
395}
396#endif
397
Martin v. Löwis9b75dca2001-08-10 13:58:50 +0000398#ifdef HAVE_LANGINFO_H
399static char nl_langinfo__doc__[] =
400"nl_langinfo(key) -> string\n"
401"Return the value for the locale information associated with key."
402;
403
404static PyObject*
405PyLocale_nl_langinfo(PyObject* self, PyObject* args)
406{
407 int item;
408 if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item))
409 return NULL;
410 return PyString_FromString(nl_langinfo(item));
411}
412#endif
413
414
Guido van Rossum220ecc81997-11-18 21:03:39 +0000415static struct PyMethodDef PyLocale_Methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000416 {"setlocale", (PyCFunction) PyLocale_setlocale,
417 METH_VARARGS, setlocale__doc__},
418 {"localeconv", (PyCFunction) PyLocale_localeconv,
419 0, localeconv__doc__},
420 {"strcoll", (PyCFunction) PyLocale_strcoll,
421 METH_VARARGS, strcoll__doc__},
422 {"strxfrm", (PyCFunction) PyLocale_strxfrm,
423 METH_VARARGS, strxfrm__doc__},
Jack Jansen307d7a42000-07-15 22:31:45 +0000424#if defined(MS_WIN32) || defined(macintosh)
Fredrik Lundh89610a42000-07-08 20:07:24 +0000425 {"_getdefaultlocale", (PyCFunction) PyLocale_getdefaultlocale, 0},
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000426#endif
Martin v. Löwis9b75dca2001-08-10 13:58:50 +0000427#ifdef HAVE_LANGINFO_H
428 {"nl_langinfo", (PyCFunction) PyLocale_nl_langinfo,
429 METH_VARARGS, nl_langinfo__doc__},
430#endif
431
Guido van Rossum220ecc81997-11-18 21:03:39 +0000432 {NULL, NULL}
433};
434
Guido van Rossum3886bb61998-12-04 18:50:17 +0000435DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000436init_locale(void)
Guido van Rossum220ecc81997-11-18 21:03:39 +0000437{
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000438 PyObject *m, *d, *x;
Guido van Rossum220ecc81997-11-18 21:03:39 +0000439
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000440 m = Py_InitModule("_locale", PyLocale_Methods);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000441
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000442 d = PyModule_GetDict(m);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000443
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000444 x = PyInt_FromLong(LC_CTYPE);
445 PyDict_SetItemString(d, "LC_CTYPE", x);
446 Py_XDECREF(x);
447
448 x = PyInt_FromLong(LC_TIME);
449 PyDict_SetItemString(d, "LC_TIME", x);
450 Py_XDECREF(x);
451
452 x = PyInt_FromLong(LC_COLLATE);
453 PyDict_SetItemString(d, "LC_COLLATE", x);
454 Py_XDECREF(x);
455
456 x = PyInt_FromLong(LC_MONETARY);
457 PyDict_SetItemString(d, "LC_MONETARY", x);
458 Py_XDECREF(x);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000459
Guido van Rossum8d9c2e31997-12-09 19:35:11 +0000460#ifdef LC_MESSAGES
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000461 x = PyInt_FromLong(LC_MESSAGES);
462 PyDict_SetItemString(d, "LC_MESSAGES", x);
463 Py_XDECREF(x);
Guido van Rossum8d9c2e31997-12-09 19:35:11 +0000464#endif /* LC_MESSAGES */
Guido van Rossum220ecc81997-11-18 21:03:39 +0000465
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000466 x = PyInt_FromLong(LC_NUMERIC);
467 PyDict_SetItemString(d, "LC_NUMERIC", x);
468 Py_XDECREF(x);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000469
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000470 x = PyInt_FromLong(LC_ALL);
471 PyDict_SetItemString(d, "LC_ALL", x);
472 Py_XDECREF(x);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000473
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000474 x = PyInt_FromLong(CHAR_MAX);
475 PyDict_SetItemString(d, "CHAR_MAX", x);
476 Py_XDECREF(x);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000477
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000478 Error = PyErr_NewException("locale.Error", NULL, NULL);
479 PyDict_SetItemString(d, "Error", Error);
Guido van Rossum220ecc81997-11-18 21:03:39 +0000480
Fredrik Lundh8f017a02000-07-08 19:57:37 +0000481 x = PyString_FromString(locale__doc__);
482 PyDict_SetItemString(d, "__doc__", x);
483 Py_XDECREF(x);
Martin v. Löwis9b75dca2001-08-10 13:58:50 +0000484
485#define ADDINT(X) PyModule_AddIntConstant(m, #X, X)
486#ifdef HAVE_LANGINFO_H
487 /* These constants should exist on any langinfo implementation */
488 ADDINT(DAY_1);
489 ADDINT(DAY_2);
490 ADDINT(DAY_3);
491 ADDINT(DAY_4);
492 ADDINT(DAY_5);
493 ADDINT(DAY_6);
494 ADDINT(DAY_7);
495
496 ADDINT(ABDAY_1);
497 ADDINT(ABDAY_2);
498 ADDINT(ABDAY_3);
499 ADDINT(ABDAY_4);
500 ADDINT(ABDAY_5);
501 ADDINT(ABDAY_6);
502 ADDINT(ABDAY_7);
503
504 ADDINT(MON_1);
505 ADDINT(MON_2);
506 ADDINT(MON_3);
507 ADDINT(MON_4);
508 ADDINT(MON_5);
509 ADDINT(MON_6);
510 ADDINT(MON_7);
511 ADDINT(MON_8);
512 ADDINT(MON_9);
513 ADDINT(MON_10);
514 ADDINT(MON_11);
515 ADDINT(MON_12);
516
517 ADDINT(ABMON_1);
518 ADDINT(ABMON_2);
519 ADDINT(ABMON_3);
520 ADDINT(ABMON_4);
521 ADDINT(ABMON_5);
522 ADDINT(ABMON_6);
523 ADDINT(ABMON_7);
524 ADDINT(ABMON_8);
525 ADDINT(ABMON_9);
526 ADDINT(ABMON_10);
527 ADDINT(ABMON_11);
528 ADDINT(ABMON_12);
529
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000530#ifdef RADIXCHAR
531 /* The following are not available with glibc 2.0 */
Martin v. Löwis9b75dca2001-08-10 13:58:50 +0000532 ADDINT(RADIXCHAR);
533 ADDINT(THOUSEP);
534 /* YESSTR and NOSTR are deprecated in glibc, since they are
535 a special case of message translation, which should be rather
536 done using gettext. So we don't expose it to Python in the
537 first place.
538 ADDINT(YESSTR);
539 ADDINT(NOSTR);
540 */
541 ADDINT(CRNCYSTR);
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000542#endif
Martin v. Löwis9b75dca2001-08-10 13:58:50 +0000543
544 ADDINT(D_T_FMT);
545 ADDINT(D_FMT);
546 ADDINT(T_FMT);
547 ADDINT(AM_STR);
548 ADDINT(PM_STR);
549
550#ifdef CODESET
551 /* The following constants are available only with XPG4. */
552 ADDINT(CODESET);
553 ADDINT(T_FMT_AMPM);
554 ADDINT(ERA);
555 ADDINT(ERA_D_FMT);
556 ADDINT(ERA_D_T_FMT);
557 ADDINT(ERA_T_FMT);
558 ADDINT(ALT_DIGITS);
559 ADDINT(YESEXPR);
560 ADDINT(NOEXPR);
Martin v. Löwisc4416d52001-08-10 19:41:45 +0000561#endif
562#ifdef _DATE_FMT
563 /* This is not available in all glibc versions that have CODESET. */
Martin v. Löwis9b75dca2001-08-10 13:58:50 +0000564 ADDINT(_DATE_FMT);
565#endif
566#endif /* HAVE_LANGINFO_H */
Guido van Rossum220ecc81997-11-18 21:03:39 +0000567}