diff --git a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec index 9db4f532522..1c987d0fc74 100644 --- a/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec +++ b/dlls/api-ms-win-crt-multibyte-l1-1-0/api-ms-win-crt-multibyte-l1-1-0.spec @@ -67,10 +67,10 @@ @ cdecl _mbbtype(long long) ucrtbase._mbbtype @ stub _mbbtype_l @ stub _mbcasemap -@ cdecl _mbccpy(ptr str) ucrtbase._mbccpy -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) ucrtbase._mbccpy +@ cdecl _mbccpy_l(ptr ptr ptr) ucrtbase._mbccpy_l +@ cdecl _mbccpy_s(ptr long ptr ptr) ucrtbase._mbccpy_s +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) ucrtbase._mbccpy_s_l @ cdecl _mbcjistojms(long) ucrtbase._mbcjistojms @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long) ucrtbase._mbcjmstojis diff --git a/dlls/crtdll/crtdll.spec b/dlls/crtdll/crtdll.spec index f8210b01108..51729ce586c 100644 --- a/dlls/crtdll/crtdll.spec +++ b/dlls/crtdll/crtdll.spec @@ -188,7 +188,7 @@ @ cdecl _matherr(ptr) msvcrt._matherr @ cdecl _mbbtombc(long) msvcrt._mbbtombc @ cdecl _mbbtype(long long) msvcrt._mbbtype -@ cdecl _mbccpy(ptr str) msvcrt._mbccpy +@ cdecl _mbccpy(ptr ptr) msvcrt._mbccpy @ cdecl _mbcjistojms(long) msvcrt._mbcjistojms @ cdecl _mbcjmstojis(long) msvcrt._mbcjmstojis @ cdecl _mbclen(ptr) msvcrt._mbclen diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 5c8158aef60..ef49177f543 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1073,10 +1073,10 @@ @ cdecl _mbbtype(long long) @ stub _mbbtype_l # extern _mbcasemap -@ cdecl _mbccpy(ptr str) -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms(long) @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 2a7b777250d..be4d8c18f19 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1430,10 +1430,10 @@ @ cdecl _mbbtype(long long) @ stub _mbbtype_l # extern _mbcasemap -@ cdecl _mbccpy(ptr str) -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms(long) @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 725ecb2bd69..60e0a32ddda 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1440,10 +1440,10 @@ @ cdecl _mbbtype(long long) @ stub _mbbtype_l # extern _mbcasemap -@ cdecl _mbccpy(ptr str) -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms(long) @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index d8290dde962..4d97db097c8 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -745,10 +745,10 @@ @ cdecl _mbbtype(long long) @ stub _mbbtype_l # extern _mbcasemap -@ cdecl _mbccpy(ptr str) -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms(long) @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index bfaf6f6df99..eccbf3ceb65 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -723,10 +723,10 @@ @ cdecl _mbbtype(long long) @ stub _mbbtype_l # extern _mbcasemap -@ cdecl _mbccpy(ptr str) -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms(long) @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 12a7f5d9f17..6e46b84335b 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -623,14 +623,64 @@ MSVCRT_size_t CDECL _mbsnlen(const unsigned char* str, MSVCRT_size_t maxsize) return _mbsnlen_l(str, maxsize, NULL); } +/********************************************************************* + * _mbccpy_s_l(MSVCRT.@) + */ +int CDECL _mbccpy_s_l(unsigned char* dest, MSVCRT_size_t maxsize, + int *copied, const unsigned char* src, MSVCRT__locale_t locale) +{ + if(copied) *copied = 0; + if(!MSVCRT_CHECK_PMT(dest != NULL && maxsize >= 1)) return MSVCRT_EINVAL; + dest[0] = 0; + if(!MSVCRT_CHECK_PMT(src != NULL)) return MSVCRT_EINVAL; + + if(_ismbblead_l(*src, locale)) { + if(!src[1]) { + if(copied) *copied = 1; + *MSVCRT__errno() = MSVCRT_EILSEQ; + return MSVCRT_EILSEQ; + } + + if(maxsize < 2) { + MSVCRT_INVALID_PMT("dst buffer is too small", MSVCRT_ERANGE); + return MSVCRT_ERANGE; + } + + *dest++ = *src++; + *dest = *src; + if(copied) *copied = 2; + }else { + *dest = *src; + if(copied) *copied = 1; + } + + return 0; +} + /********************************************************************* * _mbccpy(MSVCRT.@) */ void CDECL _mbccpy(unsigned char* dest, const unsigned char* src) { - *dest = *src; - if(_ismbblead(*src)) - *++dest = *++src; /* MB char */ + _mbccpy_s_l(dest, 2, NULL, src, NULL); +} + +/********************************************************************* + * _mbccpy_l(MSVCRT.@) + */ +void CDECL _mbccpy_l(unsigned char* dest, const unsigned char* src, + MSVCRT__locale_t locale) +{ + _mbccpy_s_l(dest, 2, NULL, src, locale); +} + +/********************************************************************* + * _mbccpy_s(MSVCRT.@) + */ +int CDECL _mbccpy_s(unsigned char* dest, MSVCRT_size_t maxsize, + int *copied, const unsigned char* src) +{ + return _mbccpy_s_l(dest, maxsize, copied, src, NULL); } /********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 3c73ae2b70b..50d051d537f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -688,10 +688,10 @@ # stub _mbbtombc_l(long ptr) @ cdecl _mbbtype(long long) # extern _mbcasemap -@ cdecl _mbccpy(ptr str) -# stub _mbccpy_l(ptr str ptr) -# stub _mbccpy_s(ptr long ptr str) -# stub _mbccpy_s_l(ptr long ptr str ptr) +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms (long) # stub _mbcjistojms_l(long ptr) @ cdecl _mbcjmstojis(long) diff --git a/dlls/msvcrt20/msvcrt20.spec b/dlls/msvcrt20/msvcrt20.spec index b77b2f38a1b..6ced0fde427 100644 --- a/dlls/msvcrt20/msvcrt20.spec +++ b/dlls/msvcrt20/msvcrt20.spec @@ -1015,7 +1015,7 @@ @ cdecl _matherr(ptr) msvcrt._matherr @ cdecl _mbbtombc(long) msvcrt._mbbtombc @ cdecl _mbbtype(long long) msvcrt._mbbtype -@ cdecl _mbccpy(ptr str) msvcrt._mbccpy +@ cdecl _mbccpy(ptr ptr) msvcrt._mbccpy @ cdecl _mbcjistojms(long) msvcrt._mbcjistojms @ cdecl _mbcjmstojis(long) msvcrt._mbcjmstojis @ cdecl _mbclen(ptr) msvcrt._mbclen diff --git a/dlls/msvcrt40/msvcrt40.spec b/dlls/msvcrt40/msvcrt40.spec index 5c10e67d999..e4ef8d7b667 100644 --- a/dlls/msvcrt40/msvcrt40.spec +++ b/dlls/msvcrt40/msvcrt40.spec @@ -1106,7 +1106,7 @@ @ cdecl _makepath(ptr str str str str) msvcrt._makepath @ cdecl _mbbtombc(long) msvcrt._mbbtombc @ cdecl _mbbtype(long long) msvcrt._mbbtype -@ cdecl _mbccpy(ptr str) msvcrt._mbccpy +@ cdecl _mbccpy(ptr ptr) msvcrt._mbccpy @ cdecl _mbcjistojms(long) msvcrt._mbcjistojms @ cdecl _mbcjmstojis(long) msvcrt._mbcjmstojis @ cdecl _mbclen(ptr) msvcrt._mbclen diff --git a/dlls/msvcrtd/msvcrtd.spec b/dlls/msvcrtd/msvcrtd.spec index 43b34c4c38f..15066c310f8 100644 --- a/dlls/msvcrtd/msvcrtd.spec +++ b/dlls/msvcrtd/msvcrtd.spec @@ -396,7 +396,7 @@ @ cdecl _mbbtombc(long) msvcrt._mbbtombc @ cdecl _mbbtype(long long) msvcrt._mbbtype # extern _mbcasemap -@ cdecl _mbccpy(ptr str) msvcrt._mbccpy +@ cdecl _mbccpy(ptr ptr) msvcrt._mbccpy @ cdecl _mbcjistojms(long) msvcrt._mbcjistojms @ cdecl _mbcjmstojis(long) msvcrt._mbcjmstojis @ cdecl _mbclen(ptr) msvcrt._mbclen diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 6fc805d6bf2..2b0f6fa5739 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -586,10 +586,10 @@ @ cdecl _mbbtype(long long) @ stub _mbbtype_l @ stub _mbcasemap -@ cdecl _mbccpy(ptr str) -@ stub _mbccpy_l -@ stub _mbccpy_s -@ stub _mbccpy_s_l +@ cdecl _mbccpy(ptr ptr) +@ cdecl _mbccpy_l(ptr ptr ptr) +@ cdecl _mbccpy_s(ptr long ptr ptr) +@ cdecl _mbccpy_s_l(ptr long ptr ptr ptr) @ cdecl _mbcjistojms(long) @ stub _mbcjistojms_l @ cdecl _mbcjmstojis(long)