Module: wine Branch: master Commit: d7f6eac058a365c7b2f5593502b0b4fe7330834c URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7f6eac058a365c7b2f5593502...
Author: Piotr Caban piotr@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@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */ /* ?_Getcvt@_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);