Piotr Caban : msvcrt: Added _mbtowc_l implementation.

Alexandre Julliard julliard at winehq.org
Wed Oct 12 14:31:18 CDT 2011


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Oct 12 11:56:13 2011 +0200

msvcrt: Added _mbtowc_l implementation.

---

 dlls/msvcrt/mbcs.c      |   57 ++++++++++++++++++++++++++++------------------
 dlls/msvcrt/msvcrt.h    |    1 +
 dlls/msvcrt/msvcrt.spec |    2 +-
 3 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 87c482c..96cea86 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -1009,28 +1009,6 @@ unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim)
 }
 
 /*********************************************************************
- *		mbtowc(MSVCRT.@)
- */
-int CDECL MSVCRT_mbtowc(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n)
-{
-    /* temp var needed because MultiByteToWideChar wants non NULL destination */
-    MSVCRT_wchar_t tmpdst = '\0';
-
-    if(n <= 0 || !str)
-        return 0;
-    if(!MultiByteToWideChar(CP_ACP, 0, str, n, &tmpdst, 1))
-        return -1;
-    if(dst)
-        *dst = tmpdst;
-    /* return the number of bytes from src that have been used */
-    if(!*str)
-        return 0;
-    if(n >= 2 && MSVCRT_isleadbyte(*str) && str[1])
-        return 2;
-    return 1;
-}
-
-/*********************************************************************
  *		_mbbtombc(MSVCRT.@)
  */
 unsigned int CDECL _mbbtombc(unsigned int c)
@@ -1869,6 +1847,41 @@ MSVCRT_size_t CDECL _mbstrlen(const char* str)
 }
 
 /*********************************************************************
+ *		_mbtowc_l(MSVCRT.@)
+ */
+int CDECL MSVCRT_mbtowc_l(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n, MSVCRT__locale_t locale)
+{
+    MSVCRT_pthreadlocinfo locinfo;
+    MSVCRT_wchar_t tmpdst = '\0';
+
+    if(!locale)
+        locinfo = get_locinfo();
+    else
+        locinfo = locale->locinfo;
+
+    if(n <= 0 || !str)
+        return 0;
+    if(!MultiByteToWideChar(locinfo->lc_codepage, 0, str, n, &tmpdst, 1))
+        return -1;
+    if(dst)
+        *dst = tmpdst;
+    /* return the number of bytes from src that have been used */
+    if(!*str)
+        return 0;
+    if(n >= 2 && MSVCRT__isleadbyte_l(*str, locale) && str[1])
+        return 2;
+    return 1;
+}
+
+/*********************************************************************
+ *              mbtowc(MSVCRT.@)
+ */
+int CDECL MSVCRT_mbtowc(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n)
+{
+    return MSVCRT_mbtowc_l(dst, str, n, NULL);
+}
+
+/*********************************************************************
  *		_mbstowcs_l(MSVCRT.@)
  */
 MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr,
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 29a3520..65e00a1 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -850,6 +850,7 @@ int __cdecl      MSVCRT_iswalpha(MSVCRT_wint_t);
 int __cdecl      MSVCRT_iswspace(MSVCRT_wint_t);
 int __cdecl      MSVCRT_iswdigit(MSVCRT_wint_t);
 int __cdecl      MSVCRT_isleadbyte(int);
+int __cdecl      MSVCRT__isleadbyte_l(int, MSVCRT__locale_t);
 
 void __cdecl     MSVCRT__lock_file(MSVCRT_FILE*);
 void __cdecl     MSVCRT__unlock_file(MSVCRT_FILE*);
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index fe07099..c8c710d 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -792,7 +792,7 @@
 # stub _mbsupr_l(str ptr)
 @ cdecl _mbsupr_s(str long)
 # stub _mbsupr_s_l(str long ptr)
-# stub _mbtowc_l(ptr str long ptr)
+@ cdecl _mbtowc_l(ptr str long ptr) MSVCRT_mbtowc_l
 @ cdecl _memccpy(ptr ptr long long) ntdll._memccpy
 @ cdecl _memicmp(str str long) ntdll._memicmp
 # stub _memicmp_l(str str long ptr)




More information about the wine-cvs mailing list