_localemodule.c revision 7eb75bccb5dacb658c63db1a9a980950c3d54d42
17eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/*********************************************************** 27eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielCopyright (C) 1997, 2002, 2003 Martin von Loewis 37eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 47eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPermission to use, copy, modify, and distribute this software and its 57eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanieldocumentation for any purpose and without fee is hereby granted, 67eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielprovided that the above copyright notice appear in all copies. 77eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 87eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielThis software comes with no warranty. Use at your own risk. 97eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel******************************************************************/ 117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include "Python.h" 137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <stdio.h> 157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <locale.h> 167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <string.h> 177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <ctype.h> 187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_ERRNO_H 207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <errno.h> 217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LANGINFO_H 247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <langinfo.h> 257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LIBINTL_H 287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <libintl.h> 297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_WCHAR_H 327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <wchar.h> 337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) 367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define WIN32_LEAN_AND_MEAN 377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <windows.h> 387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef RISCOS 417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielchar *strdup(const char *); 427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); 457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject *Error; 477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* support functions for formatting floating point numbers */ 497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(setlocale__doc__, 517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"(integer,string=None) -> string. Activates/queries locale processing."); 527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* the grouping is terminated by either 0 or CHAR_MAX */ 547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielcopy_grouping(char* s) 567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int i; 587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *result, *val = NULL; 597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (s[0] == '\0') 617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* empty string: no grouping at all */ 627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyList_New(0); 637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (i = 0; s[i] != '\0' && s[i] != CHAR_MAX; i++) 657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ; /* nothing */ 667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result = PyList_New(i+1); 687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!result) 697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel i = -1; 727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel do { 737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel i++; 747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel val = PyInt_FromLong(s[i]); 757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!val) 767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel break; 777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (PyList_SetItem(result, i, val)) { 787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(val); 797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel val = NULL; 807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel break; 817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } while (s[i] != '\0' && s[i] != CHAR_MAX); 837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!val) { 857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(result); 867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return result; 907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic void 937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielfixup_ulcase(void) 947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *mods, *strop, *string, *ulo; 967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned char ul[256]; 977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int n, c; 987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* find the string and strop modules */ 1007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel mods = PyImport_GetModuleDict(); 1017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!mods) 1027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return; 1037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel string = PyDict_GetItemString(mods, "string"); 1047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (string) 1057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel string = PyModule_GetDict(string); 1067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strop=PyDict_GetItemString(mods, "strop"); 1077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (strop) 1087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strop = PyModule_GetDict(strop); 1097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!string && !strop) 1107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return; 1117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* create uppercase map string */ 1137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel n = 0; 1147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (c = 0; c < 256; c++) { 1157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (isupper(c)) 1167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ul[n++] = c; 1177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ulo = PyString_FromStringAndSize((const char *)ul, n); 1197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!ulo) 1207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return; 1217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (string) 1227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(string, "uppercase", ulo); 1237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (strop) 1247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(strop, "uppercase", ulo); 1257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(ulo); 1267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* create lowercase string */ 1287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel n = 0; 1297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (c = 0; c < 256; c++) { 1307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (islower(c)) 1317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ul[n++] = c; 1327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ulo = PyString_FromStringAndSize((const char *)ul, n); 1347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!ulo) 1357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return; 1367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (string) 1377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(string, "lowercase", ulo); 1387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (strop) 1397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(strop, "lowercase", ulo); 1407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(ulo); 1417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* create letters string */ 1437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel n = 0; 1447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (c = 0; c < 256; c++) { 1457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (isalpha(c)) 1467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ul[n++] = c; 1477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ulo = PyString_FromStringAndSize((const char *)ul, n); 1497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!ulo) 1507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return; 1517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (string) 1527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(string, "letters", ulo); 1537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(ulo); 1547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 1577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyLocale_setlocale(PyObject* self, PyObject* args) 1587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 1597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int category; 1607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *locale = NULL, *result; 1617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *result_object; 1627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale)) 1647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 1657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) 1677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (category < LC_MIN || category > LC_MAX) 1687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel { 1697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetString(Error, "invalid locale category"); 1707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 1717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 1737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (locale) { 1757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* set locale */ 1767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result = setlocale(category, locale); 1777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!result) { 1787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* operation failed, no setting was changed */ 1797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetString(Error, "unsupported locale setting"); 1807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 1817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result_object = PyString_FromString(result); 1837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!result_object) 1847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 1857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* record changes to LC_CTYPE */ 1867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (category == LC_CTYPE || category == LC_ALL) 1877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fixup_ulcase(); 1887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* things that got wrong up to here are ignored */ 1897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_Clear(); 1907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 1917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* get locale */ 1927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result = setlocale(category, NULL); 1937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!result) { 1947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetString(Error, "locale query failed"); 1957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 1967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result_object = PyString_FromString(result); 1987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return result_object; 2007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 2017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(localeconv__doc__, 2037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"() -> dict. Returns numeric and monetary locale-specific parameters."); 2047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 2067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyLocale_localeconv(PyObject* self) 2077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 2087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject* result; 2097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel struct lconv *l; 2107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *x; 2117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result = PyDict_New(); 2137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!result) 2147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* if LC_NUMERIC is different in the C library, use saved value */ 2177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel l = localeconv(); 2187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* hopefully, the localeconv result survives the C library calls 2207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel involved herein */ 2217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define RESULT_STRING(s)\ 2237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyString_FromString(l->s);\ 2247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!x) goto failed;\ 2257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(result, #s, x);\ 2267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x) 2277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define RESULT_INT(i)\ 2297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(l->i);\ 2307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!x) goto failed;\ 2317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(result, #i, x);\ 2327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x) 2337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Numeric information */ 2357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(decimal_point); 2367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(thousands_sep); 2377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = copy_grouping(l->grouping); 2387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!x) 2397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel goto failed; 2407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(result, "grouping", x); 2417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 2427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Monetary information */ 2447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(int_curr_symbol); 2457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(currency_symbol); 2467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(mon_decimal_point); 2477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(mon_thousands_sep); 2487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = copy_grouping(l->mon_grouping); 2497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!x) 2507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel goto failed; 2517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(result, "mon_grouping", x); 2527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 2537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(positive_sign); 2547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_STRING(negative_sign); 2557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(int_frac_digits); 2567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(frac_digits); 2577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(p_cs_precedes); 2587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(p_sep_by_space); 2597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(n_cs_precedes); 2607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(n_sep_by_space); 2617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(p_sign_posn); 2627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel RESULT_INT(n_sign_posn); 2637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return result; 2647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel failed: 2667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(result); 2677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 2687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 2707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(strcoll__doc__, 2727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"string,string -> int. Compares two strings according to the locale."); 2737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 2757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyLocale_strcoll(PyObject* self, PyObject* args) 2767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 2777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(HAVE_WCSCOLL) || !defined(Py_USING_UNICODE) 2787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *s1,*s2; 2797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "ss:strcoll", &s1, &s2)) 2817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyInt_FromLong(strcoll(s1, s2)); 2837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 2847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *os1, *os2, *result = NULL; 2857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel wchar_t *ws1 = NULL, *ws2 = NULL; 2867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int rel1 = 0, rel2 = 0, len1, len2; 2877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_UnpackTuple(args, "strcoll", 2, 2, &os1, &os2)) 2897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* If both arguments are byte strings, use strcoll. */ 2917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (PyString_Check(os1) && PyString_Check(os2)) 2927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyInt_FromLong(strcoll(PyString_AS_STRING(os1), 2937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyString_AS_STRING(os2))); 2947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* If neither argument is unicode, it's an error. */ 2957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyUnicode_Check(os1) && !PyUnicode_Check(os2)) { 2967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetString(PyExc_ValueError, "strcoll arguments must be strings"); 2977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 2987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Convert the non-unicode argument to unicode. */ 2997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyUnicode_Check(os1)) { 3007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel os1 = PyUnicode_FromObject(os1); 3017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!os1) 3027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 3037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel rel1 = 1; 3047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyUnicode_Check(os2)) { 3067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel os2 = PyUnicode_FromObject(os2); 3077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!os2) { 3087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (rel1) { 3097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(os1); 3107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 3127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel rel2 = 1; 3147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Convert the unicode strings to wchar[]. */ 3167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel len1 = PyUnicode_GET_SIZE(os1) + 1; 3177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ws1 = PyMem_NEW(wchar_t, len1); 3187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!ws1) { 3197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_NoMemory(); 3207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel goto done; 3217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (PyUnicode_AsWideChar((PyUnicodeObject*)os1, ws1, len1) == -1) 3237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel goto done; 3247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ws1[len1 - 1] = 0; 3257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel len2 = PyUnicode_GET_SIZE(os2) + 1; 3267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ws2 = PyMem_NEW(wchar_t, len2); 3277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!ws2) { 3287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_NoMemory(); 3297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel goto done; 3307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (PyUnicode_AsWideChar((PyUnicodeObject*)os2, ws2, len2) == -1) 3327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel goto done; 3337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ws2[len2 - 1] = 0; 3347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Collate the strings. */ 3357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result = PyInt_FromLong(wcscoll(ws1, ws2)); 3367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel done: 3377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Deallocate everything. */ 3387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (ws1) PyMem_FREE(ws1); 3397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (ws2) PyMem_FREE(ws2); 3407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (rel1) { 3417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(os1); 3427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (rel2) { 3447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_DECREF(os2); 3457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return result; 3477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 3487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 3497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(strxfrm__doc__, 3527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"string -> string. Returns a string that behaves for cmp locale-aware."); 3537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 3557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyLocale_strxfrm(PyObject* self, PyObject* args) 3567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *s, *buf; 3587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel size_t n1, n2; 3597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *result; 3607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "s:strxfrm", &s)) 3627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 3637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* assume no change in size, first */ 3657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel n1 = strlen(s) + 1; 3667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel buf = PyMem_Malloc(n1); 3677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!buf) 3687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyErr_NoMemory(); 3697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel n2 = strxfrm(buf, s, n1) + 1; 3707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (n2 > n1) { 3717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* more space needed */ 3727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel buf = PyMem_Realloc(buf, n2); 3737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!buf) 3747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyErr_NoMemory(); 3757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strxfrm(buf, s, n2); 3767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel result = PyString_FromString(buf); 3787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyMem_Free(buf); 3797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return result; 3807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 3817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) 3837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 3847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyLocale_getdefaultlocale(PyObject* self) 3857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char encoding[100]; 3877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char locale[100]; 3887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP()); 3907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (GetLocaleInfo(LOCALE_USER_DEFAULT, 3927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LOCALE_SISO639LANGNAME, 3937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel locale, sizeof(locale))) { 3947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_ssize_t i = strlen(locale); 3957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel locale[i++] = '_'; 3967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (GetLocaleInfo(LOCALE_USER_DEFAULT, 3977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LOCALE_SISO3166CTRYNAME, 3987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel locale+i, (int)(sizeof(locale)-i))) 3997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return Py_BuildValue("ss", locale, encoding); 4007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* If we end up here, this windows version didn't know about 4037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ISO639/ISO3166 names (it's probably Windows 95). Return the 4047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Windows language identifier instead (a hexadecimal number) */ 4057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel locale[0] = '0'; 4077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel locale[1] = 'x'; 4087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTLANGUAGE, 4097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel locale+2, sizeof(locale)-2)) { 4107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return Py_BuildValue("ss", locale, encoding); 4117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* cannot determine the language code (very unlikely) */ 4147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_INCREF(Py_None); 4157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return Py_BuildValue("Os", Py_None, encoding); 4167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 4177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 4187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LANGINFO_H 4207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LANGINFO(X) {#X, X} 4217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic struct langinfo_constant{ 4227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char* name; 4237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int value; 4247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} langinfo_constants[] = 4257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 4267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* These constants should exist on any langinfo implementation */ 4277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_1), 4287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_2), 4297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_3), 4307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_4), 4317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_5), 4327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_6), 4337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(DAY_7), 4347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_1), 4367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_2), 4377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_3), 4387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_4), 4397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_5), 4407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_6), 4417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABDAY_7), 4427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_1), 4447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_2), 4457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_3), 4467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_4), 4477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_5), 4487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_6), 4497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_7), 4507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_8), 4517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_9), 4527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_10), 4537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_11), 4547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(MON_12), 4557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_1), 4577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_2), 4587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_3), 4597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_4), 4607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_5), 4617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_6), 4627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_7), 4637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_8), 4647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_9), 4657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_10), 4667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_11), 4677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ABMON_12), 4687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef RADIXCHAR 4707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* The following are not available with glibc 2.0 */ 4717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(RADIXCHAR), 4727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(THOUSEP), 4737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* YESSTR and NOSTR are deprecated in glibc, since they are 4747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel a special case of message translation, which should be rather 4757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel done using gettext. So we don't expose it to Python in the 4767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel first place. 4777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(YESSTR), 4787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(NOSTR), 4797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 4807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(CRNCYSTR), 4817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 4827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(D_T_FMT), 4847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(D_FMT), 4857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(T_FMT), 4867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(AM_STR), 4877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(PM_STR), 4887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* The following constants are available only with XPG4, but... 4907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel AIX 3.2. only has CODESET. 4917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel OpenBSD doesn't have CODESET but has T_FMT_AMPM, and doesn't have 4927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel a few of the others. 4937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Solution: ifdef-test them all. */ 4947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef CODESET 4957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(CODESET), 4967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 4977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef T_FMT_AMPM 4987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(T_FMT_AMPM), 4997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef ERA 5017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ERA), 5027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef ERA_D_FMT 5047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ERA_D_FMT), 5057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef ERA_D_T_FMT 5077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ERA_D_T_FMT), 5087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef ERA_T_FMT 5107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ERA_T_FMT), 5117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef ALT_DIGITS 5137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(ALT_DIGITS), 5147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef YESEXPR 5167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(YESEXPR), 5177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef NOEXPR 5197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(NOEXPR), 5207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef _DATE_FMT 5227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* This is not available in all glibc versions that have CODESET. */ 5237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LANGINFO(_DATE_FMT), 5247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {0, 0} 5267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}; 5277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(nl_langinfo__doc__, 5297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"nl_langinfo(key) -> string\n" 5307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Return the value for the locale information associated with key."); 5317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 5337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyLocale_nl_langinfo(PyObject* self, PyObject* args) 5347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 5357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int item, i; 5367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item)) 5377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 5387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Check whether this is a supported constant. GNU libc sometimes 5397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel returns numeric values in the char* return value, which would 5407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel crash PyString_FromString. */ 5417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (i = 0; langinfo_constants[i].name; i++) 5427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (langinfo_constants[i].value == item) { 5437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Check NULL as a workaround for GNU libc's returning NULL 5447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel instead of an empty string for nl_langinfo(ERA). */ 5457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel const char *result = nl_langinfo(item); 5467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(result != NULL ? result : ""); 5477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 5487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant"); 5497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 5507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 5517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* HAVE_LANGINFO_H */ 5527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LIBINTL_H 5547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(gettext__doc__, 5567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"gettext(msg) -> string\n" 5577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Return translation of msg."); 5587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 5607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyIntl_gettext(PyObject* self, PyObject *args) 5617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 5627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *in; 5637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "s", &in)) 5647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 5657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(gettext(in)); 5667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 5677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(dgettext__doc__, 5697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"dgettext(domain, msg) -> string\n" 5707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Return translation of msg in domain."); 5717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 5737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyIntl_dgettext(PyObject* self, PyObject *args) 5747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 5757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *domain, *in; 5767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "zs", &domain, &in)) 5777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 5787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(dgettext(domain, in)); 5797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 5807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(dcgettext__doc__, 5827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"dcgettext(domain, msg, category) -> string\n" 5837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Return translation of msg in domain and category."); 5847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 5867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyIntl_dcgettext(PyObject *self, PyObject *args) 5877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 5887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *domain, *msgid; 5897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int category; 5907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category)) 5917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 5927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(dcgettext(domain,msgid,category)); 5937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 5947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(textdomain__doc__, 5967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"textdomain(domain) -> string\n" 5977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Set the C library's textdmain to domain, returning the new domain."); 5987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 6007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyIntl_textdomain(PyObject* self, PyObject* args) 6017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 6027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *domain; 6037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "z", &domain)) 6047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 6057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel domain = textdomain(domain); 6067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!domain) { 6077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetFromErrno(PyExc_OSError); 6087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 6097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(domain); 6117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 6127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(bindtextdomain__doc__, 6147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"bindtextdomain(domain, dir) -> string\n" 6157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Bind the C library's domain to dir."); 6167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 6187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyIntl_bindtextdomain(PyObject* self,PyObject*args) 6197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 6207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *domain, *dirname; 6217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "sz", &domain, &dirname)) 6227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 6237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!strlen(domain)) { 6247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetString(Error, "domain must be a non-empty string"); 6257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 6267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel dirname = bindtextdomain(domain, dirname); 6287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!dirname) { 6297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyErr_SetFromErrno(PyExc_OSError); 6307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 6317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(dirname); 6337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 6347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_BIND_TEXTDOMAIN_CODESET 6367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyDoc_STRVAR(bind_textdomain_codeset__doc__, 6377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"bind_textdomain_codeset(domain, codeset) -> string\n" 6387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel"Bind the C library's domain to codeset."); 6397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic PyObject* 6417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyIntl_bind_textdomain_codeset(PyObject* self,PyObject*args) 6427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 6437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *domain,*codeset; 6447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!PyArg_ParseTuple(args, "sz", &domain, &codeset)) 6457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 6467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel codeset = bind_textdomain_codeset(domain, codeset); 6477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (codeset) 6487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return PyString_FromString(codeset); 6497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_RETURN_NONE; 6507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 6517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic struct PyMethodDef PyLocale_Methods[] = { 6567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"setlocale", (PyCFunction) PyLocale_setlocale, 6577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel METH_VARARGS, setlocale__doc__}, 6587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"localeconv", (PyCFunction) PyLocale_localeconv, 6597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel METH_NOARGS, localeconv__doc__}, 6607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"strcoll", (PyCFunction) PyLocale_strcoll, 6617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel METH_VARARGS, strcoll__doc__}, 6627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"strxfrm", (PyCFunction) PyLocale_strxfrm, 6637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel METH_VARARGS, strxfrm__doc__}, 6647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MS_WINDOWS) 6657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"_getdefaultlocale", (PyCFunction) PyLocale_getdefaultlocale, METH_NOARGS}, 6667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LANGINFO_H 6687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"nl_langinfo", (PyCFunction) PyLocale_nl_langinfo, 6697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel METH_VARARGS, nl_langinfo__doc__}, 6707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LIBINTL_H 6727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"gettext",(PyCFunction)PyIntl_gettext,METH_VARARGS, 6737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gettext__doc__}, 6747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"dgettext",(PyCFunction)PyIntl_dgettext,METH_VARARGS, 6757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel dgettext__doc__}, 6767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"dcgettext",(PyCFunction)PyIntl_dcgettext,METH_VARARGS, 6777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel dcgettext__doc__}, 6787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"textdomain",(PyCFunction)PyIntl_textdomain,METH_VARARGS, 6797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel textdomain__doc__}, 6807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"bindtextdomain",(PyCFunction)PyIntl_bindtextdomain,METH_VARARGS, 6817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel bindtextdomain__doc__}, 6827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_BIND_TEXTDOMAIN_CODESET 6837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {"bind_textdomain_codeset",(PyCFunction)PyIntl_bind_textdomain_codeset, 6847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel METH_VARARGS, bind_textdomain_codeset__doc__}, 6857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel {NULL, NULL} 6887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}; 6897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPyMODINIT_FUNC 6917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielinit_locale(void) 6927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 6937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyObject *m, *d, *x; 6947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LANGINFO_H 6957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int i; 6967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 6977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel m = Py_InitModule("_locale", PyLocale_Methods); 6997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (m == NULL) 7007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return; 7017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel d = PyModule_GetDict(m); 7037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_CTYPE); 7057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_CTYPE", x); 7067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_TIME); 7097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_TIME", x); 7107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_COLLATE); 7137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_COLLATE", x); 7147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_MONETARY); 7177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_MONETARY", x); 7187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef LC_MESSAGES 7217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_MESSAGES); 7227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_MESSAGES", x); 7237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* LC_MESSAGES */ 7257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_NUMERIC); 7277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_NUMERIC", x); 7287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(LC_ALL); 7317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "LC_ALL", x); 7327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyInt_FromLong(CHAR_MAX); 7357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "CHAR_MAX", x); 7367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Error = PyErr_NewException("locale.Error", NULL, NULL); 7397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "Error", Error); 7407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel x = PyString_FromString(locale__doc__); 7427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyDict_SetItemString(d, "__doc__", x); 7437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel Py_XDECREF(x); 7447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef HAVE_LANGINFO_H 7467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (i = 0; langinfo_constants[i].name; i++) { 7477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel PyModule_AddIntConstant(m, langinfo_constants[i].name, 7487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel langinfo_constants[i].value); 7497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 7507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 7517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 7527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 7537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* 7547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielLocal variables: 7557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielc-basic-offset: 4 7567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielindent-tabs-mode: nil 7577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielEnd: 7587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/ 759