aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2002-02-05 12:35:48 +0100
committerPaolo Carlini <paolo@gcc.gnu.org>2002-02-05 11:35:48 +0000
commite07554eb1747af7a6fd6479ee38db3a04aa08e2d (patch)
treedc15baef8496d5588c6b2c353f1b467628ccaa0f
parent4505024e9e20966e5cf59625bdf15467701d7732 (diff)
downloadgcc-e07554eb1747af7a6fd6479ee38db3a04aa08e2d.zip
gcc-e07554eb1747af7a6fd6479ee38db3a04aa08e2d.tar.gz
gcc-e07554eb1747af7a6fd6479ee38db3a04aa08e2d.tar.bz2
locale_facets.tcc (money_get::do_get(string)): First construct a tentative returned string...
2002-02-05 Paolo Carlini <pcarlini@unitus.it> * 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
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc17
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get_members_char.cc37
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get_members_wchar_t.cc37
4 files changed, 94 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 4d7f104..835da33 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2002-02-05 Paolo Carlini <pcarlini@unitus.it>
+
+ * 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 <pme@gcc.gnu.org>
* 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 e459582..3a35139 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_type>(char_traits<char_type>::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 84fb93d..249e8b2 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<char> 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<char,InIt>& mg =
+ use_facet<money_get<char, InIt> >(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 fcca345..798f4a8 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<wchar_t> 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<wchar_t,InIt>& mg =
+ use_facet<money_get<wchar_t, InIt> >(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;
}