Piotr Caban : msvcrt: Added mbstowcs(_s_l) implementation.
Alexandre Julliard
julliard at winehq.org
Thu May 6 11:13:23 CDT 2010
Module: wine
Branch: master
Commit: 7352ee844e98d03561fe31c9cc7b6d9e625b56c6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7352ee844e98d03561fe31c9cc7b6d9e625b56c6
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu May 6 14:27:45 2010 +0200
msvcrt: Added mbstowcs(_s_l) implementation.
---
dlls/msvcr80/msvcr80.spec | 6 ++--
dlls/msvcr90/msvcr90.spec | 6 ++--
dlls/msvcrt/mbcs.c | 89 +++++++++++++++++++++++++++++++++++++++++++++
dlls/msvcrt/msvcrt.spec | 8 ++--
4 files changed, 99 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index b2a19c4..8b82783 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -785,8 +785,8 @@
@ stub _mbstok_l
@ stub _mbstok_s
@ stub _mbstok_s_l
-@ stub _mbstowcs_l
-@ stub _mbstowcs_s_l
+@ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l
+@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l
@ cdecl _mbstrlen(str) msvcrt._mbstrlen
@ stub _mbstrlen_l
@ stub _mbstrnlen
@@ -1330,7 +1330,7 @@
@ stub mbsrtowcs
@ stub mbsrtowcs_s
@ cdecl mbstowcs(ptr str long) msvcrt.mbstowcs
-@ stub mbstowcs_s
+@ cdecl mbstowcs_s(ptr ptr long str long) msvcrt.mbstowcs_s
@ cdecl mbtowc(wstr str long) msvcrt.mbtowc
@ cdecl memchr(ptr long long) msvcrt.memchr
@ cdecl memcmp(ptr ptr long) msvcrt.memcmp
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index f41362d..9594535 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -773,8 +773,8 @@
@ stub _mbstok_l
@ stub _mbstok_s
@ stub _mbstok_s_l
-@ stub _mbstowcs_l
-@ stub _mbstowcs_s_l
+@ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l
+@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l
@ cdecl _mbstrlen(str) msvcrt._mbstrlen
@ stub _mbstrlen_l
@ stub _mbstrnlen
@@ -1314,7 +1314,7 @@
@ stub mbsrtowcs
@ stub mbsrtowcs_s
@ cdecl mbstowcs(ptr str long) msvcrt.mbstowcs
-@ stub mbstowcs_s
+@ cdecl mbstowcs_s(ptr ptr long str long) msvcrt.mbstowcs_s
@ cdecl mbtowc(wstr str long) msvcrt.mbtowc
@ cdecl memchr(ptr long long) msvcrt.memchr
@ cdecl memcmp(ptr ptr long) msvcrt.memcmp
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index c562234..837ac02 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -1718,3 +1718,92 @@ MSVCRT_size_t CDECL _mbstrlen(const char* str)
{
return _mbstrlen_l(str, NULL);
}
+
+/*********************************************************************
+ * _mbstowcs_l(MSVCRT.@)
+ */
+MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr,
+ MSVCRT_size_t count, MSVCRT__locale_t locale)
+{
+ MSVCRT_size_t tmp;
+
+ if(!locale)
+ locale = get_locale();
+
+ tmp = _mbstrlen_l(mbstr, locale);
+ if(tmp>count && wcstr)
+ tmp = count;
+
+ tmp = MultiByteToWideChar(locale->locinfo->lc_codepage, 0,
+ mbstr, tmp, wcstr, count);
+
+ if(tmp<count && wcstr)
+ wcstr[tmp] = '\0';
+
+ return tmp;
+}
+
+/*********************************************************************
+ * mbstowcs(MSVCRT.@)
+ */
+MSVCRT_size_t CDECL MSVCRT_mbstowcs(MSVCRT_wchar_t *wcstr,
+ const char *mbstr, MSVCRT_size_t count)
+{
+ return MSVCRT__mbstowcs_l(wcstr, mbstr, count, NULL);
+}
+
+/*********************************************************************
+ * _mbstowcs_s_l(MSVCRT.@)
+ */
+int CDECL MSVCRT__mbstowcs_s_l(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr,
+ MSVCRT_size_t size, const char *mbstr,
+ MSVCRT_size_t count, MSVCRT__locale_t locale)
+{
+ MSVCRT_size_t conv;
+
+ if(!wcstr && !size) {
+ conv = MSVCRT__mbstowcs_l(NULL, mbstr, 0, locale);
+ if(ret)
+ *ret = conv;
+ return 0;
+ }
+
+ if(!mbstr || !wcstr) {
+ MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
+ if(wcstr && size)
+ wcstr[0] = '\0';
+ *MSVCRT__errno() = MSVCRT_EINVAL;
+ return MSVCRT_EINVAL;
+ }
+
+ if(count==_TRUNCATE || size<count)
+ conv = size;
+ else
+ conv = count;
+
+ conv = MSVCRT__mbstowcs_l(wcstr, mbstr, conv, locale);
+ if(conv<size)
+ wcstr[conv++] = '\0';
+ else if(conv==size && (count==_TRUNCATE || wcstr[conv-1]=='\0'))
+ wcstr[conv-1] = '\0';
+ else {
+ MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
+ if(size)
+ wcstr[0] = '\0';
+ *MSVCRT__errno() = MSVCRT_ERANGE;
+ return MSVCRT_ERANGE;
+ }
+
+ if(ret)
+ *ret = conv;
+ return 0;
+}
+
+/*********************************************************************
+ * mbstowcs_s(MSVCRT.@)
+ */
+int CDECL MSVCRT__mbstowcs_s(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr,
+ MSVCRT_size_t size, const char *mbstr, MSVCRT_size_t count)
+{
+ return MSVCRT__mbstowcs_s_l(ret, wcstr, size, mbstr, count, NULL);
+}
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 3437442..8655f6f 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -731,8 +731,8 @@
# stub _mbstok_l
# stub _mbstok_s
# stub _mbstok_s_l
-# stub _mbstowcs_l
-# stub _mbstowcs_s_l
+@ cdecl _mbstowcs_l(ptr str long ptr) MSVCRT__mbstowcs_l
+@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) MSVCRT__mbstowcs_s_l
@ cdecl _mbstrlen(str)
@ cdecl _mbstrlen_l(str ptr)
# stub _mbstrnlen
@@ -1277,8 +1277,8 @@
# stub mbsdup_dbg
# stub mbsrtowcs
# stub mbsrtowcs_s
-@ cdecl mbstowcs(ptr str long) ntdll.mbstowcs
-# stub mbstowcs_s
+@ cdecl mbstowcs(ptr str long) MSVCRT_mbstowcs
+@ cdecl mbstowcs_s(ptr ptr long str long) MSVCRT__mbstowcs_s
@ cdecl mbtowc(wstr str long) MSVCRT_mbtowc
@ cdecl memchr(ptr long long) ntdll.memchr
@ cdecl memcmp(ptr ptr long) ntdll.memcmp
More information about the wine-cvs
mailing list