From: Paul Gofman Subject: [PATCH 1/3] msvcrt: Implement _mbsnextc_l(). Message-Id: <20200923195429.951990-1-pgofman@codeweavers.com> Date: Wed, 23 Sep 2020 22:54:27 +0300 Signed-off-by: Paul Gofman --- .../api-ms-win-crt-multibyte-l1-1-0.spec | 2 +- .../api-ms-win-crt-private-l1-1-0.spec | 2 +- 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 | 14 +++++++++++--- dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/tests/string.c | 7 +++++++ dlls/ucrtbase/ucrtbase.spec | 4 ++-- include/msvcrt/mbstring.h | 3 ++- 12 files changed, 30 insertions(+), 14 deletions(-) diff --git a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec index 84ae0f449bf..f33d8c8f3d3 100644 --- a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec +++ b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec @@ -154,7 +154,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) ucrtbase._mbsnextc -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) ucrtbase._mbsnextc_l @ cdecl _mbsnicmp(str str long) ucrtbase._mbsnicmp @ stub _mbsnicmp_l @ cdecl _mbsnicoll(str str long) ucrtbase._mbsnicoll diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec index f9cfe67c1b0..d260ff138e3 100644 --- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec +++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec @@ -578,7 +578,7 @@ @ stub _o__mbsncpy_s @ stub _o__mbsncpy_s_l @ cdecl _o__mbsnextc(str) ucrtbase._o__mbsnextc -@ stub _o__mbsnextc_l +@ cdecl _o__mbsnextc_l(str ptr) ucrtbase._o__mbsnextc_l @ cdecl _o__mbsnicmp(str str long) ucrtbase._o__mbsnicmp @ stub _o__mbsnicmp_l @ stub _o__mbsnicoll diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 577fb69b5a2..02cba0e3e7e 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1160,7 +1160,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) @ stub _mbsnicmp_l @ stub _mbsnicoll(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 97edbec6a74..b545ffc25c8 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1517,7 +1517,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) @ stub _mbsnicmp_l @ stub _mbsnicoll(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 1aa63de64a1..662c0973674 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1527,7 +1527,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) @ stub _mbsnicmp_l @ stub _mbsnicoll(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index a31943e4d7d..bc5c6f7bd99 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -832,7 +832,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) @ stub _mbsnicmp_l @ stub _mbsnicoll(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index ff58757cb89..38b3912b4ab 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -810,7 +810,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) @ stub _mbsnicmp_l @ stub _mbsnicoll(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index dc52cf1b8cf..2a42c097b42 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -393,15 +393,23 @@ int CDECL _getmbcp(void) } /********************************************************************* - * _mbsnextc(MSVCRT.@) + * _mbsnextc_l(MSVCRT.@) */ -unsigned int CDECL _mbsnextc(const unsigned char* str) +unsigned int CDECL _mbsnextc_l(const unsigned char* str, MSVCRT__locale_t locale) { - if(_ismbblead(*str)) + if(_ismbblead_l(*str, locale)) return *str << 8 | str[1]; return *str; } +/********************************************************************* + * _mbsnextc(MSVCRT.@) + */ +unsigned int CDECL _mbsnextc(const unsigned char* str) +{ + return _mbsnextc_l(str, NULL); +} + /********************************************************************* * _mbctolower(MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 6da32d025d8..9c049455af2 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -778,7 +778,7 @@ # stub _mbsncpy_s(ptr long str long) # stub _mbsncpy_s_l(ptr long str long ptr) @ cdecl _mbsnextc(str) -# stub _mbsnextc_l(str ptr) +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) # stub _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index a08a76fc687..c6175189884 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -114,6 +114,7 @@ static int (__cdecl *p__mbccpy_s)(unsigned char*, size_t, int*, const unsigned c 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); int CDECL __STRINGTOLD(_LDOUBLE*, char**, const char*, int); @@ -351,6 +352,11 @@ static void test_mbcp(void) expect_eq(_mbsnextc(&mbstring[2]), 0xb220, int, "%x"); /* lead + invalid tail */ expect_eq(_mbsnextc(&mbstring[3]), 0x20, int, "%x"); /* single char */ + if (!p_mbsnextc_l) + win_skip("_mbsnextc_l tests\n"); + else + expect_eq(p_mbsnextc_l(mbstring, NULL), 0xb0b1, int, "%x"); + /* _mbclen/_mbslen */ expect_eq(_mbclen(mbstring), 2, int, "%d"); expect_eq(_mbclen(&mbstring[2]), 2, int, "%d"); @@ -4451,6 +4457,7 @@ START_TEST(string) p__memicmp = (void*)GetProcAddress(hMsvcrt, "_memicmp"); p__memicmp_l = (void*)GetProcAddress(hMsvcrt, "_memicmp_l"); p___strncnt = (void*)GetProcAddress(hMsvcrt, "__strncnt"); + p_mbsnextc_l = (void*)GetProcAddress(hMsvcrt, "_mbsnextc_l"); /* MSVCRT memcpy behaves like memmove for overlapping moves, MFC42 CString::Insert seems to rely on that behaviour */ diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 4981d7fbac7..ee06053a700 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -673,7 +673,7 @@ @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) -@ stub _mbsnextc_l +@ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) @ stub _mbsnicmp_l @ stub _mbsnicoll(str str long) @@ -1242,7 +1242,7 @@ @ stub _o__mbsncpy_s @ stub _o__mbsncpy_s_l @ cdecl _o__mbsnextc(str) _mbsnextc -@ stub _o__mbsnextc_l +@ cdecl _o__mbsnextc_l(str ptr) _mbsnextc_l @ cdecl _o__mbsnicmp(str str long) _mbsnicmp @ stub _o__mbsnicmp_l @ stub _o__mbsnicoll diff --git a/include/msvcrt/mbstring.h b/include/msvcrt/mbstring.h index 80be664aaaa..82bc6f1aeee 100644 --- a/include/msvcrt/mbstring.h +++ b/include/msvcrt/mbstring.h @@ -90,7 +90,8 @@ size_t __cdecl _mbsnccnt(const unsigned char*,size_t); int __cdecl _mbsncmp(const unsigned char*,const unsigned char*,size_t); int __cdecl _mbsncoll(const unsigned char*,const unsigned char*,size_t); unsigned char* __cdecl _mbsncpy(unsigned char*,const unsigned char*,size_t); -unsigned int __cdecl _mbsnextc (const unsigned char*); +unsigned int __cdecl _mbsnextc(const unsigned char*); +unsigned int __cdecl _mbsnextc_l(const unsigned char*,_locale_t); int __cdecl _mbsnicmp(const unsigned char*,const unsigned char*,size_t); int __cdecl _mbsnicoll(const unsigned char*,const unsigned char*,size_t); unsigned char* __cdecl _mbsninc(const unsigned char*,size_t); -- 2.26.2