Alexandre Julliard : msvcp: Don't forward the mbtowc functions to msvcrt.
Alexandre Julliard
julliard at winehq.org
Fri Dec 27 13:31:09 CST 2013
Module: wine
Branch: master
Commit: db0a6fcaa5ef8529a66273bc7f43204de11a0cff
URL: http://source.winehq.org/git/wine.git/?a=commit;h=db0a6fcaa5ef8529a66273bc7f43204de11a0cff
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Dec 27 12:22:52 2013 +0100
msvcp: Don't forward the mbtowc functions to msvcrt.
---
dlls/msvcp71/msvcp71.spec | 14 +++---
dlls/msvcp90/locale.c | 102 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 109 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec
index 5acc18b..8e21fb7 100644
--- a/dlls/msvcp71/msvcp71.spec
+++ b/dlls/msvcp71/msvcp71.spec
@@ -5157,13 +5157,13 @@
# extern _Xbig
# extern _Zero
@ stub __Wcrtomb_lk
-@ cdecl btowc(long) msvcrt.btowc
-@ cdecl mbrlen(ptr long ptr) msvcrt.mbrlen
-@ cdecl mbrtowc(ptr str long ptr) msvcrt.mbrtowc
-@ cdecl mbsrtowcs(ptr ptr long ptr) msvcrt.mbsrtowcs
+@ cdecl btowc(long)
+@ cdecl mbrlen(ptr long ptr)
+@ cdecl mbrtowc(ptr str long ptr)
+@ cdecl mbsrtowcs(ptr ptr long ptr)
@ cdecl towctrans(long long)
-@ cdecl wcrtomb(ptr long ptr) msvcrt.wcrtomb
-@ cdecl wcsrtombs(ptr ptr long ptr) msvcrt.wcsrtombs
-@ cdecl wctob(long) msvcrt.wctob
+@ cdecl wcrtomb(ptr long ptr)
+@ cdecl wcsrtombs(ptr ptr long ptr)
+@ cdecl wctob(long)
@ cdecl wctrans(str)
@ cdecl wctype(str)
diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 08cc893..9b84b63 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -26,6 +26,7 @@
#include "limits.h"
#include "math.h"
#include "stdio.h"
+#include "wchar.h"
#include "wctype.h"
#include "time.h"
@@ -9487,6 +9488,107 @@ wint_t __cdecl towctrans(wint_t c, wctrans_t category)
return towlower(c);
}
+/* btowc */
+wint_t __cdecl btowc(int c)
+{
+ wchar_t ret;
+ int state = 0;
+ char ch = c;
+
+ if (c == EOF || _Mbrtowc( &ret, &ch, 1, &state, NULL ) != 1) return WEOF;
+ return ret;
+}
+
+/* mbrlen */
+size_t __cdecl mbrlen(const char *str, size_t n, mbstate_t *state)
+{
+ static int local_state;
+
+ if (!state) state = &local_state;
+ return _Mbrtowc( NULL, str, n, state, NULL );
+}
+
+/* mbrtowc */
+size_t __cdecl mbrtowc(wchar_t *dst, const char *str, size_t n, mbstate_t *state)
+{
+ static int local_state;
+
+ if (!state) state = &local_state;
+ return _Mbrtowc( dst, str, n, state, NULL );
+}
+
+/* mbsrtowcs */
+size_t __cdecl mbsrtowcs(wchar_t *dst, const char **pstr, size_t n, mbstate_t *state)
+{
+ static int local_state;
+ size_t ret = 0;
+ wchar_t wc;
+ const char *src;
+
+ if (!pstr)
+ {
+ *_errno() = EINVAL;
+ _invalid_parameter( NULL, NULL, NULL, 0, 0 );
+ }
+ src = *pstr;
+ if (!state) state = &local_state;
+
+ while (!dst || n > ret)
+ {
+ int len = _Mbrtowc( &wc, src, 2, state, NULL );
+ if (len < 0) return -1;
+ if (!len) break;
+ if (dst) dst[ret] = wc;
+ ret++;
+ if (!wc) break;
+ src += len;
+ }
+ return ret;
+}
+
+/* wctob */
+int __cdecl wctob(wint_t wc)
+{
+ char ret[MB_LEN_MAX];
+
+ if (wc == WEOF || _Wcrtomb( ret, wc, NULL, NULL ) != -1) return EOF;
+ return ret[0];
+}
+
+/* wcrtomb */
+size_t __cdecl wcrtomb(char *dst, wchar_t wc, mbstate_t *state)
+{
+ return _Wcrtomb( dst, wc, state, NULL );
+}
+
+/* wcsrtombs */
+size_t __cdecl wcsrtombs(char *dst, const wchar_t **pstr, size_t n, mbstate_t *state)
+{
+ const wchar_t *src;
+ char buffer[MB_LEN_MAX];
+ size_t ret = 0;
+
+ if (!pstr)
+ {
+ *_errno() = EINVAL;
+ _invalid_parameter( NULL, NULL, NULL, 0, 0 );
+ }
+ src = *pstr;
+
+ while (!dst || n > ret)
+ {
+ int len = _Wcrtomb( buffer, *src, state, NULL );
+ if (len <= 0) return -1;
+ if (n < ret + len) break;
+ memcpy( dst + ret, buffer, len );
+ ret += len;
+ if (!buffer[0]) break;
+ src++;
+ }
+ return ret;
+}
+
+
DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet at locale@std@@")
DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate at D@std@@")
DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate at _W@std@@")
More information about the wine-cvs
mailing list