Module: wine Branch: master Commit: f73d74c6dfe57008972192772837f8bb6b744d3b URL: https://gitlab.winehq.org/wine/wine/-/commit/f73d74c6dfe57008972192772837f8b...
Author: Bartosz Kosiorek gang65@poczta.onet.pl Date: Tue Nov 7 23:06:28 2023 +0100
msvcrt: Add _mbsncmp_l implementation.
---
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 | 63 +++++++++++++++++++++++++++++---------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 49 insertions(+), 30 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index de6265dbeff..3c901f0345b 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1152,7 +1152,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 8db709f894f..b633d20e713 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1509,7 +1509,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 6aae69fdea4..a5fdb346323 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1520,7 +1520,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 509343870a4..d842d4362f1 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -824,7 +824,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 119aa34c55f..2334b07957a 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -802,7 +802,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index ba9e034cd0d..cb48fac6fb6 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1225,34 +1225,53 @@ int CDECL _mbsicmp(const unsigned char* str, const unsigned char* cmp) }
/********************************************************************* - * _mbsncmp(MSVCRT.@) + * _mbsncmp_l(MSVCRT.@) */ -int CDECL _mbsncmp(const unsigned char* str, const unsigned char* cmp, size_t len) +int CDECL _mbsncmp_l(const unsigned char* str, const unsigned char* cmp, + size_t len, _locale_t locale) { - if(!len) - return 0; - - if(get_mbcinfo()->ismbcodepage) - { + pthreadmbcinfo mbcinfo; unsigned int strc, cmpc; - while(len--) + + if (!len) + return 0; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (!mbcinfo->ismbcodepage) + return u_strncmp(str, cmp, len); /* ASCII CP */ + + if (!MSVCRT_CHECK_PMT(str && cmp)) + return _NLSCMPERROR; + + while (len--) { - int inc; - if(!*str) - return *cmp ? -1 : 0; - if(!*cmp) - return 1; - strc = _mbsnextc(str); - cmpc = _mbsnextc(cmp); - if(strc != cmpc) - return strc < cmpc ? -1 : 1; - inc=(strc > 255) ? 2 : 1; /* Equal, use same increment */ - str += inc; - cmp += inc; + int inc; + + if (!*str) + return *cmp ? -1 : 0; + if (!*cmp) + return 1; + strc = _mbsnextc_l(str, locale); + cmpc = _mbsnextc_l(cmp, locale); + if (strc != cmpc) + return strc < cmpc ? -1 : 1; + inc = (strc > 255) ? 2 : 1; /* Equal, use same increment */ + str += inc; + cmp += inc; } return 0; /* Matched len chars */ - } - return u_strncmp(str, cmp, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsncmp(MSVCRT.@) + */ +int CDECL _mbsncmp(const unsigned char* str, const unsigned char* cmp, size_t len) +{ + return _mbsncmp_l(str, cmp, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a40321b747a..b9947d4e885 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -773,7 +773,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -# stub _mbsncmp_l(str str long ptr) +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) # stub _mbsncoll_l(str str long ptr) @ cdecl _mbsncpy(ptr str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 7e02dd203c6..e0174dd897c 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -668,7 +668,7 @@ @ cdecl _mbsnccnt(str long) @ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) -@ stub _mbsncmp_l +@ cdecl _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) @@ -1237,7 +1237,7 @@ @ cdecl _o__mbsnccnt(str long) _mbsnccnt @ cdecl _o__mbsnccnt_l(str long ptr) _mbsnccnt_l @ cdecl _o__mbsncmp(str str long) _mbsncmp -@ stub _o__mbsncmp_l +@ cdecl _o__mbsncmp_l(str str long ptr) _mbsncmp_l @ stub _o__mbsncoll @ stub _o__mbsncoll_l @ cdecl _o__mbsncpy(ptr str long) _mbsncpy