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

Alexandre Julliard julliard at winehq.org
Sun Mar 18 09:02:32 CDT 2018


Module: wine
Branch: oldstable
Commit: 9c332d3299330b04d04461861c99ed178c415aac
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9c332d3299330b04d04461861c99ed178c415aac

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>
(cherry picked from commit 53bab55d303dd8ee8ce696b94c47718feb7bc3d4)
Signed-off-by: Michael Stefaniuc <mstefani 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 84a6bf2c..5d80443 100644
--- a/dlls/msvcp90/ios.c
+++ b/dlls/msvcp90/ios.c
@@ -5832,7 +5832,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 */
@@ -5905,7 +5905,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 */
@@ -6113,7 +6113,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 */
@@ -6200,7 +6200,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 91c546e..2117df4 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);
@@ -737,6 +741,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,
@@ -748,6 +754,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");
@@ -869,6 +881,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,
@@ -880,6 +894,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");
@@ -1000,6 +1020,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,
@@ -1011,6 +1033,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");
@@ -2344,6 +2372,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())
@@ -2369,6 +2411,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