From 6cf5465d43d70fb73bde88435327f64be51bfb55 Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Fri, 26 Oct 2001 05:32:06 +0000 Subject: [PATCH] [multiple changes] 2001-10-25 Benjamin Kosnik libstdc++/4545 * include/bits/ostream.tcc (ostream::operator<<(streambuf*)): Fix exceptions. * include/bits/istream.tcc (istream::operator>>(streambuf*): Make consistent, where possible. * include/bits/streambuf.tcc: Tweak. 2001-10-25 Brendan Kehoe libstdc++/4536 * bits/ostream.tcc (seekp): Scope use as ios_base::failbit. * bits/istream.tcc (seekg): Likewise. From-SVN: r46528 --- libstdc++-v3/ChangeLog | 15 ++++++++ libstdc++-v3/include/bits/istream.tcc | 36 ++++++++++++----- libstdc++-v3/include/bits/ostream.tcc | 51 ++++++++++++++++--------- libstdc++-v3/include/bits/streambuf.tcc | 44 +++++++++++---------- 4 files changed, 98 insertions(+), 48 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 65f391e65d2..1ce42b72e35 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,18 @@ +2001-10-25 Benjamin Kosnik + + libstdc++/4545 + * include/bits/ostream.tcc (ostream::operator<<(streambuf*)): Fix + exceptions. + * include/bits/istream.tcc (istream::operator>>(streambuf*): Make + consistent, where possible. + * include/bits/streambuf.tcc: Tweak. + +2001-10-25 Brendan Kehoe + + libstdc++/4536 + * bits/ostream.tcc (seekp): Scope use as ios_base::failbit. + * bits/istream.tcc (seekg): Likewise. + 2001-10-25 Benjamin Kosnik Peter Schmid Ulrich Weigand diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index e0014ea7e1c..47b01f6bae2 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -454,14 +454,30 @@ namespace std basic_istream<_CharT, _Traits>:: operator>>(__streambuf_type* __sbout) { - streamsize __xtrct = 0; - __streambuf_type* __sbin = this->rdbuf(); - sentry __cerb(*this, false); - if (__sbout && __cerb) - __xtrct = __copy_streambufs(*this, __sbin, __sbout); - if (!__sbout || !__xtrct) - this->setstate(ios_base::failbit); - return *this; + sentry __cerb(*this, false); + if (__cerb) + { + try + { + streamsize __xtrct = 0; + if (__sbout) + { + __streambuf_type* __sbin = this->rdbuf(); + __xtrct = __copy_streambufs(*this, __sbin, __sbout); + } + if (!__sbout || !__xtrct) + this->setstate(ios_base::failbit); + } + catch(exception& __fail) + { + // 27.6.2.5.1 Common requirements. + // Turn this on without causing an ios::failure to be thrown. + this->setstate(ios_base::badbit); + if ((this->exceptions() & ios_base::badbit) != 0) + __throw_exception_again; + } + } + return *this; } template @@ -963,7 +979,7 @@ namespace std // 129. Need error indication from seekp() and seekg() if (__err == pos_type(off_type(-1))) - this->setstate(failbit); + this->setstate(ios_base::failbit); #endif } catch(exception& __fail) @@ -996,7 +1012,7 @@ namespace std // 129. Need error indication from seekp() and seekg() if (__err == pos_type(off_type(-1))) - this->setstate(failbit); + this->setstate(ios_base::failbit); #endif } catch(exception& __fail) diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index 33182261e2c..ff9283dc70b 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -109,6 +109,38 @@ namespace std return *this; } + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>::operator<<(__streambuf_type* __sbin) + { + sentry __cerb(*this); + if (__cerb) + { + try + { + streamsize __xtrct = 0; + if (__sbin) + { + __streambuf_type* __sbout = this->rdbuf(); + __xtrct = __copy_streambufs(*this, __sbin, __sbout); + } + else + this->setstate(ios_base::badbit); + if (!__xtrct) + this->setstate(ios_base::failbit); + } + catch(exception& __fail) + { + // 27.6.2.5.1 Common requirements. + // Turn this on without causing an ios::failure to be thrown. + this->setstate(ios_base::badbit); + if ((this->exceptions() & ios_base::badbit) != 0) + __throw_exception_again; + } + } + return *this; + } + template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __n) @@ -336,20 +368,6 @@ namespace std return *this; } - template - basic_ostream<_CharT, _Traits>& - basic_ostream<_CharT, _Traits>::operator<<(__streambuf_type* __sbin) - { - streamsize __xtrct = 0; - __streambuf_type* __sbout = this->rdbuf(); - sentry __cerb(*this); - if (__sbin && __cerb) - __xtrct = __copy_streambufs(*this, __sbin, __sbout); - if (!__sbin || !__xtrct) - this->setstate(ios_base::failbit); - return *this; - } - template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::put(char_type __c) @@ -418,7 +436,7 @@ namespace std // 129. Need error indication from seekp() and seekg() if (__err == pos_type(off_type(-1))) - this->setstate(failbit); + this->setstate(ios_base::failbit); #endif } return *this; @@ -440,7 +458,7 @@ namespace std // 129. Need error indication from seekp() and seekg() if (__err == pos_type(off_type(-1))) - this->setstate(failbit); + this->setstate(ios_base::failbit); } #endif return *this; @@ -753,4 +771,3 @@ namespace std // Local Variables: // mode:C++ // End: - diff --git a/libstdc++-v3/include/bits/streambuf.tcc b/libstdc++-v3/include/bits/streambuf.tcc index d928379918a..9482c69c7ad 100644 --- a/libstdc++-v3/include/bits/streambuf.tcc +++ b/libstdc++-v3/include/bits/streambuf.tcc @@ -198,29 +198,31 @@ namespace std { streamsize __bufsize = __sbin->in_avail(); streamsize __xtrct; bool __testput = __sbout->_M_mode & ios_base::out; - try { - while (__testput && __bufsize != -1) - { - __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize); - __ret += __xtrct; - __sbin->_M_in_cur_move(__xtrct); - if (__xtrct == __bufsize) - { - if (__sbin->sgetc() == _Traits::eof()) - break; - __bufsize = __sbin->in_avail(); - } - else - break; - } - } - catch(exception& __fail) { - if ((__ios.exceptions() & ios_base::failbit) != 0) - __throw_exception_again; - } + try + { + while (__testput && __bufsize != -1) + { + __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize); + __ret += __xtrct; + __sbin->_M_in_cur_move(__xtrct); + if (__xtrct == __bufsize) + { + if (__sbin->sgetc() == _Traits::eof()) + break; + __bufsize = __sbin->in_avail(); + } + else + break; + } + } + catch(exception& __fail) + { + __ios.setstate(ios_base::failbit); + if ((__ios.exceptions() & ios_base::failbit) != 0) + __throw_exception_again; + } return __ret; } } // namespace std #endif // _CPP_BITS_STREAMBUF_TCC - -- 2.30.2