From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 59 +++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 48 insertions(+), 27 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 68b8b2f713d..36452977926 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1162,7 +1162,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 456821a0b2c..b057d5b85ad 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1519,7 +1519,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index d8963036835..5f24c3f7971 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1530,7 +1530,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 2482c2cb340..42e215d7f79 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -834,7 +834,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 7fa54577b02..be847415309 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -812,7 +812,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 587f8382a45..613de8b591e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1300,28 +1300,49 @@ int CDECL _mbsnbcmp(const unsigned char* str, const unsigned char* cmp, size_t l * * Compare two multibyte strings case insensitively to 'len' characters. */ -int CDECL _mbsnicmp(const unsigned char* str, const unsigned char* cmp, size_t len) +int CDECL _mbsnicmp_l(const unsigned char* str, const unsigned char* cmp, size_t len, _locale_t locale) { - /* FIXME: No tolower() for mb strings yet */ - if(get_mbcinfo()->ismbcodepage) - { - unsigned int strc, cmpc; - while(len--) + pthreadmbcinfo mbcinfo; + + if (!len) + return 0; + if (!MSVCRT_CHECK_PMT(str && cmp)) + return _NLSCMPERROR; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + /* FIXME: No tolower() for mb strings yet */ + if (mbcinfo->ismbcodepage) { - if(!*str) - return *cmp ? -1 : 0; - if(!*cmp) - return 1; - strc = _mbctolower(_mbsnextc(str)); - cmpc = _mbctolower(_mbsnextc(cmp)); - if(strc != cmpc) - return strc < cmpc ? -1 : 1; - str +=(strc > 255) ? 2 : 1; - cmp +=(strc > 255) ? 2 : 1; /* Equal, use same increment */ + unsigned int strc, cmpc; + while (len--) + { + if (!*str) + return *cmp ? -1 : 0; + if (!*cmp) + return 1; + strc = _mbctolower_l(_mbsnextc_l(str, locale), locale); + cmpc = _mbctolower_l(_mbsnextc_l(cmp, locale), locale); + if (strc != cmpc) + return strc < cmpc ? -1 : 1; + str += (strc > 255) ? 2 : 1; + cmp += (strc > 255) ? 2 : 1; /* Equal, use same increment */ + } + return 0; /* Matched len chars */ } - return 0; /* Matched len chars */ - } - return u_strncasecmp(str, cmp, len); /* ASCII CP */ + return u_strncasecmp(str, cmp, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsnicmp(MSVCRT.@) + * + * Compare two multibyte strings case insensitively to 'len' characters. + */ +int CDECL _mbsnicmp(const unsigned char* str, const unsigned char* cmp, size_t len) +{ + return _mbsnicmp_l(str, cmp, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index b603f71a6bd..a997a4e61d5 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -783,7 +783,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -# stub _mbsnicmp_l(str str long ptr) +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) # stub _mbsnicoll_l(str str long ptr) @ cdecl _mbsninc(str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index c5127f5059f..f0b078e09e7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -678,7 +678,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @@ -1247,7 +1247,7 @@ @ cdecl _o__mbsnextc(str) _mbsnextc @ cdecl _o__mbsnextc_l(str ptr) _mbsnextc_l @ cdecl _o__mbsnicmp(str str long) _mbsnicmp -@ stub _o__mbsnicmp_l +@ cdecl _o__mbsnicmp_l(str str long ptr) _mbsnicmp_l @ stub _o__mbsnicoll @ stub _o__mbsnicoll_l @ cdecl _o__mbsninc(str long) _mbsninc