From: Paolo Carlini Date: Wed, 6 Feb 2002 12:13:00 +0000 (+0100) Subject: locale_facets.tcc (money_get::do_get(string)): In case money_base::symbol deal proper... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6662d4c337fffc5c2e5371a72dff90a06d2c3407;p=gcc.git locale_facets.tcc (money_get::do_get(string)): In case money_base::symbol deal properly with multi-char sign for patterns... 2002-02-06 Paolo Carlini * include/bits/locale_facets.tcc (money_get::do_get(string)): In case money_base::symbol deal properly with multi-char sign for patterns {X,Y,Z,symbol} and {X,Y,symbol,none}. * testsuite/22_locale/money_get_members_char.cc: Add test07. * testsuite/22_locale/money_get_members_wchar_t.cc: Add test07. From-SVN: r49543 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 835da3319f5..40c21893d5a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2002-02-06 Paolo Carlini + + * include/bits/locale_facets.tcc (money_get::do_get(string)): + In case money_base::symbol deal properly with multi-char sign + for patterns {X,Y,Z,symbol} and {X,Y,symbol,none}. + * testsuite/22_locale/money_get_members_char.cc: Add test07. + * testsuite/22_locale/money_get_members_wchar_t.cc: Add test07. + 2002-02-05 Paolo Carlini * include/bits/locale_facets.tcc (money_get::do_get(string)): diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 3a35139cece..c27b1eec383 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -941,8 +941,10 @@ namespace std switch (__which) { case money_base::symbol: - if (__io.flags() & ios_base::showbase || __i < 2 || - __i == 2 && static_cast(__p.field[3]) != money_base::none) + if (__io.flags() & ios_base::showbase + || __i < 2 + || (__i == 2 && static_cast(__p.field[3]) != money_base::none) + || __sign.size() > 1) { // According to 22.2.6.1.2.2, symbol is required if // (__io.flags() & ios_base::showbase), otherwise is optional diff --git a/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc b/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc index 249e8b20f00..148854a33d1 100644 --- a/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc +++ b/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc @@ -419,6 +419,105 @@ void test06() VERIFY( val == buffer3 ); } +class My_money_io_a : public std::moneypunct +{ +public: + explicit My_money_io_a(size_t r = 0): std::moneypunct(r) { } + char_type do_decimal_point() const { return '.'; } + char_type do_thousands_sep() const { return ','; } + std::string do_grouping() const { return "\004"; } + + std::string do_curr_symbol() const { return "$"; } + std::string do_positive_sign() const { return "()"; } + + int do_frac_digits() const { return 2; } + + pattern do_pos_format() const + { + static pattern pat = { { sign, value, space, symbol } }; + return pat; + } +}; + +class My_money_io_b : public std::moneypunct +{ +public: + explicit My_money_io_b(size_t r = 0): std::moneypunct(r) { } + char_type do_decimal_point() const { return '.'; } + char_type do_thousands_sep() const { return ','; } + std::string do_grouping() const { return "\004"; } + + std::string do_curr_symbol() const { return "$"; } + std::string do_positive_sign() const { return "()"; } + + int do_frac_digits() const { return 2; } + + pattern do_pos_format() const + { + static pattern pat = { { sign, value, symbol, none } }; + return pat; + } +}; + +// This one exercises patterns of the type { X, Y, Z, symbol } and +// { X, Y, symbol, none } for a two character long sign. Therefore +// the optional symbol (showbase is false by default) must be consumed +// if present, since "rest of the sign" is left to read. +void test07() +{ + using namespace std; + typedef istreambuf_iterator InIt; + + bool intl = false; + ios_base::iostate err; + + locale loc_a(locale::classic(), new My_money_io_a); + + string buffer_a("(1234.56 $)"); + string buffer_a_ns("(1234.56 )"); + + InIt iend_a, iend_a_ns; + string val_a, val_a_ns; + + const money_get& mg_a = + use_facet >(loc_a); + + istringstream fmt_a(buffer_a); + fmt_a.imbue(loc_a); + InIt ibeg_a(fmt_a); + mg_a.get(ibeg_a,iend_a,intl,fmt_a,err,val_a); + VERIFY( val_a == "123456" ); + + istringstream fmt_a_ns(buffer_a_ns); + fmt_a_ns.imbue(loc_a); + InIt ibeg_a_ns(fmt_a_ns); + mg_a.get(ibeg_a_ns,iend_a_ns,intl,fmt_a_ns,err,val_a_ns); + VERIFY( val_a_ns == "123456" ); + + locale loc_b(locale::classic(), new My_money_io_b); + + string buffer_b("(1234.56$)"); + string buffer_b_ns("(1234.56)"); + + InIt iend_b, iend_b_ns; + string val_b, val_b_ns; + + const money_get& mg_b = + use_facet >(loc_b); + + istringstream fmt_b(buffer_b); + fmt_b.imbue(loc_b); + InIt ibeg_b(fmt_b); + mg_b.get(ibeg_b,iend_b,intl,fmt_b,err,val_b); + VERIFY( val_b == "123456" ); + + istringstream fmt_b_ns(buffer_b_ns); + fmt_b_ns.imbue(loc_b); + InIt ibeg_b_ns(fmt_b_ns); + mg_b.get(ibeg_b_ns,iend_b_ns,intl,fmt_b_ns,err,val_b_ns); + VERIFY( val_b_ns == "123456" ); +} + int main() { test01(); @@ -427,5 +526,6 @@ int main() test04(); test05(); test06(); + test07(); return 0; } diff --git a/libstdc++-v3/testsuite/22_locale/money_get_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/money_get_members_wchar_t.cc index 798f4a8dabb..cf9ff1fca4b 100644 --- a/libstdc++-v3/testsuite/22_locale/money_get_members_wchar_t.cc +++ b/libstdc++-v3/testsuite/22_locale/money_get_members_wchar_t.cc @@ -420,6 +420,105 @@ void test06() mg.get(ibeg3,iend3,false,fmt3,err,val); VERIFY( val == buffer3 ); } + +class My_money_io_a : public std::moneypunct +{ +public: + explicit My_money_io_a(size_t r = 0): std::moneypunct(r) { } + char_type do_decimal_point() const { return L'.'; } + char_type do_thousands_sep() const { return L','; } + std::string do_grouping() const { return "\004"; } + + std::wstring do_curr_symbol() const { return L"$"; } + std::wstring do_positive_sign() const { return L"()"; } + + int do_frac_digits() const { return 2; } + + pattern do_pos_format() const + { + static pattern pat = { { sign, value, space, symbol } }; + return pat; + } +}; + +class My_money_io_b : public std::moneypunct +{ +public: + explicit My_money_io_b(size_t r = 0): std::moneypunct(r) { } + char_type do_decimal_point() const { return L'.'; } + char_type do_thousands_sep() const { return L','; } + std::string do_grouping() const { return "\004"; } + + std::wstring do_curr_symbol() const { return L"$"; } + std::wstring do_positive_sign() const { return L"()"; } + + int do_frac_digits() const { return 2; } + + pattern do_pos_format() const + { + static pattern pat = { { sign, value, symbol, none } }; + return pat; + } +}; + +// This one exercises patterns of the type { X, Y, Z, symbol } and +// { X, Y, symbol, none } for a two character long sign. Therefore +// the optional symbol (showbase is false by default) must be consumed +// if present, since "rest of the sign" is left to read. +void test07() +{ + using namespace std; + typedef istreambuf_iterator InIt; + + bool intl = false; + ios_base::iostate err; + + locale loc_a(locale::classic(), new My_money_io_a); + + wstring buffer_a(L"(1234.56 $)"); + wstring buffer_a_ns(L"(1234.56 )"); + + InIt iend_a, iend_a_ns; + wstring val_a, val_a_ns; + + const money_get& mg_a = + use_facet >(loc_a); + + wistringstream fmt_a(buffer_a); + fmt_a.imbue(loc_a); + InIt ibeg_a(fmt_a); + mg_a.get(ibeg_a,iend_a,intl,fmt_a,err,val_a); + VERIFY( val_a == L"123456" ); + + wistringstream fmt_a_ns(buffer_a_ns); + fmt_a_ns.imbue(loc_a); + InIt ibeg_a_ns(fmt_a_ns); + mg_a.get(ibeg_a_ns,iend_a_ns,intl,fmt_a_ns,err,val_a_ns); + VERIFY( val_a_ns == L"123456" ); + + locale loc_b(locale::classic(), new My_money_io_b); + + wstring buffer_b(L"(1234.56$)"); + wstring buffer_b_ns(L"(1234.56)"); + + InIt iend_b, iend_b_ns; + wstring val_b, val_b_ns; + + const money_get& mg_b = + use_facet >(loc_b); + + wistringstream fmt_b(buffer_b); + fmt_b.imbue(loc_b); + InIt ibeg_b(fmt_b); + mg_b.get(ibeg_b,iend_b,intl,fmt_b,err,val_b); + VERIFY( val_b == L"123456" ); + + wistringstream fmt_b_ns(buffer_b_ns); + fmt_b_ns.imbue(loc_b); + InIt ibeg_b_ns(fmt_b_ns); + mg_b.get(ibeg_b_ns,iend_b_ns,intl,fmt_b_ns,err,val_b_ns); + VERIFY( val_b_ns == L"123456" ); +} #endif int main() @@ -431,6 +530,7 @@ int main() test04(); test05(); test06(); + test07(); #endif return 0; }