Alexandre Julliard : ntdll: Don't handle the full Unicode character range in wcslwr/wcsupr.

Alexandre Julliard julliard at winehq.org
Wed Mar 11 17:38:30 CDT 2020


Module: wine
Branch: master
Commit: 5a4cc97a3bcbae46e5645deb2231f464fd553ed7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5a4cc97a3bcbae46e5645deb2231f464fd553ed7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Mar  9 14:32:37 2020 +0100

ntdll: Don't handle the full Unicode character range in wcslwr/wcsupr.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/string.c | 13 +++++++++++++
 dlls/ntdll/wcstring.c     | 20 ++++++++++++++++++--
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c
index b9dfda7c19..1ec5f3a278 100644
--- a/dlls/ntdll/tests/string.c
+++ b/dlls/ntdll/tests/string.c
@@ -1157,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};
+    WCHAR buffer[65536];
     int i;
 
     if (0) /* crashes on native */
@@ -1181,6 +1182,18 @@ static void test_wcslwrupr(void)
         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 );
     }
+
+    for (i = 1; i < 65536; i++) buffer[i - 1] = i;
+    buffer[65535] = 0;
+    p_wcslwr( buffer );
+    for (i = 1; i < 65536; i++)
+        ok( buffer[i - 1] == (i >= 'A' && i <= 'Z' ? i + 32 : i), "%04x: got %04x\n", i, buffer[i-1] );
+
+    for (i = 1; i < 65536; i++) buffer[i - 1] = i;
+    buffer[65535] = 0;
+    p_wcsupr( buffer );
+    for (i = 1; i < 65536; i++)
+        ok( buffer[i - 1] == (i >= 'a' && i <= 'z' ? i - 32 : i), "%04x: got %04x\n", i, buffer[i-1] );
 }
 
 static int __cdecl intcomparefunc(const void *a, const void *b)
diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c
index fe18af7170..15a6a15531 100644
--- a/dlls/ntdll/wcstring.c
+++ b/dlls/ntdll/wcstring.c
@@ -47,7 +47,15 @@ INT __cdecl NTDLL__wcsicmp( LPCWSTR str1, LPCWSTR str2 )
  */
 LPWSTR __cdecl NTDLL__wcslwr( LPWSTR str )
 {
-    return strlwrW( str );
+    WCHAR *ret = str;
+
+    while (*str)
+    {
+        WCHAR ch = *str;
+        if (ch >= 'A' && ch <= 'Z') ch += 32;
+        *str++ = ch;
+    }
+    return ret;
 }
 
 
@@ -65,7 +73,15 @@ INT __cdecl NTDLL__wcsnicmp( LPCWSTR str1, LPCWSTR str2, INT n )
  */
 LPWSTR __cdecl NTDLL__wcsupr( LPWSTR str )
 {
-    return struprW( str );
+    WCHAR *ret = str;
+
+    while (*str)
+    {
+        WCHAR ch = *str;
+        if (ch >= 'a' && ch <= 'z') ch -= 32;
+        *str++ = ch;
+    }
+    return ret;
 }
 
 




More information about the wine-cvs mailing list