@@ -1512,6 +1512,50 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size)
15121512 }
15131513}
15141514
1515+ /*[clinic input]
1516+ _winapi.LCMapStringEx
1517+
1518+ locale: LPCWSTR
1519+ flags: DWORD
1520+ src: LPCWSTR
1521+
1522+ [clinic start generated code]*/
1523+
1524+ static PyObject *
1525+ _winapi_LCMapStringEx_impl (PyObject * module , LPCWSTR locale , DWORD flags ,
1526+ LPCWSTR src )
1527+ /*[clinic end generated code: output=cf4713d80e2b47c9 input=9fe26f95d5ab0001]*/
1528+ {
1529+ if (flags & (LCMAP_SORTHANDLE | LCMAP_HASH | LCMAP_BYTEREV |
1530+ LCMAP_SORTKEY )) {
1531+ return PyErr_Format (PyExc_ValueError , "unsupported flags" );
1532+ }
1533+
1534+ int dest_size = LCMapStringEx (locale , flags , src , -1 , NULL , 0 ,
1535+ NULL , NULL , 0 );
1536+ if (dest_size == 0 ) {
1537+ return PyErr_SetFromWindowsErr (0 );
1538+ }
1539+
1540+ wchar_t * dest = PyMem_NEW (wchar_t , dest_size );
1541+ if (dest == NULL ) {
1542+ return PyErr_NoMemory ();
1543+ }
1544+
1545+ int nmapped = LCMapStringEx (locale , flags , src , -1 , dest , dest_size ,
1546+ NULL , NULL , 0 );
1547+ if (nmapped == 0 ) {
1548+ DWORD error = GetLastError ();
1549+ PyMem_DEL (dest );
1550+ return PyErr_SetFromWindowsErr (error );
1551+ }
1552+
1553+ PyObject * ret = PyUnicode_FromWideChar (dest , dest_size - 1 );
1554+ PyMem_DEL (dest );
1555+
1556+ return ret ;
1557+ }
1558+
15151559/*[clinic input]
15161560_winapi.ReadFile
15171561
@@ -2023,6 +2067,7 @@ static PyMethodDef winapi_functions[] = {
20232067 _WINAPI_OPENFILEMAPPING_METHODDEF
20242068 _WINAPI_OPENPROCESS_METHODDEF
20252069 _WINAPI_PEEKNAMEDPIPE_METHODDEF
2070+ _WINAPI_LCMAPSTRINGEX_METHODDEF
20262071 _WINAPI_READFILE_METHODDEF
20272072 _WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
20282073 _WINAPI_TERMINATEPROCESS_METHODDEF
@@ -2160,6 +2205,22 @@ static int winapi_exec(PyObject *m)
21602205 WINAPI_CONSTANT (F_DWORD , FILE_TYPE_PIPE );
21612206 WINAPI_CONSTANT (F_DWORD , FILE_TYPE_REMOTE );
21622207
2208+ WINAPI_CONSTANT ("u" , LOCALE_NAME_INVARIANT );
2209+ WINAPI_CONSTANT (F_DWORD , LOCALE_NAME_MAX_LENGTH );
2210+ WINAPI_CONSTANT ("u" , LOCALE_NAME_SYSTEM_DEFAULT );
2211+ WINAPI_CONSTANT ("u" , LOCALE_NAME_USER_DEFAULT );
2212+
2213+ WINAPI_CONSTANT (F_DWORD , LCMAP_FULLWIDTH );
2214+ WINAPI_CONSTANT (F_DWORD , LCMAP_HALFWIDTH );
2215+ WINAPI_CONSTANT (F_DWORD , LCMAP_HIRAGANA );
2216+ WINAPI_CONSTANT (F_DWORD , LCMAP_KATAKANA );
2217+ WINAPI_CONSTANT (F_DWORD , LCMAP_LINGUISTIC_CASING );
2218+ WINAPI_CONSTANT (F_DWORD , LCMAP_LOWERCASE );
2219+ WINAPI_CONSTANT (F_DWORD , LCMAP_SIMPLIFIED_CHINESE );
2220+ WINAPI_CONSTANT (F_DWORD , LCMAP_TITLECASE );
2221+ WINAPI_CONSTANT (F_DWORD , LCMAP_TRADITIONAL_CHINESE );
2222+ WINAPI_CONSTANT (F_DWORD , LCMAP_UPPERCASE );
2223+
21632224 WINAPI_CONSTANT ("i" , NULL );
21642225
21652226 return 0 ;
0 commit comments