ntdll: test and fix _wcslwr and _wcsupr (try 2)

André Hentschel nerv at dawncrow.de
Wed Sep 7 11:03:17 CDT 2011


native seems to check if the string is empty so it doesn't matter if it's empty and constant.
---
 dlls/ntdll/tests/string.c |   32 ++++++++++++++++++++++++++++----
 dlls/ntdll/wcstring.c     |    2 ++
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c
index 14464d9..9422d41 100644
--- a/dlls/ntdll/tests/string.c
+++ b/dlls/ntdll/tests/string.c
@@ -51,8 +51,8 @@ static LPWSTR   (WINAPIV *p_ultow)(ULONG, LPWSTR, INT);
 static LPWSTR   (WINAPIV *p_i64tow)(LONGLONG, LPWSTR, INT);
 static LPWSTR   (WINAPIV *p_ui64tow)(ULONGLONG, LPWSTR, INT);
 
-static long     (WINAPIV *pwcstol)(LPCWSTR, LPWSTR *, INT);
-static ULONG    (WINAPIV *pwcstoul)(LPCWSTR, LPWSTR *, INT);
+static LPWSTR   (__cdecl *p_wcslwr)(LPWSTR);
+static LPWSTR   (__cdecl *p_wcsupr)(LPWSTR);
 
 static LPWSTR   (WINAPIV *p_wcschr)(LPCWSTR, WCHAR);
 static LPWSTR   (WINAPIV *p_wcsrchr)(LPCWSTR, WCHAR);
@@ -89,8 +89,8 @@ static void InitFunctionPtrs(void)
 	p_i64tow = (void *)GetProcAddress(hntdll, "_i64tow");
 	p_ui64tow = (void *)GetProcAddress(hntdll, "_ui64tow");
 
-	pwcstol = (void *)GetProcAddress(hntdll, "wcstol");
-	pwcstoul = (void *)GetProcAddress(hntdll, "wcstoul");
+        p_wcslwr = (void *)GetProcAddress(hntdll, "_wcslwr");
+        p_wcsupr = (void *)GetProcAddress(hntdll, "_wcsupr");
 
 	p_wcschr= (void *)GetProcAddress(hntdll, "wcschr");
 	p_wcsrchr= (void *)GetProcAddress(hntdll, "wcsrchr");
@@ -1143,6 +1143,28 @@ static void test_wcsrchr(void)
        "wcsrchr should have returned NULL\n");
 }
 
+static void test_wcslwrupr(void)
+{
+    static WCHAR teststringW[] = {'a','b','r','a','c','a','d','a','b','r','a',0};
+    static WCHAR emptyW[1] = {0};
+    static const WCHAR constemptyW[1] = {0};
+
+    if (0) /* crashes on native */
+    {
+        static const WCHAR conststringW[] = {'a','b','r','a','c','a','d','a','b','r','a',0};
+        ok(p_wcslwr((LPWSTR)conststringW) == conststringW, "p_wcslwr returned different string\n");
+        ok(p_wcsupr((LPWSTR)conststringW) == conststringW, "p_wcsupr returned different string\n");
+        ok(p_wcslwr(NULL) == NULL, "p_wcslwr didn't returned NULL\n");
+        ok(p_wcsupr(NULL) == NULL, "p_wcsupr didn't returned NULL\n");
+    }
+    ok(p_wcslwr(teststringW) == teststringW, "p_wcslwr returned different string\n");
+    ok(p_wcsupr(teststringW) == teststringW, "p_wcsupr returned different string\n");
+    ok(p_wcslwr(emptyW) == emptyW, "p_wcslwr returned different string\n");
+    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");
+}
+
 static __cdecl int intcomparefunc(const void *a, const void *b)
 {
     const int *p = a, *q = b;
@@ -1272,6 +1294,8 @@ START_TEST(string)
         test_wcschr();
     if (p_wcsrchr)
         test_wcsrchr();
+    if (p_wcslwr && p_wcsupr)
+        test_wcslwrupr();
     if (patoi)
         test_atoi();
     if (patol)
diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c
index 7f0035d..88f7acf 100644
--- a/dlls/ntdll/wcstring.c
+++ b/dlls/ntdll/wcstring.c
@@ -47,6 +47,7 @@ INT __cdecl NTDLL__wcsicmp( LPCWSTR str1, LPCWSTR str2 )
  */
 LPWSTR __cdecl NTDLL__wcslwr( LPWSTR str )
 {
+    if (!*str) return str;
     return strlwrW( str );
 }
 
@@ -65,6 +66,7 @@ INT __cdecl NTDLL__wcsnicmp( LPCWSTR str1, LPCWSTR str2, INT n )
  */
 LPWSTR __cdecl NTDLL__wcsupr( LPWSTR str )
 {
+    if (!*str) return str;
     return struprW( str );
 }
 
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list