[PATCH] money::put: revert last changes and improve treatment of space

Paolo Carlini pcarlini@unitus.it
Tue Feb 19 05:51:00 GMT 2002


Hi,

the below reverts the last changes and improves case money_base::space according
to yesterday's discussion. Tested i686-pc-linux-gnu. Ok?

Ciao, Paolo.

/////////////

2002-02-19  Paolo Carlini  <pcarlini@unitus.it>

        Revert 2002-02-19 fix for libstdc++/5708 and improve
        treatment of money_base::space case.
        * include/bits/locale_facets.tcc (money_put::do_put):
        For the space field unconditionally output the required ' ',
        possibly followed by fill chars (if internal formatting).
        * testsuite/22_locale/money_put_members_char.cc: Remove test05.
        (test01-02-03): Trim some ' ' to '*' and viceversa.
        * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto.

diff -urN libstdc++-v3-orig/include/bits/locale_facets.tcc
libstdc++-v3/include/bits/locale_facets.tcc
--- libstdc++-v3-orig/include/bits/locale_facets.tcc Mon Feb 18 20:57:11 2002
+++ libstdc++-v3/include/bits/locale_facets.tcc Tue Feb 19 14:45:22 2002
@@ -1226,11 +1226,10 @@
   case money_base::space:
     // At least one space is required, but if internal
     // formatting is required, an arbitrary number of
-    // fill spaces will be necessary.
+    // fill chars will be also necessary.
+    __res += __ctype.widen(' ');
     if (__testipad)
-      __res += string_type(__width - __len, __fill);
-    else
-      __res += __ctype.widen(__fill);
+      __res += string_type(__width - __len - 1, __fill);
     break;
   case money_base::none:
     if (__testipad)
diff -urN libstdc++-v3-orig/testsuite/22_locale/money_put_members_char.cc
libstdc++-v3/testsuite/22_locale/money_put_members_char.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_put_members_char.cc Mon Feb 18
21:07:33 2002
+++ libstdc++-v3/testsuite/22_locale/money_put_members_char.cc Tue Feb 19
13:53:15 2002
@@ -79,12 +79,12 @@
   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 @@
   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 @@
   // 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 @@

   // 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,14 +151,14 @@
   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);
   oss.setf(ios_base::internal);
   iterator_type os_it11 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
   string result11 = oss.str();
-  VERIFY( result11 == "-,01****************");
+  VERIFY( result11 == "-,01 ***************");
 }

 // test double version
@@ -210,12 +210,12 @@
   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 @@
   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,50 +303,11 @@
 #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 -urN libstdc++-v3-orig/testsuite/22_locale/money_put_members_wchar_t.cc
libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc
--- libstdc++-v3-orig/testsuite/22_locale/money_put_members_wchar_t.cc Mon Feb
18 21:21:11 2002
+++ libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc Tue Feb 19
13:55:01 2002
@@ -79,12 +79,12 @@
   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 @@
   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 @@
   // 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 @@

   // 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,14 +151,14 @@
   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);
   oss.setf(ios_base::internal);
   iterator_type os_it11 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4);
   wstring result11 = oss.str();
-  VERIFY( result11 == L"-,01****************");
+  VERIFY( result11 == L"-,01 ***************");
 }

 // test double/wstring versions
@@ -210,12 +210,12 @@
   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 @@
   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,44 +302,6 @@
     }
 #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()
@@ -349,7 +311,6 @@
   test02();
   test03();
   test04();
-  test05();
 #endif
   return 0;
 }




More information about the Libstdc++ mailing list