ntdll: Don't use strncasecmp for _strnicmp implementation
Jacek Caban
jacek at codeweavers.com
Tue Oct 16 06:12:50 CDT 2012
On 10/16/12 13:08, Marcus Meissner wrote:
> On Tue, Oct 16, 2012 at 12:38:51PM +0200, Jacek Caban wrote:
>> ---
>> dlls/ntdll/string.c | 12 +++++++++++-
>> dlls/ntdll/tests/string.c | 33 +++++++++++++++++++++++++++++++++
>> 2 files changed, 44 insertions(+), 1 deletions(-)
>>
>>
>> diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c
>> index 716dbdf..288e910 100644
>> --- a/dlls/ntdll/string.c
>> +++ b/dlls/ntdll/string.c
>> @@ -254,7 +254,17 @@ int __cdecl _stricmp( LPCSTR str1, LPCSTR str2 )
>> */
>> int __cdecl _strnicmp( LPCSTR str1, LPCSTR str2, size_t n )
>> {
>> - return strncasecmp( str1, str2, n );
>> + int ret = 0;
>> +
>> + /* 32-bit Windows return only -1,0,1 values */
>> + while(n--) {
>> + if(!*str1)
>> + return sizeof(void*) == 4 ? (*str2 ? -1 : 0) : -(unsigned char)*str2;
>> + if((ret = tolower(*str1++) - tolower(*str2++)))
>> + return sizeof(void*) == 4 ? (ret > 0 ? 1 : -1) : ret;
>> + }
> Errm. Why not
>
> int ret = strncasecmp( str1, str2, n );
>
> if (ret < 0 ) return -1;
> if (ret > 0 ) return 1;
> return 0;
That wasn't the original reason for writing this patch. It seems like
some distros (well, at least some Gentoo installations) have broken
strncasecmp.
Jacek
More information about the wine-devel
mailing list