diff options
Diffstat (limited to 'Modules/_winapi.c')
-rw-r--r-- | Modules/_winapi.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 3e24d512ca..9b30a90032 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -1513,6 +1513,74 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size) } /*[clinic input] +_winapi.LCMapStringEx + + locale: unicode + flags: DWORD + src: unicode + +[clinic start generated code]*/ + +static PyObject * +_winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags, + PyObject *src) +/*[clinic end generated code: output=8ea4c9d85a4a1f23 input=2fa6ebc92591731b]*/ +{ + if (flags & (LCMAP_SORTHANDLE | LCMAP_HASH | LCMAP_BYTEREV | + LCMAP_SORTKEY)) { + return PyErr_Format(PyExc_ValueError, "unsupported flags"); + } + + wchar_t *locale_ = PyUnicode_AsWideCharString(locale, NULL); + if (!locale_) { + return NULL; + } + Py_ssize_t srcLenAsSsize; + int srcLen; + wchar_t *src_ = PyUnicode_AsWideCharString(src, &srcLenAsSsize); + if (!src_) { + PyMem_Free(locale_); + return NULL; + } + srcLen = (int)srcLenAsSsize; + if (srcLen != srcLenAsSsize) { + srcLen = -1; + } + + int dest_size = LCMapStringEx(locale_, flags, src_, srcLen, NULL, 0, + NULL, NULL, 0); + if (dest_size == 0) { + PyMem_Free(locale_); + PyMem_Free(src_); + return PyErr_SetFromWindowsErr(0); + } + + wchar_t* dest = PyMem_NEW(wchar_t, dest_size); + if (dest == NULL) { + PyMem_Free(locale_); + PyMem_Free(src_); + return PyErr_NoMemory(); + } + + int nmapped = LCMapStringEx(locale_, flags, src_, srcLen, dest, dest_size, + NULL, NULL, 0); + if (nmapped == 0) { + DWORD error = GetLastError(); + PyMem_Free(locale_); + PyMem_Free(src_); + PyMem_DEL(dest); + return PyErr_SetFromWindowsErr(error); + } + + PyObject *ret = PyUnicode_FromWideChar(dest, dest_size); + PyMem_Free(locale_); + PyMem_Free(src_); + PyMem_DEL(dest); + + return ret; +} + +/*[clinic input] _winapi.ReadFile handle: HANDLE @@ -2023,6 +2091,7 @@ static PyMethodDef winapi_functions[] = { _WINAPI_OPENFILEMAPPING_METHODDEF _WINAPI_OPENPROCESS_METHODDEF _WINAPI_PEEKNAMEDPIPE_METHODDEF + _WINAPI_LCMAPSTRINGEX_METHODDEF _WINAPI_READFILE_METHODDEF _WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF _WINAPI_TERMINATEPROCESS_METHODDEF @@ -2160,6 +2229,22 @@ static int winapi_exec(PyObject *m) WINAPI_CONSTANT(F_DWORD, FILE_TYPE_PIPE); WINAPI_CONSTANT(F_DWORD, FILE_TYPE_REMOTE); + WINAPI_CONSTANT("u", LOCALE_NAME_INVARIANT); + WINAPI_CONSTANT(F_DWORD, LOCALE_NAME_MAX_LENGTH); + WINAPI_CONSTANT("u", LOCALE_NAME_SYSTEM_DEFAULT); + WINAPI_CONSTANT("u", LOCALE_NAME_USER_DEFAULT); + + WINAPI_CONSTANT(F_DWORD, LCMAP_FULLWIDTH); + WINAPI_CONSTANT(F_DWORD, LCMAP_HALFWIDTH); + WINAPI_CONSTANT(F_DWORD, LCMAP_HIRAGANA); + WINAPI_CONSTANT(F_DWORD, LCMAP_KATAKANA); + WINAPI_CONSTANT(F_DWORD, LCMAP_LINGUISTIC_CASING); + WINAPI_CONSTANT(F_DWORD, LCMAP_LOWERCASE); + WINAPI_CONSTANT(F_DWORD, LCMAP_SIMPLIFIED_CHINESE); + WINAPI_CONSTANT(F_DWORD, LCMAP_TITLECASE); + WINAPI_CONSTANT(F_DWORD, LCMAP_TRADITIONAL_CHINESE); + WINAPI_CONSTANT(F_DWORD, LCMAP_UPPERCASE); + WINAPI_CONSTANT("i", NULL); return 0; |