aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2002-02-18 22:23:26 +0100
committerPaolo Carlini <paolo@gcc.gnu.org>2002-02-18 21:23:26 +0000
commit577f406186438493eac86d0dd14e92b9f92c47bb (patch)
tree901dc9346d9b33b1d6a07bf0b2083694e73821be
parent3fcfe88d1957982a29bc9285b69fc6e1ac96ac31 (diff)
downloadgcc-577f406186438493eac86d0dd14e92b9f92c47bb.zip
gcc-577f406186438493eac86d0dd14e92b9f92c47bb.tar.gz
gcc-577f406186438493eac86d0dd14e92b9f92c47bb.tar.bz2
locale_facets.tcc (money_put::do_put): For the space field use __fill instead of ' ', uniformly.
2002-02-18 Paolo Carlini <pcarlini@unitus.it> libstdc++/5708 * include/bits/locale_facets.tcc (money_put::do_put): For the space field use __fill instead of ' ', uniformly. * testsuite/22_locale/money_put_members_char.cc: Add test05 distilled from PR. (test01-02-03): Trim some '*' to ' '. * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto. From-SVN: r49847
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc2
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_put_members_char.cc67
-rw-r--r--libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc67
4 files changed, 117 insertions, 29 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 18d68ff..060a48e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,13 @@
+2002-02-18 Paolo Carlini <pcarlini@unitus.it>
+
+ libstdc++/5708
+ * include/bits/locale_facets.tcc (money_put::do_put):
+ For the space field use __fill instead of ' ', uniformly.
+ * testsuite/22_locale/money_put_members_char.cc:
+ Add test05 distilled from PR.
+ (test01-02-03): Trim some '*' to ' '.
+ * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto.
+
2002-02-18 Loren Rittle <ljrittle@acm.org>
libstdc++/5697
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index 9d275c1..02ae96e 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -1230,7 +1230,7 @@ namespace std
if (__testipad)
__res += string_type(__width - __len, __fill);
else
- __res += __ctype.widen(' ');
+ __res += __ctype.widen(__fill);
break;
case money_base::none:
if (__testipad)
diff --git a/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc b/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc
index eefd1c2..72915db 100644
--- a/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc
+++ b/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc
@@ -79,12 +79,12 @@ void test01()
const money_put<char>& mon_put = use_facet<money_put<char> >(oss.getloc());
- iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
string result1 = oss.str();
VERIFY( result1 == "7.200.000.000,00 ");
oss.str(empty);
- iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
string result2 = oss.str();
VERIFY( result2 == "7.200.000.000,00 ");
@@ -95,12 +95,12 @@ void test01()
oss.setf(ios_base::showbase);
oss.str(empty);
- iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
string result3 = oss.str();
VERIFY( result3 == "7.200.000.000,00 DEM ");
oss.str(empty);
- iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
string result4 = oss.str();
VERIFY( result4 == "7.200.000.000,00 DM");
@@ -112,26 +112,26 @@ void test01()
// test sign of more than one digit, say hong kong.
oss.imbue(loc_hk);
oss.str(empty);
- iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
string result5 = oss.str();
VERIFY( result5 == "HK$7,200,000,000.00");
oss.str(empty);
- iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, '*', digits2);
+ iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits2);
string result6 = oss.str();
VERIFY( result6 == "(HKD 100,000,000,000.00)");
// test one-digit formats without zero padding
oss.imbue(loc_c);
oss.str(empty);
- iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
+ iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4);
string result7 = oss.str();
VERIFY( result7 == "1");
// test one-digit formats with zero padding, zero frac widths
oss.imbue(loc_hk);
oss.str(empty);
- iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
+ iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4);
string result8 = oss.str();
VERIFY( result8 == "(HKD .01)");
@@ -139,7 +139,7 @@ void test01()
// test bunk input
oss.str(empty);
- iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, '*', digits3);
+ iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits3);
string result9 = oss.str();
VERIFY( result9 == "");
@@ -151,7 +151,7 @@ void test01()
oss.width(20);
iterator_type os_it10 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
string result10 = oss.str();
- VERIFY( result10 == "***************-,01 ");
+ VERIFY( result10 == "***************-,01*");
oss.str(empty);
oss.width(20);
@@ -210,12 +210,12 @@ void test02()
const money_put<char>& mon_put = use_facet<money_put<char> >(oss.getloc());
- iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
string result1 = oss.str();
VERIFY( result1 == "7.200.000.000,00 ");
oss.str(empty);
- iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
string result2 = oss.str();
VERIFY( result2 == "7.200.000.000,00 ");
@@ -226,12 +226,12 @@ void test02()
oss.setf(ios_base::showbase);
oss.str(empty);
- iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
string result3 = oss.str();
VERIFY( result3 == "7.200.000.000,00 DEM ");
oss.str(empty);
- iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
string result4 = oss.str();
VERIFY( result4 == "7.200.000.000,00 DM");
@@ -303,11 +303,50 @@ void test04()
#endif
}
+struct My_money_io : public std::moneypunct<char,false>
+{
+ char_type do_decimal_point() const { return '.'; }
+ char_type do_thousands_sep() const { return ','; }
+ std::string do_grouping() const { return "\003"; }
+
+ std::string do_negative_sign() const { return "()"; }
+
+ int do_frac_digits() const { return 2; }
+
+ pattern do_neg_format() const
+ {
+ static pattern pat = { { symbol, space, sign, value } };
+ return pat;
+ }
+};
+
+// libstdc++/5708
+void test05()
+{
+ using namespace std;
+ typedef ostreambuf_iterator<char> OutIt;
+
+ locale loc(locale::classic(), new My_money_io);
+
+ bool intl = false;
+
+ string val("-123456");
+ const money_put<char,OutIt>& mp =
+ use_facet<money_put<char, OutIt> >(loc);
+
+ ostringstream fmt;
+ fmt.imbue(loc);
+ OutIt out(fmt);
+ mp.put(out,intl,fmt,'*',val);
+ VERIFY( fmt.str() == "*(1,234.56)" );
+}
+
int main()
{
test01();
test02();
test03();
test04();
+ test05();
return 0;
}
diff --git a/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc
index 0103bc4..0688a65 100644
--- a/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc
+++ b/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc
@@ -79,12 +79,12 @@ void test01()
const money_put<wchar_t>& mon_put = use_facet<money_put<wchar_t> >(oss.getloc());
- iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
wstring result1 = oss.str();
VERIFY( result1 == L"7.200.000.000,00 ");
oss.str(empty);
- iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
wstring result2 = oss.str();
VERIFY( result2 == L"7.200.000.000,00 ");
@@ -95,12 +95,12 @@ void test01()
oss.setf(ios_base::showbase);
oss.str(empty);
- iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
wstring result3 = oss.str();
VERIFY( result3 == L"7.200.000.000,00 DEM ");
oss.str(empty);
- iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
wstring result4 = oss.str();
VERIFY( result4 == L"7.200.000.000,00 DM");
@@ -112,26 +112,26 @@ void test01()
// test sign of more than one digit, say hong kong.
oss.imbue(loc_hk);
oss.str(empty);
- iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
wstring result5 = oss.str();
VERIFY( result5 == L"HK$7,200,000,000.00");
oss.str(empty);
- iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, '*', digits2);
+ iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits2);
wstring result6 = oss.str();
VERIFY( result6 == L"(HKD 100,000,000,000.00)");
// test one-digit formats without zero padding
oss.imbue(loc_c);
oss.str(empty);
- iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
+ iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4);
wstring result7 = oss.str();
VERIFY( result7 == L"1");
// test one-digit formats with zero padding, zero frac widths
oss.imbue(loc_hk);
oss.str(empty);
- iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
+ iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4);
wstring result8 = oss.str();
VERIFY( result8 == L"(HKD .01)");
@@ -139,7 +139,7 @@ void test01()
// test bunk input
oss.str(empty);
- iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, '*', digits3);
+ iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits3);
wstring result9 = oss.str();
VERIFY( result9 == L"");
@@ -151,7 +151,7 @@ void test01()
oss.width(20);
iterator_type os_it10 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
wstring result10 = oss.str();
- VERIFY( result10 == L"***************-,01 ");
+ VERIFY( result10 == L"***************-,01*");
oss.str(empty);
oss.width(20);
@@ -210,12 +210,12 @@ void test02()
const money_put<wchar_t>& mon_put = use_facet<money_put<wchar_t> >(oss.getloc());
- iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
wstring result1 = oss.str();
VERIFY( result1 == L"7.200.000.000,00 ");
oss.str(empty);
- iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
wstring result2 = oss.str();
VERIFY( result2 == L"7.200.000.000,00 ");
@@ -226,12 +226,12 @@ void test02()
oss.setf(ios_base::showbase);
oss.str(empty);
- iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1);
+ iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
wstring result3 = oss.str();
VERIFY( result3 == L"7.200.000.000,00 DEM ");
oss.str(empty);
- iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1);
+ iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1);
wstring result4 = oss.str();
VERIFY( result4 == L"7.200.000.000,00 DM");
@@ -302,6 +302,44 @@ void test04()
}
#endif
}
+
+struct My_money_io : public std::moneypunct<wchar_t,false>
+{
+ char_type do_decimal_point() const { return L'.'; }
+ char_type do_thousands_sep() const { return L','; }
+ std::string do_grouping() const { return "\003"; }
+
+ std::wstring do_negative_sign() const { return L"()"; }
+
+ int do_frac_digits() const { return 2; }
+
+ pattern do_neg_format() const
+ {
+ static pattern pat = { { symbol, space, sign, value } };
+ return pat;
+ }
+};
+
+// libstdc++/5708
+void test05()
+{
+ using namespace std;
+ typedef ostreambuf_iterator<wchar_t> OutIt;
+
+ locale loc(locale::classic(), new My_money_io);
+
+ bool intl = false;
+
+ wstring val(L"-123456");
+ const money_put<wchar_t,OutIt>& mp =
+ use_facet<money_put<wchar_t, OutIt> >(loc);
+
+ wostringstream fmt;
+ fmt.imbue(loc);
+ OutIt out(fmt);
+ mp.put(out,intl,fmt,L'*',val);
+ VERIFY( fmt.str() == L"*(1,234.56)" );
+}
#endif
int main()
@@ -311,6 +349,7 @@ int main()
test02();
test03();
test04();
+ test05();
#endif
return 0;
}