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 | 82 +++++++++++++++++++++++-------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +- 8 files changed, 60 insertions(+), 38 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 75b782ea8e3..68b8b2f713d 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1156,7 +1156,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 80132da3c6d..456821a0b2c 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1513,7 +1513,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 44baaaedb60..d8963036835 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1524,7 +1524,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index f0e5e709bba..2482c2cb340 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -828,7 +828,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index cdb867d1234..7fa54577b02 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -806,7 +806,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 46e37532abc..587f8382a45 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -839,47 +839,69 @@ int CDECL _mbccpy_s(unsigned char* dest, size_t maxsize, return _mbccpy_s_l(dest, maxsize, copied, src, NULL); }
+ /********************************************************************* - * _mbsncpy(MSVCRT.@) + * _mbsncpy_l(MSVCRT.@) * REMARKS * The parameter n is the number or characters to copy, not the size of - * the buffer. Use _mbsnbcpy for a function analogical to strncpy + * the buffer. Use _mbsnbcpy_l for a function analogical to strncpy */ -unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) +unsigned char* CDECL _mbsncpy_l(unsigned char* dst, const unsigned char* src, size_t n, _locale_t locale) { - unsigned char* ret = dst; - if(!n) - return dst; - if (get_mbcinfo()->ismbcodepage) - { - while (*src && n) + unsigned char* ret = dst; + pthreadmbcinfo mbcinfo; + + if (!n) + return dst; + if (!MSVCRT_CHECK_PMT(dst && src)) { - n--; - if (_ismbblead(*src)) - { - if (!*(src+1)) + *ret = -1; + return ret; + } + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) + { + while (*src && n) { - *dst++ = 0; - *dst++ = 0; - break; + n--; + if (_ismbblead_l(*src, locale)) + { + if (!*(src + 1)) + { + *dst++ = 0; + *dst++ = 0; + break; + } + *dst++ = *src++; + } + *dst++ = *src++; } - - *dst++ = *src++; - } - - *dst++ = *src++; } - } - else - { - while (n) + else { - n--; - if (!(*dst++ = *src++)) break; + while (n) + { + n--; + if (!(*dst++ = *src++)) break; + } } - } - while (n--) *dst++ = 0; - return ret; + while (n--) *dst++ = 0; + return ret; +} + +/********************************************************************* + * _mbsncpy(MSVCRT.@) + * REMARKS + * The parameter n is the number or characters to copy, not the size of + * the buffer. Use _mbsnbcpy for a function analogical to strncpy + */ +unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) +{ + return _mbsncpy_l(dst, src, n, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 9f98662b65a..b603f71a6bd 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -777,7 +777,7 @@ @ stub _mbsncoll(str str long) # stub _mbsncoll_l(str str long ptr) @ cdecl _mbsncpy(ptr str long) -# stub _mbsncpy_l(ptr str long ptr) +@ cdecl _mbsncpy_l(ptr str long ptr) # stub _mbsncpy_s(ptr long str long) # stub _mbsncpy_s_l(ptr long str long ptr) @ cdecl _mbsnextc(str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 569a5d42725..c5127f5059f 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -672,7 +672,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) @@ -1241,7 +1241,7 @@ @ stub _o__mbsncoll @ stub _o__mbsncoll_l @ cdecl _o__mbsncpy(ptr str long) _mbsncpy -@ stub _o__mbsncpy_l +@ cdecl _o__mbsncpy_l(ptr str long ptr) _mbsncpy_l @ stub _o__mbsncpy_s @ stub _o__mbsncpy_s_l @ cdecl _o__mbsnextc(str) _mbsnextc