Juan Lang : kernel: Use the WinXP method for comparing strings with embedded NULLs. Update tests.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 22 06:17:04 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 22d7f141449a4981073b78d1c933a8cded0e7684
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=22d7f141449a4981073b78d1c933a8cded0e7684

Author: Juan Lang <juan_lang at yahoo.com>
Date:   Wed Jun 21 14:53:45 2006 -0700

kernel: Use the WinXP method for comparing strings with embedded NULLs. Update tests.

---

 dlls/kernel/tests/locale.c |   14 ++++++++++++--
 libs/unicode/sortkey.c     |    5 ++---
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel/tests/locale.c b/dlls/kernel/tests/locale.c
index c099930..d7c0eee 100644
--- a/dlls/kernel/tests/locale.c
+++ b/dlls/kernel/tests/locale.c
@@ -928,11 +928,21 @@ static void test_CompareStringA(void)
     ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLuZkUtZ", 7, "aLuZkUtZ\0A", 10);
     ok(ret == 1, "aLuZkUtZ vs aLuZkUtZ\\0A expected 1, got %d\n", ret);
 
+    /* WinXP handles embedded NULLs differently than earlier versions */
     ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLuZkUtZ", 8, "aLuZkUtZ\0A", 10);
-    ok(ret == 2, "aLuZkUtZ vs aLuZkUtZ\\0A expected 2, got %d\n", ret);
+    ok(ret == 1 || ret == 2, "aLuZkUtZ vs aLuZkUtZ\\0A expected 1 or 2, got %d\n", ret);
 
     ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLu\0ZkUtZ", 8, "aLu\0ZkUtZ\0A", 10);
-    ok(ret == 2, "aLu\\0ZkUtZ vs aLu\\0ZkUtZ\\0A expected 2, got %d\n", ret);
+    ok(ret == 1 || ret == 2, "aLu\\0ZkUtZ vs aLu\\0ZkUtZ\\0A expected 1 or 2, got %d\n", ret);
+
+    ret = CompareStringA(lcid, 0, "a\0b", -1, "a", -1);
+    ok(ret == 2, "a vs a expected 2, got %d\n", ret);
+
+    ret = CompareStringA(lcid, 0, "a\0b", 4, "a", 2);
+    ok(ret == 3, "a\\0b vs a expected 3, got %d\n", ret);
+
+    ret = CompareStringA(lcid, 0, "\1\0\2", 4, "\1\0\1", 4);
+    todo_wine ok(ret != 2, "\\1\\0\\2 vs \\1\\0\\1 expected unequal\n");
 }
 
 static void test_LCMapStringA(void)
diff --git a/libs/unicode/sortkey.c b/libs/unicode/sortkey.c
index 67c2e8d..17b5537 100644
--- a/libs/unicode/sortkey.c
+++ b/libs/unicode/sortkey.c
@@ -326,9 +326,8 @@ static inline int compare_case_weights(i
 
 static inline int real_length(const WCHAR *str, int len)
 {
-    int real_len = 0;
-    while (len-- && *str++) real_len++;
-    return real_len;
+    while (len && !str[len - 1]) len--;
+    return len;
 }
 
 int wine_compare_string(int flags, const WCHAR *str1, int len1,




More information about the wine-cvs mailing list