@@ -1512,6 +1512,68 @@ _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size)
1512
1512
}
1513
1513
}
1514
1514
1515
+ /*[clinic input]
1516
+ _winapi.LCMapStringEx
1517
+
1518
+ locale: unicode
1519
+ flags: DWORD
1520
+ src: unicode
1521
+
1522
+ [clinic start generated code]*/
1523
+
1524
+ static PyObject *
1525
+ _winapi_LCMapStringEx_impl (PyObject * module , PyObject * locale , DWORD flags ,
1526
+ PyObject * src )
1527
+ /*[clinic end generated code: output=8ea4c9d85a4a1f23 input=2fa6ebc92591731b]*/
1528
+ {
1529
+ if (flags & (LCMAP_SORTHANDLE | LCMAP_HASH | LCMAP_BYTEREV |
1530
+ LCMAP_SORTKEY )) {
1531
+ return PyErr_Format (PyExc_ValueError , "unsupported flags" );
1532
+ }
1533
+
1534
+ wchar_t * locale_ = PyUnicode_AsWideCharString (locale , NULL );
1535
+ if (!locale_ ) {
1536
+ return NULL ;
1537
+ }
1538
+ wchar_t * src_ = PyUnicode_AsWideCharString (src , NULL );
1539
+ if (!src_ ) {
1540
+ PyMem_Free (locale_ );
1541
+ return NULL ;
1542
+ }
1543
+
1544
+ int dest_size = LCMapStringEx (locale_ , flags , src_ , -1 , NULL , 0 ,
1545
+ NULL , NULL , 0 );
1546
+ if (dest_size == 0 ) {
1547
+ PyMem_Free (locale_ );
1548
+ PyMem_Free (src_ );
1549
+ return PyErr_SetFromWindowsErr (0 );
1550
+ }
1551
+
1552
+ wchar_t * dest = PyMem_NEW (wchar_t , dest_size );
1553
+ if (dest == NULL ) {
1554
+ PyMem_Free (locale_ );
1555
+ PyMem_Free (src_ );
1556
+ return PyErr_NoMemory ();
1557
+ }
1558
+
1559
+ int nmapped = LCMapStringEx (locale_ , flags , src_ , -1 , dest , dest_size ,
1560
+ NULL , NULL , 0 );
1561
+ if (nmapped == 0 ) {
1562
+ DWORD error = GetLastError ();
1563
+ PyMem_Free (locale_ );
1564
+ PyMem_Free (src_ );
1565
+ PyMem_DEL (dest );
1566
+ return PyErr_SetFromWindowsErr (error );
1567
+ }
1568
+
1569
+ PyObject * ret = PyUnicode_FromWideChar (dest , dest_size - 1 );
1570
+ PyMem_Free (locale_ );
1571
+ PyMem_Free (src_ );
1572
+ PyMem_DEL (dest );
1573
+
1574
+ return ret ;
1575
+ }
1576
+
1515
1577
/*[clinic input]
1516
1578
_winapi.ReadFile
1517
1579
@@ -2023,6 +2085,7 @@ static PyMethodDef winapi_functions[] = {
2023
2085
_WINAPI_OPENFILEMAPPING_METHODDEF
2024
2086
_WINAPI_OPENPROCESS_METHODDEF
2025
2087
_WINAPI_PEEKNAMEDPIPE_METHODDEF
2088
+ _WINAPI_LCMAPSTRINGEX_METHODDEF
2026
2089
_WINAPI_READFILE_METHODDEF
2027
2090
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
2028
2091
_WINAPI_TERMINATEPROCESS_METHODDEF
@@ -2160,6 +2223,22 @@ static int winapi_exec(PyObject *m)
2160
2223
WINAPI_CONSTANT (F_DWORD , FILE_TYPE_PIPE );
2161
2224
WINAPI_CONSTANT (F_DWORD , FILE_TYPE_REMOTE );
2162
2225
2226
+ WINAPI_CONSTANT ("u" , LOCALE_NAME_INVARIANT );
2227
+ WINAPI_CONSTANT (F_DWORD , LOCALE_NAME_MAX_LENGTH );
2228
+ WINAPI_CONSTANT ("u" , LOCALE_NAME_SYSTEM_DEFAULT );
2229
+ WINAPI_CONSTANT ("u" , LOCALE_NAME_USER_DEFAULT );
2230
+
2231
+ WINAPI_CONSTANT (F_DWORD , LCMAP_FULLWIDTH );
2232
+ WINAPI_CONSTANT (F_DWORD , LCMAP_HALFWIDTH );
2233
+ WINAPI_CONSTANT (F_DWORD , LCMAP_HIRAGANA );
2234
+ WINAPI_CONSTANT (F_DWORD , LCMAP_KATAKANA );
2235
+ WINAPI_CONSTANT (F_DWORD , LCMAP_LINGUISTIC_CASING );
2236
+ WINAPI_CONSTANT (F_DWORD , LCMAP_LOWERCASE );
2237
+ WINAPI_CONSTANT (F_DWORD , LCMAP_SIMPLIFIED_CHINESE );
2238
+ WINAPI_CONSTANT (F_DWORD , LCMAP_TITLECASE );
2239
+ WINAPI_CONSTANT (F_DWORD , LCMAP_TRADITIONAL_CHINESE );
2240
+ WINAPI_CONSTANT (F_DWORD , LCMAP_UPPERCASE );
2241
+
2163
2242
WINAPI_CONSTANT ("i" , NULL );
2164
2243
2165
2244
return 0 ;
0 commit comments