locale_facets.tcc (num_put::_M_widen_int): Deal correctly with grouped, showbased...
authorPaolo Carlini <pcarlini@unitus.it>
Fri, 27 Sep 2002 23:08:22 +0000 (01:08 +0200)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 27 Sep 2002 23:08:22 +0000 (23:08 +0000)
2002-09-27  Paolo Carlini  <pcarlini@unitus.it>

* include/bits/locale_facets.tcc (num_put::_M_widen_int):
Deal correctly with grouped, showbased (oct or hex) zero.
* testsuite/22_locale/num_put_members_char.cc: Add test05.
* testsuite/22_locale/num_put_members_wchar_t.cc: Ditto.

From-SVN: r57598

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_facets.tcc
libstdc++-v3/testsuite/22_locale/num_put_members_char.cc
libstdc++-v3/testsuite/22_locale/num_put_members_wchar_t.cc

index aa1c2a5ada9be663ae1b95506dd9fead850b638e..5309c0a6b329ee9c380240b976da259d0f6b40e7 100644 (file)
@@ -1,3 +1,10 @@
+2002-09-27  Paolo Carlini  <pcarlini@unitus.it>
+
+       * include/bits/locale_facets.tcc (num_put::_M_widen_int):
+       Deal correctly with grouped, showbased (oct or hex) zero.
+       * testsuite/22_locale/num_put_members_char.cc: Add test05.
+       * testsuite/22_locale/num_put_members_wchar_t.cc: Ditto.
+
 2002-09-27  Richard Henderson  <rth@redhat.com>
 
        * config/os/hpux/cpu_limits.h: Remove.
index 195d33ab040737347d167550d4cd25f19f66544b..f21054e29663ffced849197e36d61c1952b375c1 100644 (file)
@@ -798,8 +798,10 @@ namespace std
          // By itself __add_grouping cannot deal correctly with __ws when
          // ios::showbase is set and ios_base::oct || ios_base::hex.
          // Therefore we take care "by hand" of the initial 0, 0x or 0X.
+         // However, remember that the latter do not occur if the number
+         // printed is '0' (__len == 1).
          streamsize __off = 0;
-         if (__io.flags() & ios_base::showbase)
+         if ((__io.flags() & ios_base::showbase) && __len > 1)
            if (__basefield == ios_base::oct)
              {
                __off = 1;
index fcc1f79b31d2b0551b982c03a2d9b32bc85dc3b1..e93900bfdb1164676bf5245fb5f42a6f2521289c 100644 (file)
@@ -326,12 +326,50 @@ void test04()
     }
 }
 
+// Make sure that, in a locale that expects grouping, when showbase
+// is true, an hexadecimal or octal zero is correctly output (the case 
+// of zero is special since there is no 0x, 0 respectively, prefix)
+void test05()
+{
+  using namespace std;
+  bool test = true;
+
+  // A locale that expects grouping.
+  locale loc_de("de_DE");
+
+  const string empty;
+  string result;
+
+  ostringstream oss;
+  oss.imbue(loc_de);
+  const num_put<char>& np = use_facet<num_put<char> >(oss.getloc()); 
+
+  long l = 0;
+
+  oss.str(empty);
+  oss.clear();
+  oss.setf(ios::showbase);
+  oss.setf(ios::hex, ios::basefield);
+  np.put(oss.rdbuf(), oss, '+', l);
+  result = oss.str();
+  VERIFY( result == "0" );
+
+  oss.str(empty);
+  oss.clear();
+  oss.setf(ios::showbase);
+  oss.setf(ios::oct, ios::basefield);
+  np.put(oss.rdbuf(), oss, '+', l);
+  result = oss.str();
+  VERIFY( result == "0" );
+}
+
 int main()
 {
   test01();
   test02();
   test03();
   test04();
+  test05();
   return 0;
 }
 
index 4fbf25f2121ded3196ebfc5607498d923e063b1f..53fdd591b5b7923334dfa18ba8c6515687f2ce5f 100644 (file)
@@ -325,6 +325,43 @@ void test04()
       VERIFY( preLANG == postLANG );
     }
 }
+
+// Make sure that, in a locale that expects grouping, when showbase
+// is true, an hexadecimal or octal zero is correctly output (the case 
+// of zero is special since there is no 0x, 0 respectively, prefix)
+void test05()
+{
+  using namespace std;
+  bool test = true;
+
+  // A locale that expects grouping.
+  locale loc_de("de_DE");
+
+  const wstring empty;
+  wstring result;
+
+  wostringstream oss;
+  oss.imbue(loc_de);
+  const num_put<wchar_t>& np = use_facet<num_put<wchar_t> >(oss.getloc()); 
+
+  long l = 0;
+
+  oss.str(empty);
+  oss.clear();
+  oss.setf(ios::showbase);
+  oss.setf(ios::hex, ios::basefield);
+  np.put(oss.rdbuf(), oss, L'+', l);
+  result = oss.str();
+  VERIFY( result == L"0" );
+
+  oss.str(empty);
+  oss.clear();
+  oss.setf(ios::showbase);
+  oss.setf(ios::oct, ios::basefield);
+  np.put(oss.rdbuf(), oss, L'+', l);
+  result = oss.str();
+  VERIFY( result == L"0" );
+}
 #endif
 
 int main()
@@ -334,6 +371,7 @@ int main()
   test02();
   test03();
   test04();
+  test05();
 #endif
   return 0;
 }