Alexandre Julliard : ntdll: Use the NLS case mapping table for towlower/towupper.
Alexandre Julliard
julliard at winehq.org
Wed Mar 11 17:38:30 CDT 2020
Module: wine
Branch: master
Commit: 0d6802dcc5332faf4e6883cfd50d258a1741169d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0d6802dcc5332faf4e6883cfd50d258a1741169d
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Mar 9 14:30:42 2020 +0100
ntdll: Use the NLS case mapping table for towlower/towupper.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/locale.c | 19 +++++++++++++++++++
dlls/ntdll/tests/string.c | 15 +++++++++++++++
dlls/ntdll/wcstring.c | 18 ------------------
3 files changed, 34 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index 8833cfa712..8334de172d 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -1572,6 +1572,25 @@ NTSTATUS WINAPI RtlUpcaseUnicodeToOemN( char *dst, DWORD dstlen, DWORD *reslen,
}
+/*********************************************************************
+ * towlower (NTDLL.@)
+ */
+WCHAR __cdecl NTDLL_towlower( WCHAR ch )
+{
+ if (ch >= 0x100) return ch;
+ return casemap( nls_info.LowerCaseTable, ch );
+}
+
+
+/*********************************************************************
+ * towupper (NTDLL.@)
+ */
+WCHAR __cdecl NTDLL_towupper( WCHAR ch )
+{
+ return casemap( nls_info.UpperCaseTable, ch );
+}
+
+
/******************************************************************
* RtlLocaleNameToLcid (NTDLL.@)
*/
diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c
index 548c84fb1d..b9dfda7c19 100644
--- a/dlls/ntdll/tests/string.c
+++ b/dlls/ntdll/tests/string.c
@@ -33,6 +33,7 @@ static NTSTATUS (WINAPI *pRtlUnicodeStringToAnsiString)(STRING *, const UNICODE_
static VOID (WINAPI *pRtlFreeAnsiString)(PSTRING);
static BOOLEAN (WINAPI *pRtlCreateUnicodeStringFromAsciiz)(PUNICODE_STRING,LPCSTR);
static VOID (WINAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
+static WCHAR (WINAPI *pRtlUpcaseUnicodeChar)(WCHAR);
static int (__cdecl *patoi)(const char *);
static LONG (__cdecl *patol)(const char *);
@@ -54,6 +55,8 @@ static LPWSTR (__cdecl *p_ui64tow)(ULONGLONG, LPWSTR, INT);
static LPWSTR (__cdecl *p_wcslwr)(LPWSTR);
static LPWSTR (__cdecl *p_wcsupr)(LPWSTR);
+static WCHAR (__cdecl *ptowlower)(WCHAR);
+static WCHAR (__cdecl *ptowupper)(WCHAR);
static LPWSTR (__cdecl *pwcschr)(LPCWSTR, WCHAR);
static LPWSTR (__cdecl *pwcsrchr)(LPCWSTR, WCHAR);
@@ -78,6 +81,7 @@ static void InitFunctionPtrs(void)
X(RtlFreeAnsiString);
X(RtlCreateUnicodeStringFromAsciiz);
X(RtlFreeUnicodeString);
+ X(RtlUpcaseUnicodeChar);
X(atoi);
X(atol);
X(_atoi64);
@@ -96,6 +100,8 @@ static void InitFunctionPtrs(void)
X(_ui64tow);
X(_wcslwr);
X(_wcsupr);
+ X(towlower);
+ X(towupper);
X(wcschr);
X(wcsrchr);
X(qsort);
@@ -1151,6 +1157,7 @@ static void test_wcslwrupr(void)
static WCHAR teststringW[] = {'a','b','r','a','c','a','d','a','b','r','a',0};
static WCHAR emptyW[] = {0};
static const WCHAR constemptyW[] = {0};
+ int i;
if (0) /* crashes on native */
{
@@ -1166,6 +1173,14 @@ static void test_wcslwrupr(void)
ok(p_wcsupr(emptyW) == emptyW, "p_wcsupr returned different string\n");
ok(p_wcslwr((LPWSTR)constemptyW) == constemptyW, "p_wcslwr returned different string\n");
ok(p_wcsupr((LPWSTR)constemptyW) == constemptyW, "p_wcsupr returned different string\n");
+
+ for (i = 0; i < 65536; i++)
+ {
+ WCHAR lwr = ((i >= 'A' && i <= 'Z') || (i >= 0xc0 && i <= 0xd6) || (i >= 0xd8 && i <= 0xde)) ? i + 32 : i;
+ WCHAR upr = pRtlUpcaseUnicodeChar( i );
+ ok( ptowlower( i ) == lwr, "%04x: towlower got %04x expected %04x\n", i, ptowlower( i ), lwr );
+ ok( ptowupper( i ) == upr, "%04x: towupper got %04x expected %04x\n", i, ptowupper( i ), upr );
+ }
}
static int __cdecl intcomparefunc(const void *a, const void *b)
diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c
index acdb33ac24..fe18af7170 100644
--- a/dlls/ntdll/wcstring.c
+++ b/dlls/ntdll/wcstring.c
@@ -69,24 +69,6 @@ LPWSTR __cdecl NTDLL__wcsupr( LPWSTR str )
}
-/*********************************************************************
- * towlower (NTDLL.@)
- */
-WCHAR __cdecl NTDLL_towlower( WCHAR ch )
-{
- return tolowerW(ch);
-}
-
-
-/*********************************************************************
- * towupper (NTDLL.@)
- */
-WCHAR __cdecl NTDLL_towupper( WCHAR ch )
-{
- return toupperW(ch);
-}
-
-
/***********************************************************************
* wcscat (NTDLL.@)
*/
More information about the wine-cvs
mailing list