Issue 6340: update by Gregor Lingl of his tdemo_chaos demo program.
[python.git] / Modules / _localemodule.c
blob26aed97d8f56d90470c9bd09798bdcf56b08d811
1 /***********************************************************
2 Copyright (C) 1997, 2002, 2003 Martin von Loewis
4 Permission to use, copy, modify, and distribute this software and its
5 documentation for any purpose and without fee is hereby granted,
6 provided that the above copyright notice appear in all copies.
8 This software comes with no warranty. Use at your own risk.
10 ******************************************************************/
12 #include "Python.h"
14 #include <stdio.h>
15 #include <locale.h>
16 #include <string.h>
17 #include <ctype.h>
19 #ifdef HAVE_ERRNO_H
20 #include <errno.h>
21 #endif
23 #ifdef HAVE_LANGINFO_H
24 #include <langinfo.h>
25 #endif
27 #ifdef HAVE_LIBINTL_H
28 #include <libintl.h>
29 #endif
31 #ifdef HAVE_WCHAR_H
32 #include <wchar.h>
33 #endif
35 #if defined(__APPLE__)
36 #include <CoreFoundation/CoreFoundation.h>
37 #endif
39 #if defined(MS_WINDOWS)
40 #define WIN32_LEAN_AND_MEAN
41 #include <windows.h>
42 #endif
44 #ifdef RISCOS
45 char *strdup(const char *);
46 #endif
48 PyDoc_STRVAR(locale__doc__, "Support for POSIX locales.");
50 static PyObject *Error;
52 /* support functions for formatting floating point numbers */
54 PyDoc_STRVAR(setlocale__doc__,
55 "(integer,string=None) -> string. Activates/queries locale processing.");
57 /* the grouping is terminated by either 0 or CHAR_MAX */
58 static PyObject*
59 copy_grouping(char* s)
61 int i;
62 PyObject *result, *val = NULL;
64 if (s[0] == '\0')
65 /* empty string: no grouping at all */
66 return PyList_New(0);
68 for (i = 0; s[i] != '\0' && s[i] != CHAR_MAX; i++)
69 ; /* nothing */
71 result = PyList_New(i+1);
72 if (!result)
73 return NULL;
75 i = -1;
76 do {
77 i++;
78 val = PyInt_FromLong(s[i]);
79 if (!val)
80 break;
81 if (PyList_SetItem(result, i, val)) {
82 Py_DECREF(val);
83 val = NULL;
84 break;
86 } while (s[i] != '\0' && s[i] != CHAR_MAX);
88 if (!val) {
89 Py_DECREF(result);
90 return NULL;
93 return result;
96 static void
97 fixup_ulcase(void)
99 PyObject *mods, *strop, *string, *ulo;
100 unsigned char ul[256];
101 int n, c;
103 /* find the string and strop modules */
104 mods = PyImport_GetModuleDict();
105 if (!mods)
106 return;
107 string = PyDict_GetItemString(mods, "string");
108 if (string)
109 string = PyModule_GetDict(string);
110 strop=PyDict_GetItemString(mods, "strop");
111 if (strop)
112 strop = PyModule_GetDict(strop);
113 if (!string && !strop)
114 return;
116 /* create uppercase map string */
117 n = 0;
118 for (c = 0; c < 256; c++) {
119 if (isupper(c))
120 ul[n++] = c;
122 ulo = PyString_FromStringAndSize((const char *)ul, n);
123 if (!ulo)
124 return;
125 if (string)
126 PyDict_SetItemString(string, "uppercase", ulo);
127 if (strop)
128 PyDict_SetItemString(strop, "uppercase", ulo);
129 Py_DECREF(ulo);
131 /* create lowercase string */
132 n = 0;
133 for (c = 0; c < 256; c++) {
134 if (islower(c))
135 ul[n++] = c;
137 ulo = PyString_FromStringAndSize((const char *)ul, n);
138 if (!ulo)
139 return;
140 if (string)
141 PyDict_SetItemString(string, "lowercase", ulo);
142 if (strop)
143 PyDict_SetItemString(strop, "lowercase", ulo);
144 Py_DECREF(ulo);
146 /* create letters string */
147 n = 0;
148 for (c = 0; c < 256; c++) {
149 if (isalpha(c))
150 ul[n++] = c;
152 ulo = PyString_FromStringAndSize((const char *)ul, n);
153 if (!ulo)
154 return;
155 if (string)
156 PyDict_SetItemString(string, "letters", ulo);
157 Py_DECREF(ulo);
160 static PyObject*
161 PyLocale_setlocale(PyObject* self, PyObject* args)
163 int category;
164 char *locale = NULL, *result;
165 PyObject *result_object;
167 if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale))
168 return NULL;
170 if (locale) {
171 /* set locale */
172 result = setlocale(category, locale);
173 if (!result) {
174 /* operation failed, no setting was changed */
175 PyErr_SetString(Error, "unsupported locale setting");
176 return NULL;
178 result_object = PyString_FromString(result);
179 if (!result_object)
180 return NULL;
181 /* record changes to LC_CTYPE */
182 if (category == LC_CTYPE || category == LC_ALL)
183 fixup_ulcase();
184 /* things that got wrong up to here are ignored */
185 PyErr_Clear();
186 } else {
187 /* get locale */
188 result = setlocale(category, NULL);
189 if (!result) {
190 PyErr_SetString(Error, "locale query failed");
191 return NULL;
193 result_object = PyString_FromString(result);
195 return result_object;
198 PyDoc_STRVAR(localeconv__doc__,
199 "() -> dict. Returns numeric and monetary locale-specific parameters.");
201 static PyObject*
202 PyLocale_localeconv(PyObject* self)
204 PyObject* result;
205 struct lconv *l;
206 PyObject *x;
208 result = PyDict_New();
209 if (!result)
210 return NULL;
212 /* if LC_NUMERIC is different in the C library, use saved value */
213 l = localeconv();
215 /* hopefully, the localeconv result survives the C library calls
216 involved herein */
218 #define RESULT_STRING(s)\
219 x = PyString_FromString(l->s);\
220 if (!x) goto failed;\
221 PyDict_SetItemString(result, #s, x);\
222 Py_XDECREF(x)
224 #define RESULT_INT(i)\
225 x = PyInt_FromLong(l->i);\
226 if (!x) goto failed;\
227 PyDict_SetItemString(result, #i, x);\
228 Py_XDECREF(x)
230 /* Numeric information */
231 RESULT_STRING(decimal_point);
232 RESULT_STRING(thousands_sep);
233 x = copy_grouping(l->grouping);
234 if (!x)
235 goto failed;
236 PyDict_SetItemString(result, "grouping", x);
237 Py_XDECREF(x);
239 /* Monetary information */
240 RESULT_STRING(int_curr_symbol);
241 RESULT_STRING(currency_symbol);
242 RESULT_STRING(mon_decimal_point);
243 RESULT_STRING(mon_thousands_sep);
244 x = copy_grouping(l->mon_grouping);
245 if (!x)
246 goto failed;
247 PyDict_SetItemString(result, "mon_grouping", x);
248 Py_XDECREF(x);
249 RESULT_STRING(positive_sign);
250 RESULT_STRING(negative_sign);
251 RESULT_INT(int_frac_digits);
252 RESULT_INT(frac_digits);
253 RESULT_INT(p_cs_precedes);
254 RESULT_INT(p_sep_by_space);
255 RESULT_INT(n_cs_precedes);
256 RESULT_INT(n_sep_by_space);
257 RESULT_INT(p_sign_posn);
258 RESULT_INT(n_sign_posn);
259 return result;
261 failed:
262 Py_XDECREF(result);
263 Py_XDECREF(x);
264 return NULL;
267 PyDoc_STRVAR(strcoll__doc__,
268 "string,string -> int. Compares two strings according to the locale.");
270 static PyObject*
271 PyLocale_strcoll(PyObject* self, PyObject* args)
273 #if !defined(HAVE_WCSCOLL) || !defined(Py_USING_UNICODE)
274 char *s1,*s2;
276 if (!PyArg_ParseTuple(args, "ss:strcoll", &s1, &s2))
277 return NULL;
278 return PyInt_FromLong(strcoll(s1, s2));
279 #else
280 PyObject *os1, *os2, *result = NULL;
281 wchar_t *ws1 = NULL, *ws2 = NULL;
282 int rel1 = 0, rel2 = 0, len1, len2;
284 if (!PyArg_UnpackTuple(args, "strcoll", 2, 2, &os1, &os2))
285 return NULL;
286 /* If both arguments are byte strings, use strcoll. */
287 if (PyString_Check(os1) && PyString_Check(os2))
288 return PyInt_FromLong(strcoll(PyString_AS_STRING(os1),
289 PyString_AS_STRING(os2)));
290 /* If neither argument is unicode, it's an error. */
291 if (!PyUnicode_Check(os1) && !PyUnicode_Check(os2)) {
292 PyErr_SetString(PyExc_ValueError, "strcoll arguments must be strings");
294 /* Convert the non-unicode argument to unicode. */
295 if (!PyUnicode_Check(os1)) {
296 os1 = PyUnicode_FromObject(os1);
297 if (!os1)
298 return NULL;
299 rel1 = 1;
301 if (!PyUnicode_Check(os2)) {
302 os2 = PyUnicode_FromObject(os2);
303 if (!os2) {
304 if (rel1) {
305 Py_DECREF(os1);
307 return NULL;
309 rel2 = 1;
311 /* Convert the unicode strings to wchar[]. */
312 len1 = PyUnicode_GET_SIZE(os1) + 1;
313 ws1 = PyMem_MALLOC(len1 * sizeof(wchar_t));
314 if (!ws1) {
315 PyErr_NoMemory();
316 goto done;
318 if (PyUnicode_AsWideChar((PyUnicodeObject*)os1, ws1, len1) == -1)
319 goto done;
320 ws1[len1 - 1] = 0;
321 len2 = PyUnicode_GET_SIZE(os2) + 1;
322 ws2 = PyMem_MALLOC(len2 * sizeof(wchar_t));
323 if (!ws2) {
324 PyErr_NoMemory();
325 goto done;
327 if (PyUnicode_AsWideChar((PyUnicodeObject*)os2, ws2, len2) == -1)
328 goto done;
329 ws2[len2 - 1] = 0;
330 /* Collate the strings. */
331 result = PyInt_FromLong(wcscoll(ws1, ws2));
332 done:
333 /* Deallocate everything. */
334 if (ws1) PyMem_FREE(ws1);
335 if (ws2) PyMem_FREE(ws2);
336 if (rel1) {
337 Py_DECREF(os1);
339 if (rel2) {
340 Py_DECREF(os2);
342 return result;
343 #endif
347 PyDoc_STRVAR(strxfrm__doc__,
348 "string -> string. Returns a string that behaves for cmp locale-aware.");
350 static PyObject*
351 PyLocale_strxfrm(PyObject* self, PyObject* args)
353 char *s, *buf;
354 size_t n1, n2;
355 PyObject *result;
357 if (!PyArg_ParseTuple(args, "s:strxfrm", &s))
358 return NULL;
360 /* assume no change in size, first */
361 n1 = strlen(s) + 1;
362 buf = PyMem_Malloc(n1);
363 if (!buf)
364 return PyErr_NoMemory();
365 n2 = strxfrm(buf, s, n1) + 1;
366 if (n2 > n1) {
367 /* more space needed */
368 buf = PyMem_Realloc(buf, n2);
369 if (!buf)
370 return PyErr_NoMemory();
371 strxfrm(buf, s, n2);
373 result = PyString_FromString(buf);
374 PyMem_Free(buf);
375 return result;
378 #if defined(MS_WINDOWS)
379 static PyObject*
380 PyLocale_getdefaultlocale(PyObject* self)
382 char encoding[100];
383 char locale[100];
385 PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP());
387 if (GetLocaleInfo(LOCALE_USER_DEFAULT,
388 LOCALE_SISO639LANGNAME,
389 locale, sizeof(locale))) {
390 Py_ssize_t i = strlen(locale);
391 locale[i++] = '_';
392 if (GetLocaleInfo(LOCALE_USER_DEFAULT,
393 LOCALE_SISO3166CTRYNAME,
394 locale+i, (int)(sizeof(locale)-i)))
395 return Py_BuildValue("ss", locale, encoding);
398 /* If we end up here, this windows version didn't know about
399 ISO639/ISO3166 names (it's probably Windows 95). Return the
400 Windows language identifier instead (a hexadecimal number) */
402 locale[0] = '0';
403 locale[1] = 'x';
404 if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTLANGUAGE,
405 locale+2, sizeof(locale)-2)) {
406 return Py_BuildValue("ss", locale, encoding);
409 /* cannot determine the language code (very unlikely) */
410 Py_INCREF(Py_None);
411 return Py_BuildValue("Os", Py_None, encoding);
413 #endif
415 #ifdef HAVE_LANGINFO_H
416 #define LANGINFO(X) {#X, X}
417 static struct langinfo_constant{
418 char* name;
419 int value;
420 } langinfo_constants[] =
422 /* These constants should exist on any langinfo implementation */
423 LANGINFO(DAY_1),
424 LANGINFO(DAY_2),
425 LANGINFO(DAY_3),
426 LANGINFO(DAY_4),
427 LANGINFO(DAY_5),
428 LANGINFO(DAY_6),
429 LANGINFO(DAY_7),
431 LANGINFO(ABDAY_1),
432 LANGINFO(ABDAY_2),
433 LANGINFO(ABDAY_3),
434 LANGINFO(ABDAY_4),
435 LANGINFO(ABDAY_5),
436 LANGINFO(ABDAY_6),
437 LANGINFO(ABDAY_7),
439 LANGINFO(MON_1),
440 LANGINFO(MON_2),
441 LANGINFO(MON_3),
442 LANGINFO(MON_4),
443 LANGINFO(MON_5),
444 LANGINFO(MON_6),
445 LANGINFO(MON_7),
446 LANGINFO(MON_8),
447 LANGINFO(MON_9),
448 LANGINFO(MON_10),
449 LANGINFO(MON_11),
450 LANGINFO(MON_12),
452 LANGINFO(ABMON_1),
453 LANGINFO(ABMON_2),
454 LANGINFO(ABMON_3),
455 LANGINFO(ABMON_4),
456 LANGINFO(ABMON_5),
457 LANGINFO(ABMON_6),
458 LANGINFO(ABMON_7),
459 LANGINFO(ABMON_8),
460 LANGINFO(ABMON_9),
461 LANGINFO(ABMON_10),
462 LANGINFO(ABMON_11),
463 LANGINFO(ABMON_12),
465 #ifdef RADIXCHAR
466 /* The following are not available with glibc 2.0 */
467 LANGINFO(RADIXCHAR),
468 LANGINFO(THOUSEP),
469 /* YESSTR and NOSTR are deprecated in glibc, since they are
470 a special case of message translation, which should be rather
471 done using gettext. So we don't expose it to Python in the
472 first place.
473 LANGINFO(YESSTR),
474 LANGINFO(NOSTR),
476 LANGINFO(CRNCYSTR),
477 #endif
479 LANGINFO(D_T_FMT),
480 LANGINFO(D_FMT),
481 LANGINFO(T_FMT),
482 LANGINFO(AM_STR),
483 LANGINFO(PM_STR),
485 /* The following constants are available only with XPG4, but...
486 AIX 3.2. only has CODESET.
487 OpenBSD doesn't have CODESET but has T_FMT_AMPM, and doesn't have
488 a few of the others.
489 Solution: ifdef-test them all. */
490 #ifdef CODESET
491 LANGINFO(CODESET),
492 #endif
493 #ifdef T_FMT_AMPM
494 LANGINFO(T_FMT_AMPM),
495 #endif
496 #ifdef ERA
497 LANGINFO(ERA),
498 #endif
499 #ifdef ERA_D_FMT
500 LANGINFO(ERA_D_FMT),
501 #endif
502 #ifdef ERA_D_T_FMT
503 LANGINFO(ERA_D_T_FMT),
504 #endif
505 #ifdef ERA_T_FMT
506 LANGINFO(ERA_T_FMT),
507 #endif
508 #ifdef ALT_DIGITS
509 LANGINFO(ALT_DIGITS),
510 #endif
511 #ifdef YESEXPR
512 LANGINFO(YESEXPR),
513 #endif
514 #ifdef NOEXPR
515 LANGINFO(NOEXPR),
516 #endif
517 #ifdef _DATE_FMT
518 /* This is not available in all glibc versions that have CODESET. */
519 LANGINFO(_DATE_FMT),
520 #endif
521 {0, 0}
524 PyDoc_STRVAR(nl_langinfo__doc__,
525 "nl_langinfo(key) -> string\n"
526 "Return the value for the locale information associated with key.");
528 static PyObject*
529 PyLocale_nl_langinfo(PyObject* self, PyObject* args)
531 int item, i;
532 if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item))
533 return NULL;
534 /* Check whether this is a supported constant. GNU libc sometimes
535 returns numeric values in the char* return value, which would
536 crash PyString_FromString. */
537 for (i = 0; langinfo_constants[i].name; i++)
538 if (langinfo_constants[i].value == item) {
539 /* Check NULL as a workaround for GNU libc's returning NULL
540 instead of an empty string for nl_langinfo(ERA). */
541 const char *result = nl_langinfo(item);
542 return PyString_FromString(result != NULL ? result : "");
544 PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant");
545 return NULL;
547 #endif /* HAVE_LANGINFO_H */
549 #ifdef HAVE_LIBINTL_H
551 PyDoc_STRVAR(gettext__doc__,
552 "gettext(msg) -> string\n"
553 "Return translation of msg.");
555 static PyObject*
556 PyIntl_gettext(PyObject* self, PyObject *args)
558 char *in;
559 if (!PyArg_ParseTuple(args, "s", &in))
560 return 0;
561 return PyString_FromString(gettext(in));
564 PyDoc_STRVAR(dgettext__doc__,
565 "dgettext(domain, msg) -> string\n"
566 "Return translation of msg in domain.");
568 static PyObject*
569 PyIntl_dgettext(PyObject* self, PyObject *args)
571 char *domain, *in;
572 if (!PyArg_ParseTuple(args, "zs", &domain, &in))
573 return 0;
574 return PyString_FromString(dgettext(domain, in));
577 PyDoc_STRVAR(dcgettext__doc__,
578 "dcgettext(domain, msg, category) -> string\n"
579 "Return translation of msg in domain and category.");
581 static PyObject*
582 PyIntl_dcgettext(PyObject *self, PyObject *args)
584 char *domain, *msgid;
585 int category;
586 if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category))
587 return 0;
588 return PyString_FromString(dcgettext(domain,msgid,category));
591 PyDoc_STRVAR(textdomain__doc__,
592 "textdomain(domain) -> string\n"
593 "Set the C library's textdmain to domain, returning the new domain.");
595 static PyObject*
596 PyIntl_textdomain(PyObject* self, PyObject* args)
598 char *domain;
599 if (!PyArg_ParseTuple(args, "z", &domain))
600 return 0;
601 domain = textdomain(domain);
602 if (!domain) {
603 PyErr_SetFromErrno(PyExc_OSError);
604 return NULL;
606 return PyString_FromString(domain);
609 PyDoc_STRVAR(bindtextdomain__doc__,
610 "bindtextdomain(domain, dir) -> string\n"
611 "Bind the C library's domain to dir.");
613 static PyObject*
614 PyIntl_bindtextdomain(PyObject* self,PyObject*args)
616 char *domain, *dirname;
617 if (!PyArg_ParseTuple(args, "sz", &domain, &dirname))
618 return 0;
619 if (!strlen(domain)) {
620 PyErr_SetString(Error, "domain must be a non-empty string");
621 return 0;
623 dirname = bindtextdomain(domain, dirname);
624 if (!dirname) {
625 PyErr_SetFromErrno(PyExc_OSError);
626 return NULL;
628 return PyString_FromString(dirname);
631 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
632 PyDoc_STRVAR(bind_textdomain_codeset__doc__,
633 "bind_textdomain_codeset(domain, codeset) -> string\n"
634 "Bind the C library's domain to codeset.");
636 static PyObject*
637 PyIntl_bind_textdomain_codeset(PyObject* self,PyObject*args)
639 char *domain,*codeset;
640 if (!PyArg_ParseTuple(args, "sz", &domain, &codeset))
641 return NULL;
642 codeset = bind_textdomain_codeset(domain, codeset);
643 if (codeset)
644 return PyString_FromString(codeset);
645 Py_RETURN_NONE;
647 #endif
649 #endif
651 static struct PyMethodDef PyLocale_Methods[] = {
652 {"setlocale", (PyCFunction) PyLocale_setlocale,
653 METH_VARARGS, setlocale__doc__},
654 {"localeconv", (PyCFunction) PyLocale_localeconv,
655 METH_NOARGS, localeconv__doc__},
656 {"strcoll", (PyCFunction) PyLocale_strcoll,
657 METH_VARARGS, strcoll__doc__},
658 {"strxfrm", (PyCFunction) PyLocale_strxfrm,
659 METH_VARARGS, strxfrm__doc__},
660 #if defined(MS_WINDOWS)
661 {"_getdefaultlocale", (PyCFunction) PyLocale_getdefaultlocale, METH_NOARGS},
662 #endif
663 #ifdef HAVE_LANGINFO_H
664 {"nl_langinfo", (PyCFunction) PyLocale_nl_langinfo,
665 METH_VARARGS, nl_langinfo__doc__},
666 #endif
667 #ifdef HAVE_LIBINTL_H
668 {"gettext",(PyCFunction)PyIntl_gettext,METH_VARARGS,
669 gettext__doc__},
670 {"dgettext",(PyCFunction)PyIntl_dgettext,METH_VARARGS,
671 dgettext__doc__},
672 {"dcgettext",(PyCFunction)PyIntl_dcgettext,METH_VARARGS,
673 dcgettext__doc__},
674 {"textdomain",(PyCFunction)PyIntl_textdomain,METH_VARARGS,
675 textdomain__doc__},
676 {"bindtextdomain",(PyCFunction)PyIntl_bindtextdomain,METH_VARARGS,
677 bindtextdomain__doc__},
678 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
679 {"bind_textdomain_codeset",(PyCFunction)PyIntl_bind_textdomain_codeset,
680 METH_VARARGS, bind_textdomain_codeset__doc__},
681 #endif
682 #endif
683 {NULL, NULL}
686 PyMODINIT_FUNC
687 init_locale(void)
689 PyObject *m, *d, *x;
690 #ifdef HAVE_LANGINFO_H
691 int i;
692 #endif
694 m = Py_InitModule("_locale", PyLocale_Methods);
695 if (m == NULL)
696 return;
698 d = PyModule_GetDict(m);
700 x = PyInt_FromLong(LC_CTYPE);
701 PyDict_SetItemString(d, "LC_CTYPE", x);
702 Py_XDECREF(x);
704 x = PyInt_FromLong(LC_TIME);
705 PyDict_SetItemString(d, "LC_TIME", x);
706 Py_XDECREF(x);
708 x = PyInt_FromLong(LC_COLLATE);
709 PyDict_SetItemString(d, "LC_COLLATE", x);
710 Py_XDECREF(x);
712 x = PyInt_FromLong(LC_MONETARY);
713 PyDict_SetItemString(d, "LC_MONETARY", x);
714 Py_XDECREF(x);
716 #ifdef LC_MESSAGES
717 x = PyInt_FromLong(LC_MESSAGES);
718 PyDict_SetItemString(d, "LC_MESSAGES", x);
719 Py_XDECREF(x);
720 #endif /* LC_MESSAGES */
722 x = PyInt_FromLong(LC_NUMERIC);
723 PyDict_SetItemString(d, "LC_NUMERIC", x);
724 Py_XDECREF(x);
726 x = PyInt_FromLong(LC_ALL);
727 PyDict_SetItemString(d, "LC_ALL", x);
728 Py_XDECREF(x);
730 x = PyInt_FromLong(CHAR_MAX);
731 PyDict_SetItemString(d, "CHAR_MAX", x);
732 Py_XDECREF(x);
734 Error = PyErr_NewException("locale.Error", NULL, NULL);
735 PyDict_SetItemString(d, "Error", Error);
737 x = PyString_FromString(locale__doc__);
738 PyDict_SetItemString(d, "__doc__", x);
739 Py_XDECREF(x);
741 #ifdef HAVE_LANGINFO_H
742 for (i = 0; langinfo_constants[i].name; i++) {
743 PyModule_AddIntConstant(m, langinfo_constants[i].name,
744 langinfo_constants[i].value);
746 #endif
750 Local variables:
751 c-basic-offset: 4
752 indent-tabs-mode: nil
753 End: