Module: wine Branch: master Commit: 557a760e7fbba2212ee2e38f4332564a97444dad URL: https://gitlab.winehq.org/wine/wine/-/commit/557a760e7fbba2212ee2e38f4332564...
Author: Bartosz Kosiorek gang65@poczta.onet.pl Date: Mon Oct 30 20:29:51 2023 +0100
msvcrt: Add _mbsnbcat_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 | 52 +++++++++++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 46 insertions(+), 22 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index f33973f856d..9659cd1f3a2 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1124,7 +1124,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 418387e1d29..4bab0eddc99 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1481,7 +1481,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 786f4b18caf..e0d87f7f7f1 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1492,7 +1492,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index cbd720580ac..5cc72177a33 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -796,7 +796,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 6bdbe9ee0e9..556ba1fa1a7 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -774,7 +774,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 06f84d1db4a..23d0bbbaeb8 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2187,24 +2187,40 @@ size_t CDECL _mbsnbcnt(const unsigned char* str, size_t len) }
/********************************************************************* - * _mbsnbcat(MSVCRT.@) + * _mbsnbcat_l(MSVCRT.@) */ -unsigned char* CDECL _mbsnbcat(unsigned char* dst, const unsigned char* src, size_t len) +unsigned char* CDECL _mbsnbcat_l(unsigned char *dst, const unsigned char *src, size_t len, _locale_t locale) { - if(get_mbcinfo()->ismbcodepage) + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { unsigned char *res = dst; - while (*dst) { - if (_ismbblead(*dst++)) { - if (*dst) { - dst++; - } else { - /* as per msdn overwrite the lead byte in front of '\0' */ - dst--; - break; - } - } - } + + while (*dst) + { + if (_ismbblead_l(*dst++, locale)) + { + if (*dst) + { + dst++; + } + else + { + /* as per msdn overwrite the lead byte in front of '\0' */ + dst--; + break; + } + } + } while (*src && len--) *dst++ = *src++; *dst = '\0'; return res; @@ -2212,6 +2228,14 @@ unsigned char* CDECL _mbsnbcat(unsigned char* dst, const unsigned char* src, siz return u_strncat(dst, src, len); /* ASCII CP */ }
+/********************************************************************* + * _mbsnbcat(MSVCRT.@) + */ +unsigned char* CDECL _mbsnbcat(unsigned char *dst, const unsigned char *src, size_t len) +{ + return _mbsnbcat_l(dst, src, len, NULL); +} + int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, size_t len) { unsigned char *ptr = dst; diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a77ed171fb1..e5e938959b8 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -745,7 +745,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -# stub _mbsnbcat_l(str str long ptr) +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) # stub _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 5b4c2beb491..4f54e1641fc 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -640,7 +640,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) @@ -1209,7 +1209,7 @@ @ cdecl _o__mbslwr_s(str long) _mbslwr_s @ cdecl _o__mbslwr_s_l(str long ptr) _mbslwr_s_l @ cdecl _o__mbsnbcat(str str long) _mbsnbcat -@ stub _o__mbsnbcat_l +@ cdecl _o__mbsnbcat_l(str str long ptr) _mbsnbcat_l @ cdecl _o__mbsnbcat_s(str long ptr long) _mbsnbcat_s @ stub _o__mbsnbcat_s_l @ cdecl _o__mbsnbcmp(str str long) _mbsnbcmp