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