Piotr Caban : msvcp110: Fix num_put<char> structure layout.

Alexandre Julliard julliard at wine.codeweavers.com
Sat May 14 10:07:27 CDT 2016


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue May 10 15:24:12 2016 +0200

msvcp110: Fix num_put<char> structure layout.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp90/locale.c  | 37 ++++++++++++++++++++++++++++++++-----
 dlls/msvcp90/msvcp90.h |  2 ++
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 89465b5..06b2ca1 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -7124,7 +7124,9 @@ DEFINE_THISCALL_WRAPPER(num_put_char__Init, 8)
 void __thiscall num_put_char__Init(num_put *this, const _Locinfo *locinfo)
 {
     TRACE("(%p %p)\n", this, locinfo);
+#if _MSVCP_VER < 110
     _Locinfo__Getcvt(locinfo, &this->cvt);
+#endif
 }
 
 /* ??0?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z */
@@ -7869,7 +7871,9 @@ DEFINE_THISCALL_WRAPPER(num_put_wchar__Init, 8)
 void __thiscall num_put_wchar__Init(num_put *this, const _Locinfo *locinfo)
 {
     TRACE("(%p %p)\n", this, locinfo);
+#if _MSVCP_VER < 110
     _Locinfo__Getcvt(locinfo, &this->cvt);
+#endif
 }
 
 /* ??0?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z */
@@ -8104,6 +8108,7 @@ ostreambuf_iterator_wchar* __cdecl num_put_wchar__Put(const num_put *this, ostre
     return ret;
 }
 
+#if _MSVCP_VER < 110
 /* ?_Putc@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PBDI at Z */
 /* ?_Putc@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PEBD_K at Z */
 /* ?_Putc@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@PBDI at Z */
@@ -8124,6 +8129,7 @@ ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putc(const num_put *this, ostr
     *ret = dest;
     return ret;
 }
+#endif
 
 /* ?_Putgrouped@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PBDI_W at Z */
 /* ?_Putgrouped@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PEBD_K_W at Z */
@@ -8208,6 +8214,27 @@ ostreambuf_iterator_wchar* __cdecl num_put_short__Fput(const num_put *this, ostr
     return NULL;
 }
 
+#if _MSVCP_VER < 110
+static void num_put_wchar_wide_put(const num_put *this,
+        ostreambuf_iterator_wchar *dest, ios_base *base,
+        const char *buf, MSVCP_size_t count)
+{
+    num_put_wchar__Putc(this, dest, *dest, buf, count);
+}
+#else
+static void num_put_wchar_wide_put(const num_put *this,
+        ostreambuf_iterator_wchar *dest, ios_base *base,
+                const char *buf, MSVCP_size_t count)
+{
+    ctype_wchar *ctype;
+    MSVCP_size_t i;
+
+    ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
+    for(i=0; i<count; i++)
+        ostreambuf_iterator_wchar_put(dest, ctype_wchar_widen_ch(ctype, buf[i]));
+}
+#endif
+
 /* TODO: This function should be removed when num_put_wchar__Fput is implemented */
 static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_iterator_wchar *ret,
         ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
@@ -8258,7 +8285,7 @@ static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_
     base->wide = 0;
 
     if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
-        num_put_wchar__Putc(this, &dest, dest, buf, 1);
+        num_put_wchar_wide_put(this, &dest, base, buf, 1);
         buf++;
     }
     if(adjustfield != FMTFLAG_left) {
@@ -8272,7 +8299,7 @@ static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_
         else if(!buf[i])
             num_put_wchar__Rep(this, &dest, dest, sep, 1);
         else
-            num_put_wchar__Putc(this, &dest, dest, buf+i, 1);
+            num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
     }
 
     return num_put_wchar__Rep(this, ret, dest, fill, pad);
@@ -8351,10 +8378,10 @@ static ostreambuf_iterator_wchar* num_put__Iput(const num_put *this, ostreambuf_
     base->wide = 0;
 
     if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
-        num_put_wchar__Putc(this, &dest, dest, buf, 1);
+        num_put_wchar_wide_put(this, &dest, base, buf, 1);
         buf++;
     }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
-        num_put_wchar__Putc(this, &dest, dest, buf, 2);
+        num_put_wchar_wide_put(this, &dest, base, buf, 2);
         buf += 2;
     }
     if(adjustfield != FMTFLAG_left) {
@@ -8366,7 +8393,7 @@ static ostreambuf_iterator_wchar* num_put__Iput(const num_put *this, ostreambuf_
         if(!buf[i])
             num_put_wchar__Rep(this, &dest, dest, sep, 1);
         else
-            num_put_wchar__Putc(this, &dest, dest, buf+i, 1);
+            num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
     }
 
     return num_put_wchar__Rep(this, ret, dest, fill, pad);
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index 4a42332..aa7322f 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.h
@@ -550,7 +550,9 @@ istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get*, ist
 /* class num_put<wchar> */
 typedef struct {
     locale_facet facet;
+#if _MSVCP_VER < 110
     _Cvtvec cvt;
+#endif
 } num_put;
 
 num_put* num_put_char_use_facet(const locale*);




More information about the wine-cvs mailing list