aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2001-11-29 23:31:02 +0100
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2001-11-29 22:31:02 +0000
commitb3340046164ef39d1a2d30e49314511f96aa8d23 (patch)
treed653f823940d95a23ac173c99c7ff7904c7e786e
parent7d5b8b116ee53bd38bd23bb6cf5577b3fec72000 (diff)
downloadgcc-b3340046164ef39d1a2d30e49314511f96aa8d23.zip
gcc-b3340046164ef39d1a2d30e49314511f96aa8d23.tar.gz
gcc-b3340046164ef39d1a2d30e49314511f96aa8d23.tar.bz2
locale_facets.tcc (__pad): Add bool parameter to correctly pad internal-adjusted const char*-type objects.
2001-11-29 Paolo Carlini <pcarlini@unitus.it> libstdc++/3655 * include/bits/locale_facets.tcc (__pad): Add bool parameter to correctly pad internal-adjusted const char*-type objects. * include/bits/locale_facts.tcc (num_put::_M_insert): Update call. * include/bits/ostream.tcc (operator<<(_CharT , char, const _CharT*, const char*, const basic_string&): Update calls. * src/locale-inst.tcc: Update declarations. * testsuite/27_io/ostream_inserter_arith.cc (test04): Add test. From-SVN: r47459
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc19
-rw-r--r--libstdc++-v3/include/bits/ostream.tcc12
-rw-r--r--libstdc++-v3/src/locale-inst.cc12
-rw-r--r--libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc12
5 files changed, 42 insertions, 25 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 58e899f..410041d 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,14 @@
+2001-11-29 Paolo Carlini <pcarlini@unitus.it>
+
+ libstdc++/3655
+ * include/bits/locale_facets.tcc (__pad): Add bool parameter to
+ correctly pad internal-adjusted const char*-type objects.
+ * include/bits/locale_facts.tcc (num_put::_M_insert): Update call.
+ * include/bits/ostream.tcc (operator<<(_CharT , char, const
+ _CharT*, const char*, const basic_string&): Update calls.
+ * src/locale-inst.tcc: Update declarations.
+ * testsuite/27_io/ostream_inserter_arith.cc (test04): Add test.
+
2001-11-29 Phil Edwards <pme@gcc.gnu.org>
* docs/html/ext/howto.html: Finish allocator notes (inst and 3.0).
@@ -9,7 +20,6 @@
2001-11-28 Paolo Carlini <pcarlini@unitus.it>
- libstdc++/3655
* include/bits/locale_facets.tcc (__pad): Correctly pad
internal-adjusted hex numbers.
* testsuite/27_io/ostream_inserter_arith.cc: Add testcase.
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index 894fa49..835a0ae 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -814,7 +814,7 @@ namespace std
streamsize __w = __io.width();
if (__w > static_cast<streamsize>(__len))
{
- __pad(__io, __fill, __ws2, __ws, __w, __len);
+ __pad(__io, __fill, __ws2, __ws, __w, __len, true);
__len = static_cast<int>(__w);
// Switch strings.
__ws = __ws2;
@@ -1913,11 +1913,15 @@ namespace std
// Assumes
// __newlen > __oldlen
// __news is allocated for __newlen size
- // Used by both num_put and ostream inserters.
+ // Used by both num_put and ostream inserters: if __num,
+ // internal-adjusted objects are padded according to the rules below
+ // concerning 0[xX] and +-, otherwise, exactly as right-adjusted
+ // ones are.
template<typename _CharT, typename _Traits>
void
__pad(ios_base& __io, _CharT __fill, _CharT* __news, const _CharT* __olds,
- const streamsize __newlen, const streamsize __oldlen)
+ const streamsize __newlen, const streamsize __oldlen,
+ const bool __num)
{
typedef _CharT char_type;
typedef _Traits traits_type;
@@ -1940,7 +1944,7 @@ namespace std
__beglen = __oldlen;
__end = __pads;
}
- else if (__adjust == ios_base::internal)
+ else if (__adjust == ios_base::internal && __num)
{
// Pad after the sign, if there is one.
// Pad after 0[xX], if there is one.
@@ -1997,10 +2001,11 @@ namespace std
template<typename _CharT>
void
__pad(ios_base& __io, _CharT __fill, _CharT* __news, const _CharT* __olds,
- const streamsize __newlen, const streamsize __oldlen)
+ const streamsize __newlen, const streamsize __oldlen,
+ const bool __num)
{
- return __pad<_CharT, char_traits<_CharT> >(__io, __fill, __news,
- __olds, __newlen, __oldlen);
+ return __pad<_CharT, char_traits<_CharT> >(__io, __fill, __news, __olds,
+ __newlen, __oldlen, __num);
}
// Used by both numeric and monetary facets.
diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc
index 8ecd019..ff3c958 100644
--- a/libstdc++-v3/include/bits/ostream.tcc
+++ b/libstdc++-v3/include/bits/ostream.tcc
@@ -481,7 +481,7 @@ namespace std
streamsize __len = 1;
if (__w > __len)
{
- __pad(__out, __out.fill(), __pads, &__c, __w, __len);
+ __pad(__out, __out.fill(), __pads, &__c, __w, __len, false);
__len = __w;
}
__out.write(__pads, __len);
@@ -516,7 +516,7 @@ namespace std
streamsize __len = 1;
if (__w > __len)
{
- __pad(__out, __out.fill(), __pads, &__c, __w, __len);
+ __pad(__out, __out.fill(), __pads, &__c, __w, __len, false);
__len = __w;
}
__out.write(__pads, __len);
@@ -549,7 +549,7 @@ namespace std
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
if (__w > __len)
{
- __pad(__out, __out.fill(), __pads, __s, __w, __len);
+ __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
__s = __pads;
__len = __w;
}
@@ -595,7 +595,7 @@ namespace std
if (__w > __len)
{
- __pad(__out, __out.fill(), __pads, __ws, __w, __len);
+ __pad(__out, __out.fill(), __pads, __ws, __w, __len, false);
__str = __pads;
__len = __w;
}
@@ -630,7 +630,7 @@ namespace std
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
if (__w > __len)
{
- __pad(__out, __out.fill(), __pads, __s, __w, __len);
+ __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
__s = __pads;
__len = __w;
}
@@ -668,7 +668,7 @@ namespace std
#endif
if (__w > __len)
{
- __pad(__out, __out.fill(), __pads, __s, __w, __len);
+ __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
__s = __pads;
__len = __w;
}
diff --git a/libstdc++-v3/src/locale-inst.cc b/libstdc++-v3/src/locale-inst.cc
index 5107a29..0688db9 100644
--- a/libstdc++-v3/src/locale-inst.cc
+++ b/libstdc++-v3/src/locale-inst.cc
@@ -337,12 +337,12 @@ namespace std
template
void
__pad<char>(ios_base&, char, char*, const char *, streamsize,
- streamsize);
+ streamsize, const bool);
template
void
- __pad<char, char_traits<char> >(ios_base&, char, char*,
- const char *, streamsize, streamsize);
+ __pad<char, char_traits<char> >(ios_base&, char, char*, const char *,
+ streamsize, streamsize, const bool);
#ifdef _GLIBCPP_USE_WCHAR_T
template
@@ -363,13 +363,13 @@ namespace std
template
void
__pad<wchar_t>(ios_base&, wchar_t, wchar_t*, const wchar_t*,
- streamsize, streamsize);
+ streamsize, streamsize, const bool);
template
void
__pad<wchar_t, char_traits<wchar_t> >(ios_base&, wchar_t, wchar_t*,
- const wchar_t*,
- streamsize, streamsize);
+ const wchar_t*, streamsize,
+ streamsize, const bool);
#endif // _GLIBCPP_USE_WCHAR_T
template
diff --git a/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc b/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc
index 25a0c12..2e57922 100644
--- a/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc
+++ b/libstdc++-v3/testsuite/27_io/ostream_inserter_arith.cc
@@ -312,12 +312,14 @@ test03()
int
test04()
{
- stringbuf strbuf;
- ostream o(&strbuf);
-
- o << hex << showbase << setw(6) << internal << 255;
- VERIFY( strbuf.str() == "0x ff" );
+ stringbuf strbuf1, strbuf2;
+ ostream o1(&strbuf1), o2(&strbuf2);
+ o1 << hex << showbase << setw(6) << internal << 0xff;
+ VERIFY( strbuf1.str() == "0x ff" );
+ // ... vs internal-adjusted const char*-type objects
+ o2 << hex << showbase << setw(6) << internal << "0xff";
+ VERIFY( strbuf2.str() == " 0xff" );
return 0;
}