Le 30/10/2012 08:21, Nikolay Sivov a écrit :
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.
Well, It's not the same implementation. It's ordinal now. I have test
for that.
And how can memcmp be used for insensitive comparison?
Do you have a concrete example that does not work with this implementation?