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