From e07554eb1747af7a6fd6479ee38db3a04aa08e2d Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 5 Feb 2002 12:35:48 +0100 Subject: [PATCH] locale_facets.tcc (money_get::do_get(string)): First construct a tentative returned string... 2002-02-05 Paolo Carlini * include/bits/locale_facets.tcc (money_get::do_get(string)): First construct a tentative returned string, then, only if the parsing succeeds, copy it into the string passed by reference. * testsuite/22_locale/money_get_members_char.cc: Add test06. * testsuite/22_locale/money_get_members_wchar_t.cc: Add test06. From-SVN: r49523 --- libstdc++-v3/ChangeLog | 8 ++++ libstdc++-v3/include/bits/locale_facets.tcc | 17 ++++++--- .../22_locale/money_get_members_char.cc | 37 +++++++++++++++++++ .../22_locale/money_get_members_wchar_t.cc | 37 +++++++++++++++++++ 4 files changed, 94 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4d7f104c1ca..835da3319f5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2002-02-05 Paolo Carlini + + * include/bits/locale_facets.tcc (money_get::do_get(string)): + First construct a tentative returned string, then, only if the + parsing succeeds, copy it into the string passed by reference. + * testsuite/22_locale/money_get_members_char.cc: Add test06. + * testsuite/22_locale/money_get_members_wchar_t.cc: Add test06. + 2002-02-04 Phil Edwards * docs/doxygen/TODO: Impl-defined behavior now documented... diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index e4595828461..3a35139cece 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -930,6 +930,9 @@ namespace std // Flag marking when a decimal point is found. bool __testdecfound = false; + // The tentative returned string is stored here. + string_type __temp_units; + char_type __c = *__beg; char_type __eof = static_cast(char_traits::eof()); for (int __i = 0; __beg != __end && __i < 4 && __testvalid; ++__i) @@ -1019,7 +1022,7 @@ namespace std } else { - __units += __c; + __temp_units += __c; ++__sep_pos; } __c = *(++__beg); @@ -1050,11 +1053,11 @@ namespace std } // Strip leading zeros. - while (__units[0] == __ctype.widen('0')) - __units.erase(__units.begin()); + while (__temp_units[0] == __ctype.widen('0')) + __temp_units.erase(__temp_units.begin()); if (__sign.size() && __sign == __neg_sign) - __units.insert(__units.begin(), __ctype.widen('-')); + __temp_units.insert(__temp_units.begin(), __ctype.widen('-')); // Test for grouping fidelity. if (__grouping.size() && __grouping_tmp.size()) @@ -1068,8 +1071,12 @@ namespace std __err |= ios_base::eofbit; // Iff valid sequence is not recognized. - if (!__testvalid || !__units.size()) + if (!__testvalid || !__temp_units.size()) __err |= ios_base::failbit; + else + // Use the "swap trick" to copy __temp_units into __units. + __temp_units.swap(__units); + return __beg; } 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 84fb93d3f10..249e8b20f00 100644 --- a/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc +++ b/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc @@ -383,6 +383,42 @@ void test05() VERIFY( valn_ns == "-123456" ); } +void test06() +{ + using namespace std; + + typedef istreambuf_iterator InIt; + InIt iend1, iend2, iend3; + + locale loc; + string buffer1("123"); + string buffer2("456"); + string buffer3("Golgafrincham"); // From Nathan's original idea. + + string val; + + ios_base::iostate err; + + const money_get& mg = + use_facet >(loc); + + istringstream fmt1(buffer1); + InIt ibeg1(fmt1); + mg.get(ibeg1,iend1,false,fmt1,err,val); + VERIFY( val == buffer1 ); + + istringstream fmt2(buffer2); + InIt ibeg2(fmt2); + mg.get(ibeg2,iend2,false,fmt2,err,val); + VERIFY( val == buffer2 ); + + val = buffer3; + istringstream fmt3(buffer3); + InIt ibeg3(fmt3); + mg.get(ibeg3,iend3,false,fmt3,err,val); + VERIFY( val == buffer3 ); +} + int main() { test01(); @@ -390,5 +426,6 @@ int main() test03(); test04(); test05(); + test06(); 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 fcca3452b34..798f4a8dabb 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 @@ -384,6 +384,42 @@ void test05() mg.get(ibegn_ns,iendn_ns,intl,fmtn_ns,err,valn_ns); VERIFY( valn_ns == L"-123456" ); } + +void test06() +{ + using namespace std; + + typedef istreambuf_iterator InIt; + InIt iend1, iend2, iend3; + + locale loc; + wstring buffer1(L"123"); + wstring buffer2(L"456"); + wstring buffer3(L"Golgafrincham"); + + wstring val; + + ios_base::iostate err; + + const money_get& mg = + use_facet >(loc); + + wistringstream fmt1(buffer1); + InIt ibeg1(fmt1); + mg.get(ibeg1,iend1,false,fmt1,err,val); + VERIFY( val == buffer1 ); + + wistringstream fmt2(buffer2); + InIt ibeg2(fmt2); + mg.get(ibeg2,iend2,false,fmt2,err,val); + VERIFY( val == buffer2 ); + + val = buffer3; + wistringstream fmt3(buffer3); + InIt ibeg3(fmt3); + mg.get(ibeg3,iend3,false,fmt3,err,val); + VERIFY( val == buffer3 ); +} #endif int main() @@ -394,6 +430,7 @@ int main() test03(); test04(); test05(); + test06(); #endif return 0; } -- 2.30.2