[PATCH] kernel32: Implement CompareStringOrdinal. (try 2)
Christian Costa
titan.costa at gmail.com
Tue Oct 30 02:42:20 CDT 2012
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?
More information about the wine-devel
mailing list