Module: wine Branch: master Commit: a67a08895f7ae6e44543bfa4a05b10df7c253f08 URL: https://gitlab.winehq.org/wine/wine/-/commit/a67a08895f7ae6e44543bfa4a05b10d...
Author: Bartosz Kosiorek gang65@poczta.onet.pl Date: Mon Nov 6 20:47:19 2023 +0100
msvcrt: Add _mbsncat_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 | 56 ++++++++++++++++++++++++++++++--------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 46 insertions(+), 26 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 121ff766807..565689ac6ab 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1146,7 +1146,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index b14ed43cb3b..bc143f34505 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1503,7 +1503,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 0aa7cafb660..cd76f568557 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1514,7 +1514,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 52a9fbce0dc..5bc963edf57 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -818,7 +818,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 78521a857ae..a7f47e568c7 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -796,7 +796,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 2d492197452..77ced6e8a3e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2457,30 +2457,50 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, }
/********************************************************************* - * _mbsncat(MSVCRT.@) + * _mbsncat_l(MSVCRT.@) */ -unsigned char* CDECL _mbsncat(unsigned char* dst, const unsigned char* src, size_t len) +unsigned char* CDECL _mbsncat_l(unsigned char* dst, const unsigned char* src, size_t len, _locale_t locale) { - if(get_mbcinfo()->ismbcodepage) - { - unsigned char *res = dst; - while (*dst) - { - if (_ismbblead(*dst++)) - dst++; - } - while (*src && len--) + pthreadmbcinfo mbcinfo; + + if (!len) + return dst; + + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - *dst++ = *src; - if(_ismbblead(*src++)) - *dst++ = *src++; + unsigned char *res = dst; + while (*dst) + { + if (_ismbblead_l(*dst++, locale)) + dst++; + } + while (*src && len--) + { + *dst++ = *src; + if (_ismbblead_l(*src++, locale)) + *dst++ = *src++; + } + *dst = '\0'; + return res; } - *dst = '\0'; - return res; - } - return u_strncat(dst, src, len); /* ASCII CP */ + return u_strncat(dst, src, len); /* ASCII CP */ }
+/********************************************************************* + * _mbsncat(MSVCRT.@) + */ +unsigned char* CDECL _mbsncat(unsigned char* dst, const unsigned char* src, size_t len) +{ + return _mbsncat_l(dst, src, len, NULL); +}
/********************************************************************* * _mbslwr_l(MSVCRT.@) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index de58dd39a93..ff6f14b884f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -767,7 +767,7 @@ # stub _mbsnbset_s(ptr long long long) # stub _mbsnbset_s_l(ptr long long long ptr) @ cdecl _mbsncat(str str long) -# stub _mbsncat_l(str str long ptr) +@ cdecl _mbsncat_l(str str long ptr) # stub _mbsncat_s(str long str long) # stub _mbsncat_s_l(str long str long ptr) @ cdecl _mbsnccnt(str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index a18f5d6e397..91c54e1a31c 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -662,7 +662,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) @@ -1231,7 +1231,7 @@ @ stub _o__mbsnbset_s @ stub _o__mbsnbset_s_l @ cdecl _o__mbsncat(str str long) _mbsncat -@ stub _o__mbsncat_l +@ cdecl _o__mbsncat_l(str str long ptr) _mbsncat_l @ stub _o__mbsncat_s @ stub _o__mbsncat_s_l @ cdecl _o__mbsnccnt(str long) _mbsnccnt