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