Piotr Caban : msvcrt: Added mbsrtowcs implementation.

Alexandre Julliard julliard at winehq.org
Thu Nov 29 14:15:44 CST 2012


Module: wine
Branch: master
Commit: 5e50ec3df288b3bc9221c2deb802fa1ddc846df2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5e50ec3df288b3bc9221c2deb802fa1ddc846df2

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Nov 29 09:23:39 2012 +0000

msvcrt: Added mbsrtowcs implementation.

---

 dlls/msvcrt/mbcs.c      |   34 +++++++++++++++++++++++++++++++++-
 dlls/msvcrt/msvcrt.spec |    2 +-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 71b5343..e06511d 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -2077,7 +2077,7 @@ MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr,
         if(mbstr[size] == '\0')
             break;
 
-        size += (MSVCRT__isleadbyte_l(mbstr[size], locale) ? 2 : 1);
+        size += (MSVCRT__isleadbyte_l((unsigned char)mbstr[size], locale) ? 2 : 1);
     }
 
     size = MultiByteToWideChar(locinfo->lc_codepage, 0,
@@ -2150,3 +2150,35 @@ int CDECL MSVCRT__mbstowcs_s(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr,
 {
     return MSVCRT__mbstowcs_s_l(ret, wcstr, size, mbstr, count, NULL);
 }
+
+/*********************************************************************
+ *              mbsrtowcs(MSVCRT.@)
+ */
+MSVCRT_size_t CDECL MSVCRT_mbsrtowcs(MSVCRT_wchar_t *wcstr,
+        const char **pmbstr, MSVCRT_size_t count, MSVCRT_mbstate_t *state)
+{
+    MSVCRT_mbstate_t s = (state ? *state : 0);
+    MSVCRT_wchar_t tmpdst;
+    MSVCRT_size_t ret = 0;
+
+    if(!MSVCRT_CHECK_PMT(pmbstr != NULL))
+        return -1;
+
+    while(!wcstr || count>ret) {
+        int ch_len = MSVCRT_mbrtowc(&tmpdst, *pmbstr, 2, &s);
+        if(wcstr)
+            wcstr[ret] = tmpdst;
+
+        if(ch_len < 0) {
+            return -1;
+        }else if(ch_len == 0) {
+            *pmbstr = NULL;
+            return ret;
+        }
+
+        *pmbstr += ch_len;
+        ret++;
+    }
+
+    return ret;
+}
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 4f2fa9a..6a88832 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1331,7 +1331,7 @@
 @ cdecl mbrlen(ptr long ptr) MSVCRT_mbrlen
 @ cdecl mbrtowc(ptr str long ptr) MSVCRT_mbrtowc
 # stub mbsdup_dbg(wstr long ptr long)
-# stub mbsrtowcs(ptr ptr long ptr)
+@ cdecl mbsrtowcs(ptr ptr long ptr) MSVCRT_mbsrtowcs
 # stub mbsrtowcs_s(ptr ptr long ptr long ptr)
 @ cdecl mbstowcs(ptr str long) MSVCRT_mbstowcs
 @ cdecl mbstowcs_s(ptr ptr long str long) MSVCRT__mbstowcs_s




More information about the wine-cvs mailing list