[PATCH] kernel32: Implement CompareStringOrdinal. (try 2)

Nikolay Sivov bunglehead at gmail.com
Tue Oct 30 02:21:49 CDT 2012


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.



More information about the wine-devel mailing list