Piotr Caban : msvcp90: Use correct locale in basic_ios:: narrow and basic_ios::widen.

Alexandre Julliard julliard at winehq.org
Tue Nov 28 15:11:05 CST 2017


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Nov 28 19:13:43 2017 +0100

msvcp90: Use correct locale in basic_ios::narrow and basic_ios::widen.

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

---

 dlls/msvcp90/ios.c       |  8 ++++----
 dlls/msvcp90/tests/ios.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c
index 9ae9e65..3f85997 100644
--- a/dlls/msvcp90/ios.c
+++ b/dlls/msvcp90/ios.c
@@ -5880,7 +5880,7 @@ DEFINE_THISCALL_WRAPPER(basic_ios_char_narrow, 12)
 char __thiscall basic_ios_char_narrow(basic_ios_char *this, char ch, char def)
 {
     TRACE("(%p %c %c)\n", this, ch, def);
-    return ctype_char_narrow_ch(ctype_char_use_facet(IOS_LOCALE(this->strbuf)), ch, def);
+    return ctype_char_narrow_ch(ctype_char_use_facet(IOS_LOCALE(&this->base)), ch, def);
 }
 
 /* ?rdbuf@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEPAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at PAV32@@Z */
@@ -5953,7 +5953,7 @@ DEFINE_THISCALL_WRAPPER(basic_ios_char_widen, 8)
 char __thiscall basic_ios_char_widen(basic_ios_char *this, char ch)
 {
     TRACE("(%p %c)\n", this, ch);
-    return ctype_char_widen_ch(ctype_char_use_facet(IOS_LOCALE(this->strbuf)), ch);
+    return ctype_char_widen_ch(ctype_char_use_facet(IOS_LOCALE(&this->base)), ch);
 }
 
 /* ?swap@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXAAV12@@Z */
@@ -6161,7 +6161,7 @@ DEFINE_THISCALL_WRAPPER(basic_ios_wchar_narrow, 12)
 char __thiscall basic_ios_wchar_narrow(basic_ios_wchar *this, wchar_t ch, char def)
 {
     TRACE("(%p %c %c)\n", this, ch, def);
-    return ctype_wchar_narrow_ch(ctype_wchar_use_facet(IOS_LOCALE(this->strbuf)), ch, def);
+    return ctype_wchar_narrow_ch(ctype_wchar_use_facet(IOS_LOCALE(&this->base)), ch, def);
 }
 
 /* ?rdbuf@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEPAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2 at PAV32@@Z */
@@ -6248,7 +6248,7 @@ DEFINE_THISCALL_WRAPPER(basic_ios_wchar_widen, 8)
 wchar_t __thiscall basic_ios_wchar_widen(basic_ios_wchar *this, char ch)
 {
     TRACE("(%p %c)\n", this, ch);
-    return ctype_wchar_widen_ch(ctype_wchar_use_facet(IOS_LOCALE(this->strbuf)), ch);
+    return ctype_wchar_widen_ch(ctype_wchar_use_facet(IOS_LOCALE(&this->base)), ch);
 }
 
 /* ?swap@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXAAV12@@Z */
diff --git a/dlls/msvcp90/tests/ios.c b/dlls/msvcp90/tests/ios.c
index 90fa6b1..5dcb1d4 100644
--- a/dlls/msvcp90/tests/ios.c
+++ b/dlls/msvcp90/tests/ios.c
@@ -496,10 +496,14 @@ static basic_ostream_wchar* (*__thiscall p_basic_ostream_short_print_ushort)(bas
 
 /* basic_ios */
 static locale*  (*__thiscall p_basic_ios_char_imbue)(basic_ios_char*, locale*, const locale*);
+static basic_ios_char* (*__thiscall p_basic_ios_char_ctor)(basic_ios_char*);
+static char (*__thiscall p_basic_ios_char_widen)(basic_ios_char*, char);
+static void (*__thiscall p_basic_ios_char_dtor)(basic_ios_char*);
 
 static locale*  (*__thiscall p_basic_ios_wchar_imbue)(basic_ios_wchar*, locale*, const locale*);
 
 /* ios_base */
+static void          (*__thiscall p_ios_base__Init)(ios_base*);
 static IOSB_iostate  (*__thiscall p_ios_base_rdstate)(const ios_base*);
 static IOSB_fmtflags (*__thiscall p_ios_base_setf_mask)(ios_base*, IOSB_fmtflags, IOSB_fmtflags);
 static void          (*__thiscall p_ios_base_unsetf)(ios_base*, IOSB_fmtflags);
@@ -724,6 +728,8 @@ static BOOL init(void)
         SET(p_basic_ostream_char_print_complex_ldouble,
             "??$?6ODU?$char_traits at D@std@@@std@@YAAEAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AEAV10@AEBV?$complex at O@0@@Z");
 
+        SET(p_ios_base__Init,
+            "?_Init at ios_base@std@@IEAAXXZ");
         SET(p_ios_base_rdstate,
             "?rdstate at ios_base@std@@QEBAHXZ");
         SET(p_ios_base_setf_mask,
@@ -735,6 +741,12 @@ static BOOL init(void)
 
         SET(p_basic_ios_char_imbue,
             "?imbue@?$basic_ios at DU?$char_traits at D@std@@@std@@QEAA?AVlocale at 2@AEBV32@@Z");
+        SET(p_basic_ios_char_ctor,
+            "??0?$basic_ios at DU?$char_traits at D@std@@@std@@IEAA at XZ");
+        SET(p_basic_ios_char_widen,
+            "?widen@?$basic_ios at DU?$char_traits at D@std@@@std@@QEBADD at Z");
+        SET(p_basic_ios_char_dtor,
+            "??1?$basic_ios at DU?$char_traits at D@std@@@std@@UEAA at XZ");
 
         SET(p_basic_ios_wchar_imbue,
             "?imbue@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QEAA?AVlocale at 2@AEBV32@@Z");
@@ -856,6 +868,8 @@ static BOOL init(void)
         SET(p_basic_ostream_char_print_complex_ldouble,
             "??$?6ODU?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@ABV?$complex at O@0@@Z");
 
+        SET(p_ios_base__Init,
+            "?_Init at ios_base@std@@IAAXXZ");
         SET(p_ios_base_rdstate,
             "?rdstate at ios_base@std@@QBAHXZ");
         SET(p_ios_base_setf_mask,
@@ -867,6 +881,12 @@ static BOOL init(void)
 
         SET(p_basic_ios_char_imbue,
             "?imbue@?$basic_ios at DU?$char_traits at D@std@@@std@@QAA?AVlocale at 2@ABV32@@Z");
+        SET(p_basic_ios_char_ctor,
+            "??0?$basic_ios at DU?$char_traits at D@std@@@std@@IAA at XZ");
+        SET(p_basic_ios_char_widen,
+            "?widen@?$basic_ios at DU?$char_traits at D@std@@@std@@QBADD at Z");
+        SET(p_basic_ios_char_dtor,
+            "??1?$basic_ios at DU?$char_traits at D@std@@@std@@UAA at XZ");
 
         SET(p_basic_ios_wchar_imbue,
             "?imbue@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAA?AVlocale at 2@ABV32@@Z");
@@ -987,6 +1007,8 @@ static BOOL init(void)
         SET(p_basic_ostream_char_print_complex_ldouble,
             "??$?6ODU?$char_traits at D@std@@@std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@0 at AAV10@ABV?$complex at O@0@@Z");
 
+        SET(p_ios_base__Init,
+            "?_Init at ios_base@std@@IAEXXZ");
         SET(p_ios_base_rdstate,
             "?rdstate at ios_base@std@@QBEHXZ");
         SET(p_ios_base_setf_mask,
@@ -998,6 +1020,12 @@ static BOOL init(void)
 
         SET(p_basic_ios_char_imbue,
             "?imbue@?$basic_ios at DU?$char_traits at D@std@@@std@@QAE?AVlocale at 2@ABV32@@Z");
+        SET(p_basic_ios_char_ctor,
+            "??0?$basic_ios at DU?$char_traits at D@std@@@std@@IAE at XZ");
+        SET(p_basic_ios_char_widen,
+            "?widen@?$basic_ios at DU?$char_traits at D@std@@@std@@QBEDD at Z");
+        SET(p_basic_ios_char_dtor,
+            "??1?$basic_ios at DU?$char_traits at D@std@@@std@@UAE at XZ");
 
         SET(p_basic_ios_wchar_imbue,
             "?imbue@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAE?AVlocale at 2@ABV32@@Z");
@@ -2331,6 +2359,20 @@ static void test_istream_read_complex_double(void)
     }
 }
 
+static void test_basic_ios(void)
+{
+    basic_ios_char bi;
+    char c;
+
+    call_func1(p_basic_ios_char_ctor, &bi);
+    call_func1(p_ios_base__Init, &bi.base);
+
+    c = (UINT_PTR)call_func2(p_basic_ios_char_widen, &bi, 'a');
+    ok(c == 'a', "basic_ios::widen('a') returned %x\n", c);
+
+    call_func1(p_basic_ios_char_dtor, &bi);
+}
+
 START_TEST(ios)
 {
     if(!init())
@@ -2356,6 +2398,7 @@ START_TEST(ios)
     test_ostream_print_complex_double();
     test_ostream_print_complex_ldouble();
     test_istream_read_complex_double();
+    test_basic_ios();
 
     ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n");
 




More information about the wine-cvs mailing list