From: Bartosz Kosiorek gang65@poczta.onet.pl
--- 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 | 42 +++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 37 insertions(+), 21 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 1f1630fa522..f26e8bf4de9 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2183,24 +2183,32 @@ 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; - } - } - } + 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; @@ -2208,6 +2216,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