@@ -1512,6 +1512,74 @@ _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
+ Py_ssize_t srcLenAsSsize ;
1539
+ int srcLen ;
1540
+ wchar_t * src_ = PyUnicode_AsWideCharString (src , & srcLenAsSsize );
1541
+ if (!src_ ) {
1542
+ PyMem_Free (locale_ );
1543
+ return NULL ;
1544
+ }
1545
+ srcLen = (int )srcLenAsSsize ;
1546
+ if (srcLen != srcLenAsSsize ) {
1547
+ srcLen = -1 ;
1548
+ }
1549
+
1550
+ int dest_size = LCMapStringEx (locale_ , flags , src_ , srcLen , NULL , 0 ,
1551
+ NULL , NULL , 0 );
1552
+ if (dest_size == 0 ) {
1553
+ PyMem_Free (locale_ );
1554
+ PyMem_Free (src_ );
1555
+ return PyErr_SetFromWindowsErr (0 );
1556
+ }
1557
+
1558
+ wchar_t * dest = PyMem_NEW (wchar_t , dest_size );
1559
+ if (dest == NULL ) {
1560
+ PyMem_Free (locale_ );
1561
+ PyMem_Free (src_ );
1562
+ return PyErr_NoMemory ();
1563
+ }
1564
+
1565
+ int nmapped = LCMapStringEx (locale_ , flags , src_ , srcLen , dest , dest_size ,
1566
+ NULL , NULL , 0 );
1567
+ if (nmapped == 0 ) {
1568
+ DWORD error = GetLastError ();
1569
+ PyMem_Free (locale_ );
1570
+ PyMem_Free (src_ );
1571
+ PyMem_DEL (dest );
1572
+ return PyErr_SetFromWindowsErr (error );
1573
+ }
1574
+
1575
+ PyObject * ret = PyUnicode_FromWideChar (dest , dest_size );
1576
+ PyMem_Free (locale_ );
1577
+ PyMem_Free (src_ );
1578
+ PyMem_DEL (dest );
1579
+
1580
+ return ret ;
1581
+ }
1582
+
1515
1583
/*[clinic input]
1516
1584
_winapi.ReadFile
1517
1585
@@ -2023,6 +2091,7 @@ static PyMethodDef winapi_functions[] = {
2023
2091
_WINAPI_OPENFILEMAPPING_METHODDEF
2024
2092
_WINAPI_OPENPROCESS_METHODDEF
2025
2093
_WINAPI_PEEKNAMEDPIPE_METHODDEF
2094
+ _WINAPI_LCMAPSTRINGEX_METHODDEF
2026
2095
_WINAPI_READFILE_METHODDEF
2027
2096
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
2028
2097
_WINAPI_TERMINATEPROCESS_METHODDEF
@@ -2160,6 +2229,22 @@ static int winapi_exec(PyObject *m)
2160
2229
WINAPI_CONSTANT (F_DWORD , FILE_TYPE_PIPE );
2161
2230
WINAPI_CONSTANT (F_DWORD , FILE_TYPE_REMOTE );
2162
2231
2232
+ WINAPI_CONSTANT ("u" , LOCALE_NAME_INVARIANT );
2233
+ WINAPI_CONSTANT (F_DWORD , LOCALE_NAME_MAX_LENGTH );
2234
+ WINAPI_CONSTANT ("u" , LOCALE_NAME_SYSTEM_DEFAULT );
2235
+ WINAPI_CONSTANT ("u" , LOCALE_NAME_USER_DEFAULT );
2236
+
2237
+ WINAPI_CONSTANT (F_DWORD , LCMAP_FULLWIDTH );
2238
+ WINAPI_CONSTANT (F_DWORD , LCMAP_HALFWIDTH );
2239
+ WINAPI_CONSTANT (F_DWORD , LCMAP_HIRAGANA );
2240
+ WINAPI_CONSTANT (F_DWORD , LCMAP_KATAKANA );
2241
+ WINAPI_CONSTANT (F_DWORD , LCMAP_LINGUISTIC_CASING );
2242
+ WINAPI_CONSTANT (F_DWORD , LCMAP_LOWERCASE );
2243
+ WINAPI_CONSTANT (F_DWORD , LCMAP_SIMPLIFIED_CHINESE );
2244
+ WINAPI_CONSTANT (F_DWORD , LCMAP_TITLECASE );
2245
+ WINAPI_CONSTANT (F_DWORD , LCMAP_TRADITIONAL_CHINESE );
2246
+ WINAPI_CONSTANT (F_DWORD , LCMAP_UPPERCASE );
2247
+
2163
2248
WINAPI_CONSTANT ("i" , NULL );
2164
2249
2165
2250
return 0 ;
0 commit comments