Piotr Caban : msvcrt: Add _wctomb_s_l implementation.
Alexandre Julliard
julliard at winehq.org
Sat Jul 27 13:23:35 CDT 2013
Module: wine
Branch: master
Commit: 6457163bb27f986d09a085af5a5d971d2b302153
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6457163bb27f986d09a085af5a5d971d2b302153
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Jul 25 10:14:33 2013 +0200
msvcrt: Add _wctomb_s_l implementation.
---
dlls/msvcr100/msvcr100.spec | 6 +-
dlls/msvcr110/msvcr110.spec | 6 +-
dlls/msvcr80/msvcr80.spec | 6 +-
dlls/msvcr90/msvcr90.spec | 6 +-
dlls/msvcrt/msvcrt.spec | 6 +-
dlls/msvcrt/tests/string.c | 2 +-
dlls/msvcrt/wcs.c | 106 ++++++++++++++++++++++++++++++++++++-------
7 files changed, 106 insertions(+), 32 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index ef6d354..c71f7fa 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1520,8 +1520,8 @@
@ stub _wctime32_s
@ cdecl _wctime64(ptr) msvcrt._wctime64
@ stub _wctime64_s
-@ stub _wctomb_l
-@ stub _wctomb_s_l
+@ cdecl _wctomb_l(ptr long ptr) msvcrt._wctomb_l
+@ cdecl _wctomb_s_l(ptr ptr long long ptr) msvcrt._wctomb_s_l
# extern _wctype
@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
@ extern _wenviron msvcrt._wenviron
@@ -1877,7 +1877,7 @@
@ cdecl wcsxfrm(ptr wstr long) msvcrt.wcsxfrm
@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
-@ stub wctomb_s
+@ cdecl wctomb_s(ptr ptr long long) msvcrt.wctomb_s
@ cdecl wmemcpy_s(ptr long ptr long)
@ cdecl wmemmove_s(ptr long ptr long)
@ varargs wprintf(wstr) msvcrt.wprintf
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index dd76878..40dd029 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1883,8 +1883,8 @@
@ stub _wctime32_s
@ cdecl _wctime64(ptr) msvcrt._wctime64
@ stub _wctime64_s
-@ stub _wctomb_l
-@ stub _wctomb_s_l
+@ cdecl _wctomb_l(ptr long ptr) msvcrt._wctomb_l
+@ cdecl _wctomb_s_l(ptr ptr long long ptr) msvcrt._wctomb_s_l
# extern _wctype
@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
@ extern _wenviron msvcrt._wenviron
@@ -2240,7 +2240,7 @@
@ cdecl wcsxfrm(ptr wstr long) msvcrt.wcsxfrm
@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
-@ stub wctomb_s
+@ cdecl wctomb_s(ptr ptr long long) msvcrt.wctomb_s
@ cdecl wmemcpy_s(ptr long ptr long) msvcr100.wmemcpy_s
@ cdecl wmemmove_s(ptr long ptr long) msvcr100.wmemmove_s
@ varargs wprintf(wstr) msvcrt.wprintf
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 87fbc5d..68530bf 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1198,8 +1198,8 @@
@ stub _wctime32_s
@ cdecl _wctime64(ptr) msvcrt._wctime64
@ stub _wctime64_s
-@ stub _wctomb_l
-@ stub _wctomb_s_l
+@ cdecl _wctomb_l(ptr long ptr) msvcrt._wctomb_l
+@ cdecl _wctomb_s_l(ptr ptr long long ptr) msvcrt._wctomb_s_l
# extern _wctype
@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
@ extern _wenviron msvcrt._wenviron
@@ -1556,7 +1556,7 @@
@ cdecl wcsxfrm(ptr wstr long) msvcrt.wcsxfrm
@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
-@ stub wctomb_s
+@ cdecl wctomb_s(ptr ptr long long) msvcrt.wctomb_s
@ varargs wprintf(wstr) msvcrt.wprintf
@ varargs wprintf_s(wstr) msvcrt.wprintf_s
@ varargs wscanf(wstr) msvcrt.wscanf
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 9800023..6a1657f 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1174,8 +1174,8 @@
@ stub _wctime32_s
@ cdecl _wctime64(ptr) msvcrt._wctime64
@ stub _wctime64_s
-@ stub _wctomb_l
-@ stub _wctomb_s_l
+@ cdecl _wctomb_l(ptr long ptr) msvcrt._wctomb_l
+@ cdecl _wctomb_s_l(ptr ptr long long ptr) msvcrt._wctomb_s_l
# extern _wctype
@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
@ extern _wenviron msvcrt._wenviron
@@ -1529,7 +1529,7 @@
@ cdecl wcsxfrm(ptr wstr long) msvcrt.wcsxfrm
@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
-@ stub wctomb_s
+@ cdecl wctomb_s(ptr ptr long long) msvcrt.wctomb_s
@ varargs wprintf(wstr) msvcrt.wprintf
@ varargs wprintf_s(wstr) msvcrt.wprintf_s
@ varargs wscanf(wstr) msvcrt.wscanf
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index e0e6287..6a812a9 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1139,8 +1139,8 @@
# stub _wctime32_s(ptr long ptr)
@ cdecl _wctime64(ptr) MSVCRT__wctime64
# stub _wctime64_s(ptr long ptr)
-# stub _wctomb_l(ptr long ptr)
-# stub _wctomb_s_l(ptr ptr long long ptr)
+@ cdecl _wctomb_l(ptr long ptr) MSVCRT__wctomb_l
+@ cdecl _wctomb_s_l(ptr ptr long long ptr) MSVCRT__wctomb_s_l
# extern _wctype
@ extern _wenviron MSVCRT__wenviron
@ varargs _wexecl(wstr wstr)
@@ -1510,7 +1510,7 @@
@ stub wcsxfrm(ptr wstr long)
@ cdecl wctob(long) MSVCRT_wctob
@ cdecl wctomb(ptr long) MSVCRT_wctomb
-# stub wctomb_s(ptr ptr long long)
+@ cdecl wctomb_s(ptr ptr long long) MSVCRT_wctomb_s
@ varargs wprintf(wstr) MSVCRT_wprintf
@ varargs wprintf_s(wstr) MSVCRT_wprintf_s
@ varargs wscanf(wstr) MSVCRT_wscanf
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 39934f0..7edaa23 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -2356,7 +2356,7 @@ static void test_wctomb(void)
ret = p_wcrtomb((char*)dst, 0xffff, NULL);
ok(ret == -1, "wcrtomb did not return -1\n");
- ok(dst[0] == 0x3f, "dst[0] = %x, expected 0x20\n", dst[0]);
+ ok(dst[0] == 0x3f, "dst[0] = %x, expected 0x3f\n", dst[0]);
setlocale(LC_ALL, "C");
}
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index c5b630f..dbb12dd 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1146,6 +1146,96 @@ MSVCRT_wchar_t * CDECL MSVCRT_wcstok( MSVCRT_wchar_t *str, const MSVCRT_wchar_t
}
/*********************************************************************
+ * _wctomb_s_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__wctomb_s_l(int *len, char *mbchar, MSVCRT_size_t size,
+ MSVCRT_wchar_t wch, MSVCRT__locale_t locale)
+{
+ MSVCRT_pthreadlocinfo locinfo;
+ BOOL error;
+ int mblen;
+
+ if(!mbchar && size>0) {
+ if(len)
+ *len = 0;
+ return 0;
+ }
+
+ if(len)
+ *len = -1;
+
+ if(!MSVCRT_CHECK_PMT(size <= INT_MAX))
+ return MSVCRT_EINVAL;
+
+ if(!locale)
+ locinfo = get_locinfo();
+ else
+ locinfo = locale->locinfo;
+
+ if(!locinfo->lc_codepage) {
+ if(wch > 0xff) {
+ if(mbchar && size>0)
+ memset(mbchar, 0, size);
+ *MSVCRT__errno() = MSVCRT_EILSEQ;
+ return MSVCRT_EILSEQ;
+ }
+
+ if(!MSVCRT_CHECK_PMT_ERR(size >= 1, MSVCRT_ERANGE))
+ return MSVCRT_ERANGE;
+
+ *mbchar = wch;
+ if(len)
+ *len = 1;
+ return 0;
+ }
+
+ mblen = WideCharToMultiByte(locinfo->lc_codepage, 0, &wch, 1, mbchar, size, NULL, &error);
+ if(!mblen || error) {
+ if(!mblen && GetLastError()==ERROR_INSUFFICIENT_BUFFER) {
+ if(mbchar && size>0)
+ memset(mbchar, 0, size);
+
+ MSVCRT_INVALID_PMT("insufficient buffer size", MSVCRT_ERANGE);
+ return MSVCRT_ERANGE;
+ }
+
+ *MSVCRT__errno() = MSVCRT_EILSEQ;
+ return MSVCRT_EILSEQ;
+ }
+
+ if(len)
+ *len = mblen;
+ return 0;
+}
+
+/*********************************************************************
+ * wctomb_s (MSVCRT.@)
+ */
+int CDECL MSVCRT_wctomb_s(int *len, char *mbchar, MSVCRT_size_t size, MSVCRT_wchar_t wch)
+{
+ return MSVCRT__wctomb_s_l(len, mbchar, size, wch, NULL);
+}
+
+/*********************************************************************
+ * _wctomb_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__wctomb_l(char *dst, MSVCRT_wchar_t ch, MSVCRT__locale_t locale)
+{
+ int len;
+
+ MSVCRT__wctomb_s_l(&len, dst, dst ? 6 : 0, ch, locale);
+ return len;
+}
+
+/*********************************************************************
+ * wctomb (MSVCRT.@)
+ */
+INT CDECL MSVCRT_wctomb( char *dst, MSVCRT_wchar_t ch )
+{
+ return MSVCRT__wctomb_l(dst, ch, NULL);
+}
+
+/*********************************************************************
* wctob (MSVCRT.@)
*/
INT CDECL MSVCRT_wctob( MSVCRT_wint_t wchar )
@@ -1165,22 +1255,6 @@ INT CDECL MSVCRT_wctob( MSVCRT_wint_t wchar )
}
/*********************************************************************
- * wctomb (MSVCRT.@)
- */
-INT CDECL MSVCRT_wctomb( char *dst, MSVCRT_wchar_t ch )
-{
- BOOL error;
- INT size;
-
- size = WideCharToMultiByte(get_locinfo()->lc_codepage, 0, &ch, 1, dst, dst ? 6 : 0, NULL, &error);
- if(!size || error) {
- *MSVCRT__errno() = MSVCRT_EINVAL;
- return MSVCRT_EOF;
- }
- return size;
-}
-
-/*********************************************************************
* wcrtomb (MSVCRT.@)
*/
MSVCRT_size_t CDECL MSVCRT_wcrtomb( char *dst, MSVCRT_wchar_t ch, MSVCRT_mbstate_t *s)
More information about the wine-cvs
mailing list