diff options
Diffstat (limited to 'libstdc++-v3/include/bits/istream.tcc')
-rw-r--r-- | libstdc++-v3/include/bits/istream.tcc | 1139 |
1 files changed, 578 insertions, 561 deletions
diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index a8da096ae06..a2df71f9440 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -30,9 +30,10 @@ // #include <bits/std_locale.h> +#include <bits/std_ostream.h> // for flush() -namespace std { - +namespace std +{ template<typename _CharT, typename _Traits> basic_istream<_CharT, _Traits>::sentry:: sentry(basic_istream<_CharT, _Traits>& __in, bool __noskipws) @@ -44,24 +45,16 @@ namespace std { if (!__noskipws && (__in.flags() & ios_base::skipws)) { const __int_type __eof = traits_type::eof(); - __int_type __c = __int_type(0); - __streambuf_type* __sb = __in.rdbuf(); const __ctype_type* __ctype = __in._M_get_fctype_ios(); - bool __testsp = true; - bool __testeof = false; - - while (!__testeof && __testsp) - { - __c = __sb->sbumpc(); - __testeof = __c == __eof; - __testsp = __ctype->is(ctype_base::space, __c); - } + __streambuf_type* __sb = __in.rdbuf(); + __int_type __c = __sb->sgetc(); - if (!__testeof && !__testsp) - __sb->sputbackc(__c); + while (__c != __eof && __ctype->is(ctype_base::space, __c)) + __c = __sb->snextc(); + #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS //195. Should basic_istream::sentry's constructor ever set eofbit? - else + if (__c == __eof) __in.setstate(ios_base::eofbit); #endif } @@ -81,20 +74,7 @@ namespace std { basic_istream<_CharT, _Traits>:: operator>>(__istream_type& (*__pf)(__istream_type&)) { - sentry __cerb(*this, false); - if (__cerb) - { - try { - __pf(*this); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } - } + __pf(*this); return *this; } @@ -103,20 +83,7 @@ namespace std { basic_istream<_CharT, _Traits>:: operator>>(__ios_type& (*__pf)(__ios_type&)) { - sentry __cerb(*this, false); - if (__cerb) - { - try { - __pf(*this); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } - } + __pf(*this); return *this; } @@ -125,20 +92,7 @@ namespace std { basic_istream<_CharT, _Traits>:: operator>>(ios_base& (*__pf)(ios_base&)) { - sentry __cerb(*this, false); - if (__cerb) - { - try { - __pf(*this); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } - } + __pf(*this); return *this; } @@ -150,18 +104,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -174,18 +131,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -198,18 +158,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -222,18 +185,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -246,18 +212,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -270,18 +239,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -294,18 +266,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -319,18 +294,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -343,18 +321,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -368,18 +349,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -392,18 +376,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -416,18 +403,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -440,18 +430,21 @@ namespace std { sentry __cerb(*this, false); if (__cerb) { - try { - iostate __err = iostate(ios_base::goodbit); - _M_fnumget->get(*this, 0, *this, __err, __n); - this->setstate(__err); - } - catch(exception& __fail){ - // 27.6.1.2.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; - } + try + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (_M_check_facet(_M_fnumget)) + _M_fnumget->get(*this, 0, *this, __err, __n); + this->setstate(__err); + } + catch(exception& __fail) + { + // 27.6.1.2.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; } @@ -472,7 +465,7 @@ namespace std { } template<typename _CharT, typename _Traits> - basic_istream<_CharT, _Traits>::int_type + typename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>:: get(void) { @@ -482,21 +475,23 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - __c = this->rdbuf()->sbumpc(); - // 27.6.1.1 paragraph 3 - if (__c != __eof) - _M_gcount = 1; - else - this->setstate(ios_base::eofbit | ios_base::failbit); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + __c = this->rdbuf()->sbumpc(); + // 27.6.1.1 paragraph 3 + if (__c != __eof) + _M_gcount = 1; + else + this->setstate(ios_base::eofbit | ios_base::failbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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 __c; } @@ -510,25 +505,27 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - const int_type __eof = traits_type::eof(); - int_type __bufval = this->rdbuf()->sbumpc(); - // 27.6.1.1 paragraph 3 - if (__bufval != __eof) - { - _M_gcount = 1; - __c = traits_type::to_char_type(__bufval); - } - else - this->setstate(ios_base::eofbit | ios_base::failbit); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + const int_type __eof = traits_type::eof(); + int_type __bufval = this->rdbuf()->sbumpc(); + // 27.6.1.1 paragraph 3 + if (__bufval != __eof) + { + _M_gcount = 1; + __c = traits_type::to_char_type(__bufval); + } + else + this->setstate(ios_base::eofbit | ios_base::failbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; } @@ -542,36 +539,38 @@ namespace std { sentry __cerb(*this, true); if (__cerb && __n > 1) { - try { - const int_type __idelim = traits_type::to_int_type(__delim); - const int_type __eof = traits_type::eof(); - __streambuf_type* __sb = this->rdbuf(); - int_type __c = __sb->sbumpc(); - bool __testdelim = __c == __idelim; - bool __testeof = __c == __eof; - - while (_M_gcount < __n - 1 && !__testeof && !__testdelim) - { - *__s++ = traits_type::to_char_type(__c); - ++_M_gcount; - __c = __sb->sbumpc(); - __testeof = __c == __eof; - __testdelim = __c == __idelim; - } - if (__testdelim || _M_gcount == __n - 1) - __sb->sputbackc(__c); - if (__testeof) - this->setstate(ios_base::eofbit); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sbumpc(); + bool __testdelim = __c == __idelim; + bool __testeof = __c == __eof; + + while (_M_gcount < __n - 1 && !__testeof && !__testdelim) + { + *__s++ = traits_type::to_char_type(__c); + ++_M_gcount; + __c = __sb->sbumpc(); + __testeof = __c == __eof; + __testdelim = __c == __idelim; + } + if (__testdelim || _M_gcount == __n - 1) + __sb->sputbackc(__c); + if (__testeof) + this->setstate(ios_base::eofbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; + } } - *__s = char_type(NULL); + *__s = char_type(); if (!_M_gcount) this->setstate(ios_base::failbit); return *this; @@ -588,32 +587,34 @@ namespace std { { int_type __c; __streambuf_type* __this_sb = this->rdbuf(); - try { - const int_type __idelim = traits_type::to_int_type(__delim); - const int_type __eof = traits_type::eof(); - __c = __this_sb->sbumpc(); - bool __testdelim = __c == __idelim; - bool __testeof = __c == __eof; - bool __testput = true; - - while (!__testeof && !__testdelim - && (__testput = __sb.sputc(traits_type::to_char_type(__c)) - != __eof)) - { - ++_M_gcount; - __c = __this_sb->sbumpc(); - __testeof = __c == __eof; - __testdelim = __c == __idelim; - } - if (__testdelim || !__testput) + try + { + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + __c = __this_sb->sbumpc(); + bool __testdelim = __c == __idelim; + bool __testeof = __c == __eof; + bool __testput = true; + + while (!__testeof && !__testdelim + && (__testput = __sb.sputc(traits_type::to_char_type(__c)) + != __eof)) + { + ++_M_gcount; + __c = __this_sb->sbumpc(); + __testeof = __c == __eof; + __testdelim = __c == __idelim; + } + if (__testdelim || !__testput) + __this_sb->sputbackc(traits_type::to_char_type(__c)); + if (__testeof) + this->setstate(ios_base::eofbit); + } + catch(exception& __fail) + { + // Exception may result from sputc->overflow. __this_sb->sputbackc(traits_type::to_char_type(__c)); - if (__testeof) - this->setstate(ios_base::eofbit); - } - catch(exception& __fail){ - // Exception may result from sputc->overflow. - __this_sb->sputbackc(traits_type::to_char_type(__c)); - } + } } if (!_M_gcount) this->setstate(ios_base::failbit); @@ -629,45 +630,47 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - __streambuf_type* __sb = this->rdbuf(); - int_type __c = __sb->sbumpc(); - ++_M_gcount; - const int_type __idelim = traits_type::to_int_type(__delim); - const int_type __eof = traits_type::eof(); - bool __testdelim = __c == __idelim; - bool __testeof = __c == __eof; - - while (_M_gcount < __n && !__testeof && !__testdelim) - { - *__s++ = traits_type::to_char_type(__c); - __c = __sb->sbumpc(); - ++_M_gcount; - __testeof = __c == __eof; - __testdelim = __c == __idelim; - } + try + { + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sbumpc(); + ++_M_gcount; + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + bool __testdelim = __c == __idelim; + bool __testeof = __c == __eof; - if (__testeof) - { - --_M_gcount; - this->setstate(ios_base::eofbit); - } - else if (!__testdelim) - { - --_M_gcount; - __sb->sputbackc(traits_type::to_char_type(__c)); - this->setstate(ios_base::failbit); - } - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + while (_M_gcount < __n && !__testeof && !__testdelim) + { + *__s++ = traits_type::to_char_type(__c); + __c = __sb->sbumpc(); + ++_M_gcount; + __testeof = __c == __eof; + __testdelim = __c == __idelim; + } + + if (__testeof) + { + --_M_gcount; + this->setstate(ios_base::eofbit); + } + else if (!__testdelim) + { + --_M_gcount; + __sb->sputbackc(traits_type::to_char_type(__c)); + this->setstate(ios_base::failbit); + } + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; + } } - *__s = char_type(NULL); + *__s = char_type(); if (!_M_gcount) this->setstate(ios_base::failbit); return *this; @@ -682,40 +685,42 @@ namespace std { sentry __cerb(*this, true); if (__cerb && __n > 0) { - try { - const int_type __idelim = traits_type::to_int_type(__delim); - const int_type __eof = traits_type::eof(); - __streambuf_type* __sb = this->rdbuf(); - int_type __c = __sb->sbumpc(); - bool __testdelim = __c == __idelim; - bool __testeof = __c == __eof; - - __n = min(__n, numeric_limits<streamsize>::max()); - while (_M_gcount < __n - 1 && !__testeof && !__testdelim) - { + try + { + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sbumpc(); + bool __testdelim = __c == __idelim; + bool __testeof = __c == __eof; + + __n = min(__n, numeric_limits<streamsize>::max()); + while (_M_gcount < __n - 1 && !__testeof && !__testdelim) + { + ++_M_gcount; + __c = __sb->sbumpc(); + __testeof = __c == __eof; + __testdelim = __c == __idelim; + } + if ((_M_gcount == __n - 1 && !__testeof) || __testdelim) ++_M_gcount; - __c = __sb->sbumpc(); - __testeof = __c == __eof; - __testdelim = __c == __idelim; - } - if ((_M_gcount == __n - 1 && !__testeof) || __testdelim) - ++_M_gcount; - if (__testeof) - this->setstate(ios_base::eofbit); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + if (__testeof) + this->setstate(ios_base::eofbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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_istream<_CharT, _Traits>::int_type + typename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>:: peek(void) { @@ -724,16 +729,16 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - __c = this->rdbuf()->sgetc(); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { __c = this->rdbuf()->sgetc(); } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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 __c; } @@ -749,35 +754,37 @@ namespace std { { if (__n > 0) { - try { - const int_type __eof = traits_type::eof(); - __streambuf_type* __sb = this->rdbuf(); - int_type __c = __sb->sbumpc(); - bool __testeof = __c == __eof; - - while (_M_gcount < __n - 1 && !__testeof) - { - *__s++ = traits_type::to_char_type(__c); - ++_M_gcount; - __c = __sb->sbumpc(); - __testeof = __c == __eof; - } - if (__testeof) - this->setstate(ios_base::eofbit | ios_base::failbit); - else - { - // _M_gcount == __n - 1 - *__s++ = traits_type::to_char_type(__c); - ++_M_gcount; - } - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sbumpc(); + bool __testeof = __c == __eof; + + while (_M_gcount < __n - 1 && !__testeof) + { + *__s++ = traits_type::to_char_type(__c); + ++_M_gcount; + __c = __sb->sbumpc(); + __testeof = __c == __eof; + } + if (__testeof) + this->setstate(ios_base::eofbit | ios_base::failbit); + else + { + // _M_gcount == __n - 1 + *__s++ = traits_type::to_char_type(__c); + ++_M_gcount; + } + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; + } } } else @@ -797,24 +804,25 @@ namespace std { { if (__n > 0) { - try { - streamsize __num = this->rdbuf()->in_avail(); - if (__num != static_cast<streamsize>(__eof)) - { - __num = min(__num, __n); - _M_gcount = this->rdbuf()->sgetn(__s, __num); - } - else - this->setstate(ios_base::eofbit); - } - - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + streamsize __num = this->rdbuf()->in_avail(); + if (__num != static_cast<streamsize>(__eof)) + { + __num = min(__num, __n); + _M_gcount = this->rdbuf()->sgetn(__s, __num); + } + else + this->setstate(ios_base::eofbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; + } } } else @@ -830,19 +838,21 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - const int_type __eof = traits_type::eof(); - __streambuf_type* __sb = this->rdbuf(); - if (!__sb || __sb->sputbackc(__c) == __eof) - this->setstate(ios_base::badbit); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + if (!__sb || __sb->sputbackc(__c) == __eof) + this->setstate(ios_base::badbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; + } } else this->setstate(ios_base::failbit); @@ -858,19 +868,21 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - const int_type __eof = traits_type::eof(); - __streambuf_type* __sb = this->rdbuf(); - if (!__sb || __eof == __sb->sungetc()) - this->setstate(ios_base::badbit); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + if (!__sb || __eof == __sb->sungetc()) + this->setstate(ios_base::badbit); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; + } } else this->setstate(ios_base::failbit); @@ -887,20 +899,22 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - __streambuf_type* __sb = this->rdbuf(); - if (!__sb || __ret == __sb->pubsync()) - this->setstate(ios_base::badbit); - else - __ret = 0; - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + __streambuf_type* __sb = this->rdbuf(); + if (!__sb || __ret == __sb->pubsync()) + this->setstate(ios_base::badbit); + else + __ret = 0; + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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 __ret; } @@ -915,16 +929,18 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { - __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + try + { + __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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 __ret; } @@ -939,19 +955,25 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { + try + { #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS // 136. seekp, seekg setting wrong streams? - this->rdbuf()->pubseekpos(__pos, ios_base::in); + pos_type __err = this->rdbuf()->pubseekpos(__pos, ios_base::in); + +// 129. Need error indication from seekp() and seekg() + if (__err == pos_type(off_type(-1))) + this->setstate(failbit); #endif - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; } @@ -965,19 +987,26 @@ namespace std { sentry __cerb(*this, true); if (__cerb) { - try { + try + { #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS // 136. seekp, seekg setting wrong streams? - this->rdbuf()->pubseekoff(__off, __dir, ios_base::in); + pos_type __err = this->rdbuf()->pubseekoff(__off, __dir, + ios_base::in); + +// 129. Need error indication from seekp() and seekg() + if (__err == pos_type(off_type(-1))) + this->setstate(failbit); #endif - } - catch(exception& __fail){ - // 27.6.1.3 paragraph 1 - // Turn this on without causing an ios::failure to be thrown. - this->setstate(ios_base::badbit); - if ((this->exceptions() & ios_base::badbit) != 0) - throw; - } + } + catch(exception& __fail) + { + // 27.6.1.3 paragraph 1 + // 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; } @@ -988,19 +1017,19 @@ namespace std { operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) { typedef basic_istream<_CharT, _Traits> __istream_type; - __istream_type::sentry __cerb(__in, false); + typename __istream_type::sentry __cerb(__in, false); if (__cerb) { - try { - __in.get(__c); - } - catch(exception& __fail){ - // 27.6.1.2.1 Common requirements. - // Turn this on without causing an ios::failure to be thrown. - __in.setstate(ios_base::badbit); - if ((__in.exceptions() & ios_base::badbit) != 0) - throw; - } + try + { __in.get(__c); } + catch(exception& __fail) + { + // 27.6.1.2.1 Common requirements. + // Turn this on without causing an ios::failure to be thrown. + __in.setstate(ios_base::badbit); + if ((__in.exceptions() & ios_base::badbit) != 0) + __throw_exception_again; + } } else __in.setstate(ios_base::failbit); @@ -1016,51 +1045,53 @@ namespace std { typedef typename _Traits::int_type int_type; typedef _CharT char_type; typedef ctype<_CharT> __ctype_type; - int_type __extracted = 0; + streamsize __extracted = 0; - __istream_type::sentry __cerb(__in, false); + typename __istream_type::sentry __cerb(__in, false); if (__cerb) { - try { - // Figure out how many characters to extract. - int_type __num = static_cast<int_type>(__in.width()); - if (__num <= 0) - __num = basic_string<_CharT, _Traits>::npos; - - __streambuf_type* __sb = __in.rdbuf(); - const __ctype_type* __ctype = __in._M_get_fctype_ios(); - int_type __c = __sb->sbumpc(); - const int_type __eof = _Traits::eof(); - bool __testsp = __ctype->is(ctype_base::space, __c); - bool __testeof = __c == __eof; - - while (__extracted < __num - 1 && !__testeof && !__testsp) - { - *__s++ = __c; - ++__extracted; - __c = __sb->sbumpc(); - __testeof = __c == __eof; - __testsp = __ctype->is(ctype_base::space, __c); - } - - if (!__testeof) - __sb->sputbackc(__c); - else - __in.setstate(ios_base::eofbit); + try + { + // Figure out how many characters to extract. + streamsize __num = __in.width(); + if (__num == 0) + __num = numeric_limits<streamsize>::max(); + + __streambuf_type* __sb = __in.rdbuf(); + const __ctype_type* __ctype = __in._M_get_fctype_ios(); + int_type __c = __sb->sbumpc(); + const int_type __eof = _Traits::eof(); + bool __testsp = __ctype->is(ctype_base::space, __c); + bool __testeof = __c == __eof; + + while (__extracted < __num - 1 && !__testeof && !__testsp) + { + *__s++ = __c; + ++__extracted; + __c = __sb->sbumpc(); + __testeof = __c == __eof; + __testsp = __ctype->is(ctype_base::space, __c); + } + + if (!__testeof) + __sb->sputbackc(__c); + else + __in.setstate(ios_base::eofbit); #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS //68. Extractors for char* should store null at end - *__s = char_type(); + *__s = char_type(); #endif - __in.width(0); - } - catch(exception& __fail){ - // 27.6.1.2.1 Common requirements. - // Turn this on without causing an ios::failure to be thrown. - __in.setstate(ios_base::badbit); - if ((__in.exceptions() & ios_base::badbit) != 0) - throw; - } + __in.width(0); + } + catch(exception& __fail) + { + // 27.6.1.2.1 Common requirements. + // Turn this on without causing an ios::failure to be thrown. + __in.setstate(ios_base::badbit); + if ((__in.exceptions() & ios_base::badbit) != 0) + __throw_exception_again; + } } if (!__extracted) __in.setstate(ios_base::failbit); @@ -1113,9 +1144,9 @@ namespace std { typedef typename __istream_type::__ctype_type __ctype_type; typedef basic_string<_CharT, _Traits, _Alloc> __string_type; typedef typename __string_type::size_type __size_type; - __int_type __extracted = 0; + __size_type __extracted = 0; - __istream_type::sentry __cerb(__in, false); + typename __istream_type::sentry __cerb(__in, false); if (__cerb) { __str.erase(); @@ -1166,7 +1197,7 @@ namespace std { __size_type __extracted = 0; bool __testdelim = false; - __istream_type::sentry __cerb(__in, true); + typename __istream_type::sentry __cerb(__in, true); if (__cerb) { __str.erase(); @@ -1200,23 +1231,9 @@ namespace std { getline(basic_istream<_CharT, _Traits>& __in, basic_string<_CharT,_Traits,_Alloc>& __str) { return getline(__in, __str, __in.widen('\n')); } - } // namespace std // Local Variables: // mode:C++ // End: - - - - - - - - - - - - - |