From 22d7f141449a4981073b78d1c933a8cded0e7684 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Wed, 21 Jun 2006 14:53:45 -0700 Subject: [PATCH] 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 c09993054ca..d7c0eee761b 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 67c2e8d476b..17b55374c51 100644 --- a/libs/unicode/sortkey.c +++ b/libs/unicode/sortkey.c @@ -326,9 +326,8 @@ static inline int compare_case_weights(int flags, const WCHAR *str1, int len1, 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, -- 2.11.4.GIT