msvcrt: Add _mbsnbcat_s_l implementation.

This commit is contained in:
Bartosz Kosiorek 2023-11-06 20:04:55 +01:00 committed by Alexandre Julliard
parent 9365e6f682
commit a6ed3d554e
8 changed files with 29 additions and 14 deletions

View file

@ -1126,7 +1126,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)

View file

@ -1483,7 +1483,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)

View file

@ -1494,7 +1494,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)

View file

@ -798,7 +798,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)

View file

@ -776,7 +776,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)

View file

@ -2336,20 +2336,22 @@ unsigned char* CDECL _mbsnbcat(unsigned char *dst, const unsigned char *src, siz
return _mbsnbcat_l(dst, src, len, NULL); 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; unsigned char *ptr = dst;
size_t i; size_t i;
pthreadmbcinfo mbcinfo;
if (!dst && !size && !src && !len) if (!dst && !size && !len)
return 0; return 0;
if (!dst || !size || !src) if (!MSVCRT_CHECK_PMT(dst && size && src))
{ {
if (dst && size) if (dst && size)
*dst = '\0'; *dst = '\0';
*_errno() = EINVAL;
return EINVAL; return EINVAL;
} }
@ -2364,9 +2366,14 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src,
return EINVAL; return EINVAL;
} }
if (locale)
mbcinfo = locale->mbcinfo;
else
mbcinfo = get_mbcinfo();
/* If necessary, check that the character preceding the null terminator is /* If necessary, check that the character preceding the null terminator is
* a lead byte and move the pointer back by one for later overwrite. */ * 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--; size++, ptr--;
for (i = 0; *src && i < len; i++) 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; 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.@) * _mbsncat(MSVCRT.@)
*/ */

View file

@ -747,7 +747,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)

View file

@ -642,7 +642,7 @@
@ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat(str str long)
@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_l(str str long ptr)
@ cdecl _mbsnbcat_s(str long ptr long) @ 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(str str long)
@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcmp_l(str str long ptr)
@ cdecl _mbsnbcnt(ptr long) @ cdecl _mbsnbcnt(ptr long)
@ -1211,7 +1211,7 @@
@ cdecl _o__mbsnbcat(str str long) _mbsnbcat @ cdecl _o__mbsnbcat(str str long) _mbsnbcat
@ cdecl _o__mbsnbcat_l(str str long ptr) _mbsnbcat_l @ cdecl _o__mbsnbcat_l(str str long ptr) _mbsnbcat_l
@ cdecl _o__mbsnbcat_s(str long ptr long) _mbsnbcat_s @ 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(str str long) _mbsnbcmp
@ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l @ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l
@ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt @ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt