On 10/30/2012 01:43, Christian Costa wrote:
Try 2:
- Don't use CompareStringEx.
- Add tests
dlls/kernel32/kernel32.spec | 1 + dlls/kernel32/locale.c | 28 ++++++++++++++++++++ dlls/kernel32/tests/locale.c | 60 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index b7efa0f..0bd1adc 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -201,6 +201,7 @@ @ stdcall CompareStringA(long long str long str long) @ stdcall CompareStringW(long long wstr long wstr long) @ stdcall CompareStringEx(wstr long wstr long wstr long ptr ptr long) +@ stdcall CompareStringOrdinal(wstr long wstr long long) @ stdcall ConnectNamedPipe(long ptr) @ stub ConsoleMenuControl @ stub ConsoleSubst diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index c41442c..07eb688 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -3047,6 +3047,34 @@ INT WINAPI CompareStringA(LCID lcid, DWORD flags, return ret; }
+/******************************************************************************
CompareStringOrdinal (KERNEL32.@)
- */
+INT WINAPI CompareStringOrdinal(const WCHAR *str1, INT len1, const WCHAR *str2, INT len2, BOOL ignore_case) +{
- int ret, len;
- if (!str1 || !str2)
- {
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
- }
- if (len1 < 0) len1 = strlenW(str1);
- if (len2 < 0) len2 = strlenW(str2);
- len = min(len1, len2);
- if (ignore_case)
ret = strncmpiW(str1, str2, len);
- else
ret = strncmpW(str1, str2, len);
- if ((ret < 0) || (!ret && (len1 < len2)))
return CSTR_LESS_THAN;
- else if ((ret > 0) || (!ret && (len1 > len2)))
return CSTR_GREATER_THAN;
- return CSTR_EQUAL;
+}
This is almost the same as your first try. You're testing a trivial case only - ASCII range. I feel like it should behave more like memcmp for case insensitive comparison, that's what documentation mildly suggests.