/*********************************************************** Copyright (C) 1997, 2002, 2003, 2007, 2008 Martin von Loewis Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies. This software comes with no warranty. Use at your own risk. ******************************************************************/ #include "Python.h" #include "pycore_fileutils.h" // _Py_GetLocaleconvNumeric() #include "pycore_pymem.h" // _PyMem_Strdup() #include <locale.h> // setlocale() #include <string.h> // strlen() #ifdef HAVE_ERRNO_H # include <errno.h> // errno #endif #ifdef HAVE_LANGINFO_H # include <langinfo.h> // nl_langinfo() #endif #ifdef HAVE_LIBINTL_H # include <libintl.h> #endif #ifdef MS_WINDOWS # ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN # endif # include <windows.h> #endif PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); _locale_state; static inline _locale_state* get_locale_state(PyObject *m) { … } #include "clinic/_localemodule.c.h" /*[clinic input] module _locale [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ed98569b726feada]*/ /* support functions for formatting floating-point numbers */ /* the grouping is terminated by either 0 or CHAR_MAX */ static PyObject* copy_grouping(const char* s) { … } /*[clinic input] _locale.setlocale category: int locale: str(accept={str, NoneType}) = NULL / Activates/queries locale processing. [clinic start generated code]*/ static PyObject * _locale_setlocale_impl(PyObject *module, int category, const char *locale) /*[clinic end generated code: output=a0e777ae5d2ff117 input=dbe18f1d66c57a6a]*/ { … } static int locale_is_ascii(const char *str) { … } static int is_all_ascii(const char *str) { … } static int locale_decode_monetary(PyObject *dict, struct lconv *lc) { … } /*[clinic input] _locale.localeconv Returns numeric and monetary locale-specific parameters. [clinic start generated code]*/ static PyObject * _locale_localeconv_impl(PyObject *module) /*[clinic end generated code: output=43a54515e0a2aef5 input=f1132d15accf4444]*/ { … } #if defined(HAVE_WCSCOLL) /*[clinic input] _locale.strcoll os1: unicode os2: unicode / Compares two strings according to the locale. [clinic start generated code]*/ static PyObject * _locale_strcoll_impl(PyObject *module, PyObject *os1, PyObject *os2) /*[clinic end generated code: output=82ddc6d62c76d618 input=693cd02bcbf38dd8]*/ { … } #endif #ifdef HAVE_WCSXFRM /*[clinic input] _locale.strxfrm string as str: unicode / Return a string that can be used as a key for locale-aware comparisons. [clinic start generated code]*/ static PyObject * _locale_strxfrm_impl(PyObject *module, PyObject *str) /*[clinic end generated code: output=3081866ebffc01af input=1378bbe6a88b4780]*/ { … } #endif #if defined(MS_WINDOWS) /*[clinic input] _locale._getdefaultlocale [clinic start generated code]*/ static PyObject * _locale__getdefaultlocale_impl(PyObject *module) /*[clinic end generated code: output=e6254088579534c2 input=003ea41acd17f7c7]*/ { char encoding[20]; char locale[100]; PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, locale, sizeof(locale))) { Py_ssize_t i = strlen(locale); locale[i++] = '_'; if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, locale+i, (int)(sizeof(locale)-i))) return Py_BuildValue("ss", locale, encoding); } /* If we end up here, this windows version didn't know about ISO639/ISO3166 names (it's probably Windows 95). Return the Windows language identifier instead (a hexadecimal number) */ locale[0] = '0'; locale[1] = 'x'; if (GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTLANGUAGE, locale+2, sizeof(locale)-2)) { return Py_BuildValue("ss", locale, encoding); } /* cannot determine the language code (very unlikely) */ Py_INCREF(Py_None); return Py_BuildValue("Os", Py_None, encoding); } #endif #ifdef HAVE_LANGINFO_H #define LANGINFO(X, Y) … static struct langinfo_constant{ … } langinfo_constants[] = …; /* Temporary make the LC_CTYPE locale to be the same as * the locale of the specified category. */ static int change_locale(int category, char **oldloc) { … } /* Restore the old LC_CTYPE locale. */ static void restore_locale(char *oldloc) { … } #ifdef __GLIBC__ #if defined(ALT_DIGITS) || defined(ERA) static PyObject * decode_strings(const char *result, size_t max_count) { … } #endif #endif /*[clinic input] _locale.nl_langinfo key as item: int / Return the value for the locale information associated with key. [clinic start generated code]*/ static PyObject * _locale_nl_langinfo_impl(PyObject *module, int item) /*[clinic end generated code: output=6aea457b47e077a3 input=00798143eecfeddc]*/ { … } #endif /* HAVE_LANGINFO_H */ #ifdef HAVE_LIBINTL_H /*[clinic input] _locale.gettext msg as in: str / gettext(msg) -> string Return translation of msg. [clinic start generated code]*/ static PyObject * _locale_gettext_impl(PyObject *module, const char *in) /*[clinic end generated code: output=493bb4b38a4704fe input=949fc8efc2bb3bc3]*/ { … } /*[clinic input] _locale.dgettext domain: str(accept={str, NoneType}) msg as in: str / dgettext(domain, msg) -> string Return translation of msg in domain. [clinic start generated code]*/ static PyObject * _locale_dgettext_impl(PyObject *module, const char *domain, const char *in) /*[clinic end generated code: output=3c0cd5287b972c8f input=a277388a635109d8]*/ { … } /*[clinic input] _locale.dcgettext domain: str(accept={str, NoneType}) msg as msgid: str category: int / Return translation of msg in domain and category. [clinic start generated code]*/ static PyObject * _locale_dcgettext_impl(PyObject *module, const char *domain, const char *msgid, int category) /*[clinic end generated code: output=0f4cc4fce0aa283f input=ec5f8fed4336de67]*/ { … } /*[clinic input] _locale.textdomain domain: str(accept={str, NoneType}) / Set the C library's textdmain to domain, returning the new domain. [clinic start generated code]*/ static PyObject * _locale_textdomain_impl(PyObject *module, const char *domain) /*[clinic end generated code: output=7992df06aadec313 input=66359716f5eb1d38]*/ { … } /*[clinic input] _locale.bindtextdomain domain: str dir as dirname_obj: object / Bind the C library's domain to dir. [clinic start generated code]*/ static PyObject * _locale_bindtextdomain_impl(PyObject *module, const char *domain, PyObject *dirname_obj) /*[clinic end generated code: output=6d6f3c7b345d785c input=c0dff085acfe272b]*/ { … } #ifdef HAVE_BIND_TEXTDOMAIN_CODESET /*[clinic input] _locale.bind_textdomain_codeset domain: str codeset: str(accept={str, NoneType}) / Bind the C library's domain to codeset. [clinic start generated code]*/ static PyObject * _locale_bind_textdomain_codeset_impl(PyObject *module, const char *domain, const char *codeset) /*[clinic end generated code: output=fa452f9c8b1b9e89 input=23fbe3540400f259]*/ { … } #endif // HAVE_BIND_TEXTDOMAIN_CODESET #endif // HAVE_LIBINTL_H /*[clinic input] _locale.getencoding Get the current locale encoding. [clinic start generated code]*/ static PyObject * _locale_getencoding_impl(PyObject *module) /*[clinic end generated code: output=86b326b971872e46 input=6503d11e5958b360]*/ { … } static struct PyMethodDef PyLocale_Methods[] = …; static int _locale_exec(PyObject *module) { … } static struct PyModuleDef_Slot _locale_slots[] = …; static int locale_traverse(PyObject *module, visitproc visit, void *arg) { … } static int locale_clear(PyObject *module) { … } static void locale_free(void *module) { … } static struct PyModuleDef _localemodule = …; PyMODINIT_FUNC PyInit__locale(void) { … } /* Local variables: c-basic-offset: 4 indent-tabs-mode: nil End: */