msvcrt: Add _mbccpy_s_l implementation.
Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
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 9db4f53..1c987d0 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 f8210b0..51729ce 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 5c8158a..ef49177 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 2a7b777..be4d8c1 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 725ecb2..60e0a32 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 d8290dd..4d97db0 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 bfaf6f6..eccbf3c 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 12a7f5d..6e46b84 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -624,13 +624,63 @@
}
/*********************************************************************
+ * _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 3c73ae2..50d051d 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 b77b2f3..6ced0fd 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 5c10e67..e4ef8d7 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 43b34c4..15066c3 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 6fc805d..2b0f6fa 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)