diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 36452977926..0f57555e454 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1126,7 +1126,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index b057d5b85ad..072cef0f0c9 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1483,7 +1483,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 5f24c3f7971..55a0a4b1d2d 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1494,7 +1494,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 42e215d7f79..38d157f8a9a 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -798,7 +798,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index be847415309..58cb3ef2e92 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -776,7 +776,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 01d290b2647..245dc843ba2 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2336,20 +2336,22 @@ unsigned char* CDECL _mbsnbcat(unsigned char *dst, const unsigned char *src, siz return _mbsnbcat_l(dst, src, len, NULL); } -int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, size_t len) +/********************************************************************* + * _mbsnbcat_s_l(MSVCRT.@) + */ +int CDECL _mbsnbcat_s_l(unsigned char *dst, size_t size, const unsigned char *src, size_t len, _locale_t locale) { unsigned char *ptr = dst; size_t i; + pthreadmbcinfo mbcinfo; - if (!dst && !size && !src && !len) + if (!dst && !size && !len) return 0; - if (!dst || !size || !src) + if (!MSVCRT_CHECK_PMT(dst && size && src)) { if (dst && size) *dst = '\0'; - - *_errno() = EINVAL; return EINVAL; } @@ -2364,9 +2366,14 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, return EINVAL; } + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + /* If necessary, check that the character preceding the null terminator is * a lead byte and move the pointer back by one for later overwrite. */ - if (ptr != dst && get_mbcinfo()->ismbcodepage && _ismbblead(*(ptr - 1))) + if (ptr != dst && mbcinfo->ismbcodepage && _ismbblead_l(*(ptr - 1), locale)) size++, ptr--; for (i = 0; *src && i < len; i++) @@ -2386,6 +2393,14 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, return 0; } +/********************************************************************* + * _mbsnbcat_s(MSVCRT.@) + */ +int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, size_t len) +{ + return _mbsnbcat_s_l(dst, size, src, len, NULL); +} + /********************************************************************* * _mbsncat(MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a997a4e61d5..738279a2cd3 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -747,7 +747,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -# stub _mbsnbcat_s_l(str long ptr long ptr) +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index f0b078e09e7..46cea0359b4 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -642,7 +642,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @@ -1211,7 +1211,7 @@ @ cdecl _o__mbsnbcat(str str long) _mbsnbcat @ 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__mbsnbcat_s_l(str long ptr long ptr) _mbsnbcat_s_l @ cdecl _o__mbsnbcmp(str str long) _mbsnbcmp @ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l @ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt