summaryrefslogtreecommitdiffstats
path: root/Modules/_winapi.c
diff options
context:
space:
mode:
authorAN Long <aisk@users.noreply.github.com>2022-06-06 23:47:27 (GMT)
committerGitHub <noreply@github.com>2022-06-06 23:47:27 (GMT)
commit3256b178ed31ee8ed0c04a6e53f67d1ef96cb746 (patch)
treee7a0159b366291d657ebe5c101cbc46513b91850 /Modules/_winapi.c
parentbb0b7689465c3aac3b1d7f68c8990009462c1ae5 (diff)
downloadcpython-3256b178ed31ee8ed0c04a6e53f67d1ef96cb746.zip
cpython-3256b178ed31ee8ed0c04a6e53f67d1ef96cb746.tar.gz
cpython-3256b178ed31ee8ed0c04a6e53f67d1ef96cb746.tar.bz2
bpo-42658: Use LCMapStringEx in ntpath.normcase to match OS behaviour for case-folding (GH-32010)
Diffstat (limited to 'Modules/_winapi.c')
-rw-r--r--Modules/_winapi.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index 3e24d51..4845b4e 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -1513,6 +1513,50 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size)
}
/*[clinic input]
+_winapi.LCMapStringEx
+
+ locale: LPCWSTR
+ flags: DWORD
+ src: LPCWSTR
+
+[clinic start generated code]*/
+
+static PyObject *
+_winapi_LCMapStringEx_impl(PyObject *module, LPCWSTR locale, DWORD flags,
+ LPCWSTR src)
+/*[clinic end generated code: output=cf4713d80e2b47c9 input=9fe26f95d5ab0001]*/
+{
+ if (flags & (LCMAP_SORTHANDLE | LCMAP_HASH | LCMAP_BYTEREV |
+ LCMAP_SORTKEY)) {
+ return PyErr_Format(PyExc_ValueError, "unsupported flags");
+ }
+
+ int dest_size = LCMapStringEx(locale, flags, src, -1, NULL, 0,
+ NULL, NULL, 0);
+ if (dest_size == 0) {
+ return PyErr_SetFromWindowsErr(0);
+ }
+
+ wchar_t* dest = PyMem_NEW(wchar_t, dest_size);
+ if (dest == NULL) {
+ return PyErr_NoMemory();
+ }
+
+ int nmapped = LCMapStringEx(locale, flags, src, -1, dest, dest_size,
+ NULL, NULL, 0);
+ if (nmapped == 0) {
+ DWORD error = GetLastError();
+ PyMem_DEL(dest);
+ return PyErr_SetFromWindowsErr(error);
+ }
+
+ PyObject *ret = PyUnicode_FromWideChar(dest, dest_size - 1);
+ PyMem_DEL(dest);
+
+ return ret;
+}
+
+/*[clinic input]
_winapi.ReadFile
handle: HANDLE
@@ -2023,6 +2067,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 +2205,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;