msvcrt: Implement _mbscmp_l().

Signed-off-by: Paul Gofman <pgofman@codeweavers.com>
Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2020-09-23 22:54:28 +03:00 committed by Alexandre Julliard
parent 082de781f0
commit 12106c214b
12 changed files with 39 additions and 15 deletions

View File

@ -95,7 +95,7 @@
@ cdecl _mbschr(str long) ucrtbase._mbschr
@ stub _mbschr_l
@ cdecl _mbscmp(str str) ucrtbase._mbscmp
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr) ucrtbase._mbscmp_l
@ cdecl _mbscoll(str str) ucrtbase._mbscoll
@ cdecl _mbscoll_l(str str ptr) ucrtbase._mbscoll_l
@ cdecl _mbscpy_s(ptr long str) ucrtbase._mbscpy_s

View File

@ -520,7 +520,7 @@
@ cdecl _o__mbschr(str long) ucrtbase._o__mbschr
@ stub _o__mbschr_l
@ cdecl _o__mbscmp(str str) ucrtbase._o__mbscmp
@ stub _o__mbscmp_l
@ cdecl _o__mbscmp_l(str str ptr) ucrtbase._o__mbscmp_l
@ cdecl _o__mbscoll(str str) ucrtbase._o__mbscoll
@ cdecl _o__mbscoll_l(str str ptr) ucrtbase._o__mbscoll_l
@ cdecl _o__mbscpy_s(ptr long str) ucrtbase._o__mbscpy_s

View File

@ -1102,7 +1102,7 @@
@ cdecl _mbschr(str long)
@ stub _mbschr_l
@ cdecl _mbscmp(str str)
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy_s(ptr long str)

View File

@ -1459,7 +1459,7 @@
@ cdecl _mbschr(str long)
@ stub _mbschr_l
@ cdecl _mbscmp(str str)
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy_s(ptr long str)

View File

@ -1469,7 +1469,7 @@
@ cdecl _mbschr(str long)
@ stub _mbschr_l
@ cdecl _mbscmp(str str)
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy_s(ptr long str)

View File

@ -774,7 +774,7 @@
@ cdecl _mbschr(str long)
@ stub _mbschr_l
@ cdecl _mbscmp(str str)
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy_s(ptr long str)

View File

@ -752,7 +752,7 @@
@ cdecl _mbschr(str long)
@ stub _mbschr_l
@ cdecl _mbscmp(str str)
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy_s(ptr long str)

View File

@ -872,13 +872,17 @@ unsigned char* CDECL _mbsnbcpy(unsigned char* dst, const unsigned char* src, MSV
}
/*********************************************************************
* _mbscmp(MSVCRT.@)
* _mbscmp_l(MSVCRT.@)
*/
int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp)
int CDECL _mbscmp_l(const unsigned char* str, const unsigned char* cmp, MSVCRT__locale_t locale)
{
MSVCRT_pthreadmbcinfo mbcinfo;
if (!str || !cmp) return INT_MAX;
if(get_mbcinfo()->ismbcodepage)
mbcinfo = locale ? locale->mbcinfo : get_mbcinfo();
if(mbcinfo->ismbcodepage)
{
unsigned int strc, cmpc;
do {
@ -886,8 +890,8 @@ int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp)
return *cmp ? -1 : 0;
if(!*cmp)
return 1;
strc = _mbsnextc(str);
cmpc = _mbsnextc(cmp);
strc = _mbsnextc_l(str, locale);
cmpc = _mbsnextc_l(cmp, locale);
if(strc != cmpc)
return strc < cmpc ? -1 : 1;
str +=(strc > 255) ? 2 : 1;
@ -897,6 +901,14 @@ int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp)
return u_strcmp(str, cmp); /* ASCII CP */
}
/*********************************************************************
* _mbscmp(MSVCRT.@)
*/
int CDECL _mbscmp(const unsigned char* str, const unsigned char* cmp, MSVCRT__locale_t locale)
{
return _mbscmp_l(str, cmp, NULL);
}
/*********************************************************************
* _mbsnbicoll_l(MSVCRT.@)
*/

View File

@ -717,7 +717,7 @@
@ cdecl _mbschr(str long)
# stub _mbschr_l(str long ptr)
@ cdecl _mbscmp(str str)
# stub _mbscmp_l(str str ptr)
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy(ptr str)

View File

@ -115,6 +115,7 @@ static int (__cdecl *p__memicmp)(const char*, const char*, size_t);
static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
static size_t (__cdecl *p___strncnt)(const char*, size_t);
static unsigned int (__cdecl *p_mbsnextc_l)(const unsigned char*, _locale_t);
static int (__cdecl *p_mbscmp_l)(const unsigned char*, const unsigned char*, _locale_t);
int CDECL __STRINGTOLD(_LDOUBLE*, char**, const char*, int);
@ -3725,6 +3726,15 @@ static void test__mbscmp(void)
ret = _mbscmp(b, a);
ok(ret == 1, "got %d\n", ret);
if (!p_mbscmp_l)
{
win_skip("_mbscmp_l tests\n");
return;
}
ret = p_mbscmp_l(a, b, NULL);
ok(ret == -1, "got %d\n", ret);
}
static void test__ismbclx(void)
@ -4458,6 +4468,7 @@ START_TEST(string)
p__memicmp_l = (void*)GetProcAddress(hMsvcrt, "_memicmp_l");
p___strncnt = (void*)GetProcAddress(hMsvcrt, "__strncnt");
p_mbsnextc_l = (void*)GetProcAddress(hMsvcrt, "_mbsnextc_l");
p_mbscmp_l = (void*)GetProcAddress(hMsvcrt, "_mbscmp_l");
/* MSVCRT memcpy behaves like memmove for overlapping moves,
MFC42 CString::Insert seems to rely on that behaviour */

View File

@ -614,7 +614,7 @@
@ cdecl _mbschr(str long)
@ stub _mbschr_l
@ cdecl _mbscmp(str str)
@ stub _mbscmp_l
@ cdecl _mbscmp_l(str str ptr)
@ cdecl _mbscoll(str str)
@ cdecl _mbscoll_l(str str ptr)
@ cdecl _mbscpy_s(ptr long str)
@ -1184,7 +1184,7 @@
@ cdecl _o__mbschr(str long) _mbschr
@ stub _o__mbschr_l
@ cdecl _o__mbscmp(str str) _mbscmp
@ stub _o__mbscmp_l
@ cdecl _o__mbscmp_l(str str ptr) _mbscmp_l
@ cdecl _o__mbscoll(str str) _mbscoll
@ cdecl _o__mbscoll_l(str str ptr) _mbscoll_l
@ cdecl _o__mbscpy_s(ptr long str) _mbscpy_s

View File

@ -65,6 +65,7 @@ int __cdecl _mbsbtype(const unsigned char*,size_t);
unsigned char* __cdecl _mbscat(unsigned char*,const unsigned char*);
unsigned char* __cdecl _mbschr(const unsigned char*,unsigned int);
int __cdecl _mbscmp(const unsigned char*,const unsigned char*);
int __cdecl _mbscmp_l(const unsigned char*,const unsigned char*,_locale_t);
int __cdecl _mbscoll(const unsigned char*,const unsigned char*);
unsigned char* __cdecl _mbscpy(unsigned char*,const unsigned char*);
size_t __cdecl _mbscspn(const unsigned char*,const unsigned char*);