aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@gcc.gnu.org>2001-10-26 05:32:06 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2001-10-26 05:32:06 +0000
commit6cf5465d43d70fb73bde88435327f64be51bfb55 (patch)
tree7f7cd68fbf0a74f320e6942fb8edd7c1fa720633 /libstdc++-v3
parent3b2a3c4c2a238096562e831b4cef2f866cd1e51e (diff)
downloadgcc-6cf5465d43d70fb73bde88435327f64be51bfb55.zip
gcc-6cf5465d43d70fb73bde88435327f64be51bfb55.tar.gz
gcc-6cf5465d43d70fb73bde88435327f64be51bfb55.tar.bz2
[multiple changes]
2001-10-25 Benjamin Kosnik <bkoz@redhat.com> 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 <brendan@zen.org> libstdc++/4536 * bits/ostream.tcc (seekp): Scope use as ios_base::failbit. * bits/istream.tcc (seekg): Likewise. From-SVN: r46528
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog15
-rw-r--r--libstdc++-v3/include/bits/istream.tcc36
-rw-r--r--libstdc++-v3/include/bits/ostream.tcc51
-rw-r--r--libstdc++-v3/include/bits/streambuf.tcc44
4 files changed, 98 insertions, 48 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 65f391e..1ce42b7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,4 +1,19 @@
2001-10-25 Benjamin Kosnik <bkoz@redhat.com>
+
+ 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 <brendan@zen.org>
+
+ libstdc++/4536
+ * bits/ostream.tcc (seekp): Scope use as ios_base::failbit.
+ * bits/istream.tcc (seekg): Likewise.
+
+2001-10-25 Benjamin Kosnik <bkoz@redhat.com>
Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc
index e0014ea..47b01f6 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<typename _CharT, typename _Traits>
@@ -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 3318226..ff9283d 100644
--- a/libstdc++-v3/include/bits/ostream.tcc
+++ b/libstdc++-v3/include/bits/ostream.tcc
@@ -111,6 +111,38 @@ namespace std
template<typename _CharT, typename _Traits>
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<typename _CharT, typename _Traits>
+ basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::operator<<(bool __n)
{
sentry __cerb(*this);
@@ -337,20 +369,6 @@ namespace std
}
template<typename _CharT, typename _Traits>
- 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<typename _CharT, typename _Traits>
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 d928379..9482c69 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
-