Commit 73d9e2eb authored by Alexandre Julliard's avatar Alexandre Julliard

kernel32: Use RtlCompareUnicodeStrings in CompareStringOrdinal for consistent results.

parent f21cb01a
......@@ -3490,7 +3490,7 @@ INT WINAPI CompareStringA(LCID lcid, DWORD flags,
*/
INT WINAPI CompareStringOrdinal(const WCHAR *str1, INT len1, const WCHAR *str2, INT len2, BOOL ignore_case)
{
int ret, len;
int ret;
if (!str1 || !str2)
{
......@@ -3500,19 +3500,7 @@ INT WINAPI CompareStringOrdinal(const WCHAR *str1, INT len1, const WCHAR *str2,
if (len1 < 0) len1 = strlenW(str1);
if (len2 < 0) len2 = strlenW(str2);
len = min(len1, len2);
if (ignore_case)
{
ret = memicmpW(str1, str2, len);
}
else
{
ret = 0;
for (; len > 0; len--)
if ((ret = (*str1++ - *str2++))) break;
}
if (!ret) ret = len1 - len2;
ret = RtlCompareUnicodeStrings( str1, len1, str2, len2, ignore_case );
if (ret < 0) return CSTR_LESS_THAN;
if (ret > 0) return CSTR_GREATER_THAN;
return CSTR_EQUAL;
......
......@@ -71,7 +71,6 @@ static inline BOOL isdigitW( WCHAR wc )
}
/* Some functions are only in later versions of kernel32.dll */
static HMODULE hKernel32;
static WORD enumCount;
static INT (WINAPI *pGetTimeFormatEx)(LPCWSTR, DWORD, const SYSTEMTIME *, LPCWSTR, LPWSTR, INT);
......@@ -99,12 +98,13 @@ static INT (WINAPI *pGetGeoInfoW)(GEOID, GEOTYPE, LPWSTR, INT, LANGID);
static BOOL (WINAPI *pEnumSystemGeoID)(GEOCLASS, GEOID, GEO_ENUMPROC);
static BOOL (WINAPI *pGetSystemPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
static BOOL (WINAPI *pGetThreadPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
static WCHAR (WINAPI *pRtlUpcaseUnicodeChar)(WCHAR);
static void InitFunctionPointers(void)
{
hKernel32 = GetModuleHandleA("kernel32");
HMODULE mod = GetModuleHandleA("kernel32");
#define X(f) p##f = (void*)GetProcAddress(hKernel32, #f)
#define X(f) p##f = (void*)GetProcAddress(mod, #f)
X(GetTimeFormatEx);
X(GetDateFormatEx);
X(EnumSystemLanguageGroupsA);
......@@ -129,6 +129,9 @@ static void InitFunctionPointers(void)
X(EnumSystemGeoID);
X(GetSystemPreferredUILanguages);
X(GetThreadPreferredUILanguages);
mod = GetModuleHandleA("ntdll");
X(RtlUpcaseUnicodeChar);
#undef X
}
......@@ -4209,6 +4212,7 @@ static void test_CompareStringOrdinal(void)
WCHAR coop2[] = { 'c','o','o','p',0 };
WCHAR nonascii1[] = { 0x0102,0 };
WCHAR nonascii2[] = { 0x0201,0 };
WCHAR ch1, ch2;
if (!pCompareStringOrdinal)
{
......@@ -4265,6 +4269,21 @@ static void test_CompareStringOrdinal(void)
ok(ret == CSTR_LESS_THAN, "Got %u, expected %u\n", ret, CSTR_LESS_THAN);
ret = pCompareStringOrdinal(nonascii1, -1, nonascii2, -1, TRUE);
ok(ret == CSTR_LESS_THAN, "Got %u, expected %u\n", ret, CSTR_LESS_THAN);
for (ch1 = 0; ch1 < 512; ch1++)
{
for (ch2 = 0; ch2 < 1024; ch2++)
{
int diff = ch1 - ch2;
ret = pCompareStringOrdinal( &ch1, 1, &ch2, 1, FALSE );
ok( ret == (diff > 0 ? CSTR_GREATER_THAN : diff < 0 ? CSTR_LESS_THAN : CSTR_EQUAL),
"wrong result %d %04x %04x\n", ret, ch1, ch2 );
diff = pRtlUpcaseUnicodeChar( ch1 ) - pRtlUpcaseUnicodeChar( ch2 );
ret = pCompareStringOrdinal( &ch1, 1, &ch2, 1, TRUE );
ok( ret == (diff > 0 ? CSTR_GREATER_THAN : diff < 0 ? CSTR_LESS_THAN : CSTR_EQUAL),
"wrong result %d %04x %04x\n", ret, ch1, ch2 );
}
}
}
static void test_GetGeoInfo(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment