aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@redhat.com>2002-01-11 20:12:02 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2002-01-11 20:12:02 +0000
commit87a9c33cb1d5df7ab606e290ea8b37d22fae4569 (patch)
tree2ac161a393d4c52a344527ecfdb70dec328c1baa
parent96ae8197d279fbb1d801ae88ff36ca963b5e741a (diff)
downloadgcc-87a9c33cb1d5df7ab606e290ea8b37d22fae4569.zip
gcc-87a9c33cb1d5df7ab606e290ea8b37d22fae4569.tar.gz
gcc-87a9c33cb1d5df7ab606e290ea8b37d22fae4569.tar.bz2
locale_facets.tcc (money_get::do_get(string)): Check for zero-length negative sign before adding it to output string.
2002-01-11 Benjamin Kosnik <bkoz@redhat.com> * include/bits/locale_facets.tcc (money_get::do_get(string)): Check for zero-length negative sign before adding it to output string. (money_get::do_get(long double)): Return beg. * testsuite/22_locale/money_get_members_char.cc (test02): Add iterator checks. * testsuite/22_locale/money_get_members_wchar_t.cc: Same. From-SVN: r48777
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc4
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get_members_char.cc45
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_get_members_wchar_t.cc44
4 files changed, 98 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 3df8b7c..56936ce 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,13 @@
+2002-01-11 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/locale_facets.tcc (money_get::do_get(string)):
+ Check for zero-length negative sign before adding it to output
+ string.
+ (money_get::do_get(long double)): Return beg.
+ * testsuite/22_locale/money_get_members_char.cc (test02): Add
+ iterator checks.
+ * testsuite/22_locale/money_get_members_wchar_t.cc: Same.
+
2002-01-10 David Seymour <seymour_dj@yahoo.com>
libstdc++/5331
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index 6e0e8b9..35873e1 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -1035,7 +1035,7 @@ namespace std
ios_base::iostate& __err, long double& __units) const
{
string_type __str;
- this->do_get(__beg, __end, __intl, __io, __err, __str);
+ __beg = this->do_get(__beg, __end, __intl, __io, __err, __str);
const int __n = numeric_limits<long double>::digits10;
char* __cs = static_cast<char*>(__builtin_alloca(sizeof(char) * __n));
@@ -1222,7 +1222,7 @@ namespace std
while (__units[0] == __ctype.widen('0'))
__units.erase(__units.begin());
- if (__sign == __neg_sign)
+ if (__sign.size() && __sign == __neg_sign)
__units.insert(__units.begin(), __ctype.widen('-'));
// Test for grouping fidelity.
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 86d59e8..5b0892d 100644
--- a/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc
+++ b/libstdc++-v3/testsuite/22_locale/money_get_members_char.cc
@@ -1,6 +1,6 @@
// 2001-09-12 Benjamin Kosnik <bkoz@redhat.com>
-// Copyright (C) 2001 Free Software Foundation
+// Copyright (C) 2001-2002 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -172,7 +172,7 @@ void test01()
VERIFY( err11 == ios_base::goodbit );
}
-// test double/string versions
+// test double version
void test02()
{
using namespace std;
@@ -249,9 +249,50 @@ void test02()
VERIFY( err03 == ios_base::goodbit );
}
+void test03()
+{
+ using namespace std;
+ bool test = true;
+
+ // Check money_get works with other iterators besides streambuf
+ // output iterators.
+ typedef string::const_iterator iter_type;
+ typedef money_get<char, iter_type> mon_get_type;
+ const ios_base::iostate goodbit = ios_base::goodbit;
+ const ios_base::iostate eofbit = ios_base::eofbit;
+ ios_base::iostate err = goodbit;
+ const locale loc_c = locale::classic();
+ const string str = "0.01Eleanor Roosevelt";
+
+ istringstream iss;
+ iss.imbue(locale(loc_c, new mon_get_type));
+
+ // Iterator advanced, state, output.
+ const mon_get_type& mg = use_facet<mon_get_type>(iss.getloc());
+
+ // 01 string
+ string res1;
+ iter_type end1 = mg.get(str.begin(), str.end(), false, iss, err, res1);
+ string rem1(end1, str.end());
+ VERIFY( err == goodbit );
+ VERIFY( res1 == "1" );
+ VERIFY( rem1 == "Eleanor Roosevelt" );
+
+ // 02 long double
+ iss.clear();
+ err = goodbit;
+ long double res2;
+ iter_type end2 = mg.get(str.begin(), str.end(), false, iss, err, res2);
+ string rem2(end2, str.end());
+ VERIFY( err == goodbit );
+ VERIFY( res2 == 1 );
+ VERIFY( rem2 == "Eleanor Roosevelt" );
+}
+
int main()
{
test01();
test02();
+ test03();
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 9426c97..2e0399b 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
@@ -1,6 +1,6 @@
// 2001-09-14 Benjamin Kosnik <bkoz@redhat.com>
-// Copyright (C) 2001 Free Software Foundation
+// Copyright (C) 2001-2002 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -250,13 +250,55 @@ void test02()
VERIFY( result3 == digits4 );
VERIFY( err03 == ios_base::goodbit );
}
+
+void test03()
+{
+ using namespace std;
+ bool test = true;
+
+ // Check money_get works with other iterators besides streambuf
+ // output iterators.
+ typedef wstring::const_iterator iter_type;
+ typedef money_get<wchar_t, iter_type> mon_get_type;
+ const ios_base::iostate goodbit = ios_base::goodbit;
+ const ios_base::iostate eofbit = ios_base::eofbit;
+ ios_base::iostate err = goodbit;
+ const locale loc_c = locale::classic();
+ const wstring str = L"0.01Eleanor Roosevelt";
+
+ wistringstream iss;
+ iss.imbue(locale(loc_c, new mon_get_type));
+
+ // Iterator advanced, state, output.
+ const mon_get_type& mg = use_facet<mon_get_type>(iss.getloc());
+
+ // 01 string
+ wstring res1;
+ iter_type end1 = mg.get(str.begin(), str.end(), false, iss, err, res1);
+ wstring rem1(end1, str.end());
+ VERIFY( err == goodbit );
+ VERIFY( res1 == L"1" );
+ VERIFY( rem1 == L"Eleanor Roosevelt" );
+
+ // 02 long double
+ iss.clear();
+ err = goodbit;
+ long double res2;
+ iter_type end2 = mg.get(str.begin(), str.end(), false, iss, err, res2);
+ wstring rem2(end2, str.end());
+ VERIFY( err == goodbit );
+ VERIFY( res2 == 1 );
+ VERIFY( rem2 == L"Eleanor Roosevelt" );
+}
#endif
+
int main()
{
#ifdef _GLIBCPP_USE_WCHAR_T
test01();
test02();
+ test03();
#endif
return 0;
}