diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 0f57555e454..884289175c0 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1134,7 +1134,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 072cef0f0c9..89bb35c7dba 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1491,7 +1491,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 55a0a4b1d2d..1be83715d23 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1502,7 +1502,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 38d157f8a9a..78172dbc104 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -806,7 +806,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 58cb3ef2e92..c1736877ff5 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -784,7 +784,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 245dc843ba2..38ace70cd7e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -992,6 +992,50 @@ int CDECL _mbscpy_s(unsigned char *dst, size_t size, const unsigned char *src) return _mbscpy_s_l(dst, size, src, NULL); } +/********************************************************************* + * _mbsnbcpy_l(MSVCRT.@) + * REMARKS + * Like strncpy this function doesn't enforce the string to be + * NUL-terminated + */ +unsigned char* CDECL _mbsnbcpy_l(unsigned char* dst, const unsigned char* src, size_t n, _locale_t locale) +{ + unsigned char* ret = dst; + pthreadmbcinfo mbcinfo; + + if (!n) + return dst; + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (mbcinfo->ismbcodepage) + { + BOOL is_lead = FALSE; + while (*src && n) + { + is_lead = (!is_lead && _ismbblead_l(*src, locale)); + n--; + *dst++ = *src++; + } + + if (is_lead) /* if string ends with a lead, remove it */ + *(dst - 1) = 0; + } + else + { + while (n) + { + n--; + if (!(*dst++ = *src++)) break; + } + } + while (n--) *dst++ = 0; + return ret; +} + /********************************************************************* * _mbsnbcpy(MSVCRT.@) * REMARKS @@ -1000,32 +1044,7 @@ int CDECL _mbscpy_s(unsigned char *dst, size_t size, const unsigned char *src) */ unsigned char* CDECL _mbsnbcpy(unsigned char* dst, const unsigned char* src, size_t n) { - unsigned char* ret = dst; - if(!n) - return dst; - if(get_mbcinfo()->ismbcodepage) - { - BOOL is_lead = FALSE; - while (*src && n) - { - is_lead = (!is_lead && _ismbblead(*src)); - n--; - *dst++ = *src++; - } - - if (is_lead) /* if string ends with a lead, remove it */ - *(dst - 1) = 0; - } - else - { - while (n) - { - n--; - if (!(*dst++ = *src++)) break; - } - } - while (n--) *dst++ = 0; - return ret; + return _mbsnbcpy_l(dst, src, n, NULL); } /********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 738279a2cd3..998bd7268ca 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -755,7 +755,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -# stub _mbsnbcpy_l(ptr str long ptr) +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 46cea0359b4..25c3e5ac766 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -650,7 +650,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) @@ -1219,7 +1219,7 @@ @ cdecl _o__mbsnbcoll(str str long) _mbsnbcoll @ cdecl _o__mbsnbcoll_l(str str long ptr) _mbsnbcoll_l @ cdecl _o__mbsnbcpy(ptr str long) _mbsnbcpy -@ stub _o__mbsnbcpy_l +@ cdecl _o__mbsnbcpy_l(ptr str long ptr) _mbsnbcpy_l @ cdecl _o__mbsnbcpy_s(ptr long str long) _mbsnbcpy_s @ cdecl _o__mbsnbcpy_s_l(ptr long str long ptr) _mbsnbcpy_s_l @ cdecl _o__mbsnbicmp(str str long) _mbsnbicmp