Piotr Caban : msvcp110: Fix _Getcvt implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 22 10:26:42 CDT 2015


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Apr 22 15:57:40 2015 +0200

msvcp110: Fix _Getcvt implementation.

---

 dlls/msvcp110/msvcp110.spec         |  2 +-
 dlls/msvcp120/msvcp120.spec         |  2 +-
 dlls/msvcp120_app/msvcp120_app.spec |  2 +-
 dlls/msvcp90/locale.c               | 26 ++++++++++++++++++++++++++
 dlls/msvcp90/msvcp90.h              |  7 +++++++
 include/msvcrt/stdlib.h             |  4 ++--
 6 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index 2f3ace4..3be4944 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -3780,7 +3780,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl _Getcvt(ptr)
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index bc539b2..d8187d5 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -3723,7 +3723,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl _Getcvt(ptr)
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec
index 6ce2eb0..bd949be 100644
--- a/dlls/msvcp120_app/msvcp120_app.spec
+++ b/dlls/msvcp120_app/msvcp120_app.spec
@@ -3723,7 +3723,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll() msvcp120._Getcoll
 @ cdecl _Getctype(ptr) msvcp120._Getctype
-@ cdecl -ret64 _Getcvt() msvcp120._Getcvt
+@ cdecl _Getcvt(ptr) msvcp120._Getcvt
 @ cdecl _Getdateorder() msvcp120._Getdateorder
 @ cdecl _Getwctype(long ptr) msvcp120._Getwctype
 @ cdecl _Getwctypes(ptr ptr ptr ptr) msvcp120._Getwctypes
diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index e7d816b..f77d844 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -24,6 +24,7 @@
 #include "errno.h"
 #include "limits.h"
 #include "math.h"
+#include "mbctype.h"
 #include "stdio.h"
 #include "wchar.h"
 #include "wctype.h"
@@ -684,6 +685,7 @@ _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
 }
 
 /* _Getcvt */
+#if _MSVCP_VER < 110
 ULONGLONG __cdecl _Getcvt(void)
 {
     union {
@@ -697,14 +699,38 @@ ULONGLONG __cdecl _Getcvt(void)
     ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
     return ret.ull;
 }
+#else
+_Cvtvec* __cdecl _Getcvt(_Cvtvec *ret)
+{
+    int i;
+
+    TRACE("\n");
+
+    memset(ret, 0, sizeof(*ret));
+    ret->page = ___lc_codepage_func();
+    ret->mb_max = ___mb_cur_max_func();
+
+    if(ret->mb_max > 1) {
+        for(i=0; i<256; i++)
+            if(_ismbblead(i)) ret->isleadbyte[i/8] |= 1 << (i&7);
+    }
+    return ret;
+}
+#endif
 
 /* ?_Getcvt at _Locinfo@std@@QBE?AU_Cvtvec@@XZ */
 /* ?_Getcvt at _Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
 {
+#if _MSVCP_VER < 110
     ULONGLONG ull = _Getcvt();
     memcpy(ret, &ull, sizeof(ull));
+#else
+    _Cvtvec cvtvec;
+    _Getcvt(&cvtvec);
+    memcpy(ret, &cvtvec, sizeof(cvtvec));
+#endif
     return ret;
 }
 
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index 62dddc9..17d582c 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.h
@@ -192,8 +192,15 @@ int __thiscall codecvt_char_in(const codecvt_char*, int*, const char*,
 int __thiscall codecvt_base_max_length(const codecvt_base*);
 
 typedef struct {
+#if _MSVCP_VER < 110
     LCID handle;
+#endif
     unsigned page;
+#if _MSVCP_VER >= 110
+    int mb_max;
+    int unk;
+    BYTE isleadbyte[32];
+#endif
 } _Cvtvec;
 
 /* class codecvt<wchar> */
diff --git a/include/msvcrt/stdlib.h b/include/msvcrt/stdlib.h
index e88ffa3..174df43 100644
--- a/include/msvcrt/stdlib.h
+++ b/include/msvcrt/stdlib.h
@@ -119,8 +119,8 @@ extern unsigned int _fmode;
 
 #endif  /* __i386__ */
 
-extern int*           __cdecl ___mb_cur_max_func(void);
-#define __mb_cur_max        (*___mb_cur_max_func())
+extern int            __cdecl ___mb_cur_max_func(void);
+#define __mb_cur_max        ___mb_cur_max_func()
 extern __msvcrt_ulong* __cdecl __doserrno(void);
 #define _doserrno           (*__doserrno())
 extern int*           __cdecl _errno(void);




More information about the wine-cvs mailing list