X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Finclude%2Fbits%2Fistream.tcc;fp=libstdc%2B%2B-v3%2Finclude%2Fbits%2Fistream.tcc;h=5d60791ec985185bf103f81c79eaa61d4cff9f0d;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=a6e49a923bd2fb027dc951c73fcb2a7c56e4d11e;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index a6e49a92..5d60791e 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -1,12 +1,13 @@ // istream classes -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +// 2006, 2007, 2008, 2009 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the -// Free Software Foundation; either version 2, or (at your option) +// Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, @@ -14,499 +15,171 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING. If not, write to the Free -// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. -// As a special exception, you may use this file as part of a free software -// library without restriction. Specifically, if other files instantiate -// templates or use macros or inline functions from this file, or you compile -// this file and link it with other files to produce an executable, this -// file does not by itself cause the resulting executable to be covered by -// the GNU General Public License. This exception does not however -// invalidate any other reasons why the executable file might be covered by -// the GNU General Public License. +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/** @file istream.tcc + * This is an internal header file, included by other library headers. + * You should not attempt to use it directly. + */ // -// ISO C++ 14882: 27.6.2 Output streams +// ISO C++ 14882: 27.6.1 Input streams // +#ifndef _ISTREAM_TCC +#define _ISTREAM_TCC 1 + #pragma GCC system_header -#include -#include // For flush() +#include + +_GLIBCXX_BEGIN_NAMESPACE(std) -namespace std -{ template basic_istream<_CharT, _Traits>::sentry:: - sentry(basic_istream<_CharT, _Traits>& __in, bool __noskipws) + sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false) { - if (__in.good()) + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + if (__in.good()) { if (__in.tie()) __in.tie()->flush(); - if (!__noskipws && (__in.flags() & ios_base::skipws)) - { + if (!__noskip && bool(__in.flags() & ios_base::skipws)) + { const __int_type __eof = traits_type::eof(); __streambuf_type* __sb = __in.rdbuf(); __int_type __c = __sb->sgetc(); - if (__in._M_check_facet(__in._M_fctype)) - while (!traits_type::eq_int_type(__c, __eof) - && __in._M_fctype->is(ctype_base::space, - traits_type::to_char_type(__c))) - __c = __sb->snextc(); + const __ctype_type& __ct = __check_facet(__in._M_ctype); + while (!traits_type::eq_int_type(__c, __eof) + && __ct.is(ctype_base::space, + traits_type::to_char_type(__c))) + __c = __sb->snextc(); -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -//195. Should basic_istream::sentry's constructor ever set eofbit? + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 195. Should basic_istream::sentry's constructor ever + // set eofbit? if (traits_type::eq_int_type(__c, __eof)) - __in.setstate(ios_base::eofbit); -#endif + __err |= ios_base::eofbit; } } - if (__in.good()) + if (__in.good() && __err == ios_base::goodbit) _M_ok = true; else { - _M_ok = false; - __in.setstate(ios_base::failbit); - } - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(__istream_type& (*__pf)(__istream_type&)) - { - __pf(*this); - return *this; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(__ios_type& (*__pf)(__ios_type&)) - { - __pf(*this); - return *this; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(ios_base& (*__pf)(ios_base&)) - { - __pf(*this); - return *this; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(bool& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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) + __err |= ios_base::failbit; + __in.setstate(__err); + } + } + + template + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + _M_extract(_ValueT& __v) + { + sentry __cerb(*this, false); + if (__cerb) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try + { + const __num_get_type& __ng = __check_facet(this->_M_num_get); + __ng.get(*this, 0, *this, __err, __v); + } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); __throw_exception_again; - } - } - return *this; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(short& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - try - { - ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); - long __l; - if (_M_check_facet(_M_fnumget)) - _M_fnumget->get(*this, 0, *this, __err, __l); -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS - // 118. basic_istream uses nonexistent num_get member functions. - if (!(__err & ios_base::failbit) - && (numeric_limits::min() <= __l - && __l <= numeric_limits::max())) - __n = __l; - else - __err |= ios_base::failbit; -#endif + } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) 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; - } + } + return *this; + } template - basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: - operator>>(unsigned short& __n) + operator>>(short& __n) { - sentry __cerb(*this, false); - if (__cerb) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 118. basic_istream uses nonexistent num_get member functions. + long __l; + _M_extract(__l); + if (!this->fail()) { - 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; - } + if (__gnu_cxx::__numeric_traits::__min <= __l + && __l <= __gnu_cxx::__numeric_traits::__max) + __n = short(__l); + else + this->setstate(ios_base::failbit); } return *this; } - + template - basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: operator>>(int& __n) { - sentry __cerb(*this, false); - if (__cerb) - { - try - { - ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); - long __l; - if (_M_check_facet(_M_fnumget)) - _M_fnumget->get(*this, 0, *this, __err, __l); -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS - // 118. basic_istream uses nonexistent num_get member functions. - if (!(__err & ios_base::failbit) - && (numeric_limits::min() <= __l - && __l <= numeric_limits::max())) - __n = __l; - else - __err |= ios_base::failbit; -#endif - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(unsigned int& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(long& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(unsigned long& __n) - { - sentry __cerb(*this, false); - if (__cerb) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 118. basic_istream uses nonexistent num_get member functions. + long __l; + _M_extract(__l); + if (!this->fail()) { - 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; - } + if (__gnu_cxx::__numeric_traits::__min <= __l + && __l <= __gnu_cxx::__numeric_traits::__max) + __n = int(__l); + else + this->setstate(ios_base::failbit); } return *this; } -#ifdef _GLIBCPP_USE_LONG_LONG template - basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: - operator>>(long long& __n) + operator>>(__streambuf_type* __sbout) { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); sentry __cerb(*this, false); - if (__cerb) + if (__cerb && __sbout) { - try + __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); + bool __ineof; + if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof)) + __err |= ios_base::failbit; + if (__ineof) + __err |= ios_base::eofbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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) + this->_M_setstate(ios_base::failbit); __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::failbit); } } + else if (!__sbout) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); return *this; } - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(unsigned long long& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } -#endif - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(float& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(double& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(long double& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(void*& __n) - { - sentry __cerb(*this, false); - if (__cerb) - { - 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; - } - - template - basic_istream<_CharT, _Traits>& - basic_istream<_CharT, _Traits>:: - operator>>(__streambuf_type* __sbout) - { - 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 basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>:: @@ -515,27 +188,31 @@ namespace std const int_type __eof = traits_type::eof(); int_type __c = __eof; _M_gcount = 0; + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + __try { __c = this->rdbuf()->sbumpc(); // 27.6.1.1 paragraph 3 if (!traits_type::eq_int_type(__c, __eof)) _M_gcount = 1; else - this->setstate(ios_base::eofbit | ios_base::failbit); + __err |= ios_base::eofbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } } + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); return __c; } @@ -545,31 +222,34 @@ namespace std get(char_type& __c) { _M_gcount = 0; + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + __try { - const int_type __eof = traits_type::eof(); - int_type __bufval = this->rdbuf()->sbumpc(); + const int_type __cb = this->rdbuf()->sbumpc(); // 27.6.1.1 paragraph 3 - if (!traits_type::eq_int_type(__bufval, __eof)) + if (!traits_type::eq_int_type(__cb, traits_type::eof())) { _M_gcount = 1; - __c = traits_type::to_char_type(__bufval); + __c = traits_type::to_char_type(__cb); } else - this->setstate(ios_base::eofbit | ios_base::failbit); + __err |= ios_base::eofbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } } + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); return *this; } @@ -579,39 +259,44 @@ namespace std get(char_type* __s, streamsize __n, char_type __delim) { _M_gcount = 0; + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + __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->sgetc(); - - while (_M_gcount + 1 < __n + int_type __c = __sb->sgetc(); + + while (_M_gcount + 1 < __n && !traits_type::eq_int_type(__c, __eof) && !traits_type::eq_int_type(__c, __idelim)) { *__s++ = traits_type::to_char_type(__c); - __c = __sb->snextc(); ++_M_gcount; + __c = __sb->snextc(); } if (traits_type::eq_int_type(__c, __eof)) - this->setstate(ios_base::eofbit); + __err |= ios_base::eofbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } } - *__s = char_type(); + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 243. get and getline when sentry reports failure. + if (__n > 0) + *__s = char_type(); if (!_M_gcount) - this->setstate(ios_base::failbit); + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); return *this; } @@ -621,19 +306,20 @@ namespace std get(__streambuf_type& __sb, char_type __delim) { _M_gcount = 0; + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + __try { const int_type __idelim = traits_type::to_int_type(__delim); - const int_type __eof = traits_type::eof(); + const int_type __eof = traits_type::eof(); __streambuf_type* __this_sb = this->rdbuf(); int_type __c = __this_sb->sgetc(); char_type __c2 = traits_type::to_char_type(__c); - - while (!traits_type::eq_int_type(__c, __eof) - && !traits_type::eq_int_type(__c, __idelim) + + while (!traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __idelim) && !traits_type::eq_int_type(__sb.sputc(__c2), __eof)) { ++_M_gcount; @@ -641,19 +327,20 @@ namespace std __c2 = traits_type::to_char_type(__c); } if (traits_type::eq_int_type(__c, __eof)) - this->setstate(ios_base::eofbit); + __err |= ios_base::eofbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } } if (!_M_gcount) - this->setstate(ios_base::failbit); + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); return *this; } @@ -663,52 +350,155 @@ namespace std getline(char_type* __s, streamsize __n, char_type __delim) { _M_gcount = 0; + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); sentry __cerb(*this, true); - if (__cerb) + if (__cerb) + { + __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->sgetc(); + + while (_M_gcount + 1 < __n + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __idelim)) + { + *__s++ = traits_type::to_char_type(__c); + __c = __sb->snextc(); + ++_M_gcount; + } + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + else + { + if (traits_type::eq_int_type(__c, __idelim)) + { + __sb->sbumpc(); + ++_M_gcount; + } + else + __err |= ios_base::failbit; + } + } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + __throw_exception_again; + } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 243. get and getline when sentry reports failure. + if (__n > 0) + *__s = char_type(); + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return *this; + } + + // We provide three overloads, since the first two are much simpler + // than the general case. Also, the latter two can thus adopt the + // same "batchy" strategy used by getline above. + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + ignore(void) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb) { - try + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __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->sgetc(); - - while (_M_gcount + 1 < __n - && !traits_type::eq_int_type(__c, __eof) - && !traits_type::eq_int_type(__c, __idelim)) - { - *__s++ = traits_type::to_char_type(__c); - __c = __sb->snextc(); - ++_M_gcount; - } - if (traits_type::eq_int_type(__c, __eof)) - this->setstate(ios_base::eofbit); + + if (traits_type::eq_int_type(__sb->sbumpc(), __eof)) + __err |= ios_base::eofbit; else + _M_gcount = 1; + } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + __throw_exception_again; + } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + ignore(streamsize __n) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb && __n > 0) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + // N.B. On LFS-enabled platforms streamsize is still 32 bits + // wide: if we want to implement the standard mandated behavior + // for n == max() (see 27.6.1.3/24) we are at risk of signed + // integer overflow: thus these contortions. Also note that, + // by definition, when more than 2G chars are actually ignored, + // _M_gcount (the return value of gcount, that is) cannot be + // really correct, being unavoidably too small. + bool __large_ignore = false; + while (true) { - if (traits_type::eq_int_type(__c, __idelim)) + while (_M_gcount < __n + && !traits_type::eq_int_type(__c, __eof)) { - __sb->sbumpc(); ++_M_gcount; + __c = __sb->snextc(); + } + if (__n == __gnu_cxx::__numeric_traits::__max + && !traits_type::eq_int_type(__c, __eof)) + { + _M_gcount = + __gnu_cxx::__numeric_traits::__min; + __large_ignore = true; } else - this->setstate(ios_base::failbit); + break; } - } - catch(exception& __fail) + + if (__large_ignore) + _M_gcount = __gnu_cxx::__numeric_traits::__max; + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } - } - *__s = char_type(); - if (!_M_gcount) - this->setstate(ios_base::failbit); + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } return *this; } - + template basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: @@ -716,37 +506,64 @@ namespace std { _M_gcount = 0; sentry __cerb(*this, true); - if (__cerb && __n > 0) - { - try - { - const int_type __eof = traits_type::eof(); - __streambuf_type* __sb = this->rdbuf(); - int_type __c; - - __n = min(__n, numeric_limits::max()); - while (_M_gcount < __n - && !traits_type::eq_int_type(__c = __sb->sbumpc(), __eof)) + if (__cerb && __n > 0) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + // See comment above. + bool __large_ignore = false; + while (true) { - ++_M_gcount; - if (traits_type::eq_int_type(__c, __delim)) + while (_M_gcount < __n + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __delim)) + { + ++_M_gcount; + __c = __sb->snextc(); + } + if (__n == __gnu_cxx::__numeric_traits::__max + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __delim)) + { + _M_gcount = + __gnu_cxx::__numeric_traits::__min; + __large_ignore = true; + } + else break; } - if (traits_type::eq_int_type(__c, __eof)) - this->setstate(ios_base::eofbit); - } - catch(exception& __fail) + + if (__large_ignore) + _M_gcount = __gnu_cxx::__numeric_traits::__max; + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + else if (traits_type::eq_int_type(__c, __delim)) + { + if (_M_gcount + < __gnu_cxx::__numeric_traits::__max) + ++_M_gcount; + __sb->sbumpc(); + } + } + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } - } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } return *this; } - + template typename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>:: @@ -757,17 +574,23 @@ namespace std sentry __cerb(*this, true); if (__cerb) { - try - { __c = this->rdbuf()->sgetc(); } - catch(exception& __fail) + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { - // 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; + __c = this->rdbuf()->sgetc(); + if (traits_type::eq_int_type(__c, traits_type::eof())) + __err |= ios_base::eofbit; } - } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + __throw_exception_again; + } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } return __c; } @@ -778,187 +601,216 @@ namespace std { _M_gcount = 0; sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { _M_gcount = this->rdbuf()->sgetn(__s, __n); if (_M_gcount != __n) - this->setstate(ios_base::eofbit | ios_base::failbit); - } - catch(exception& __fail) + __err |= (ios_base::eofbit | ios_base::failbit); + } + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); } - else - this->setstate(ios_base::failbit); return *this; } - + template - streamsize + streamsize basic_istream<_CharT, _Traits>:: readsome(char_type* __s, streamsize __n) { _M_gcount = 0; sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { // Cannot compare int_type with streamsize generically. - streamsize __num = this->rdbuf()->in_avail(); - if (__num >= 0) - { - __num = min(__num, __n); - if (__num) - _M_gcount = this->rdbuf()->sgetn(__s, __num); - } - else - this->setstate(ios_base::eofbit); + const streamsize __num = this->rdbuf()->in_avail(); + if (__num > 0) + _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n)); + else if (__num == -1) + __err |= ios_base::eofbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); } - else - this->setstate(ios_base::failbit); return _M_gcount; } - + template basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: putback(char_type __c) { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 60. What is a formatted input function? + _M_gcount = 0; sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { const int_type __eof = traits_type::eof(); __streambuf_type* __sb = this->rdbuf(); - if (!__sb + if (!__sb || traits_type::eq_int_type(__sb->sputbackc(__c), __eof)) - this->setstate(ios_base::badbit); + __err |= ios_base::badbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); } - else - this->setstate(ios_base::failbit); return *this; } - + template basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: unget(void) { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 60. What is a formatted input function? _M_gcount = 0; sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { const int_type __eof = traits_type::eof(); __streambuf_type* __sb = this->rdbuf(); - if (!__sb + if (!__sb || traits_type::eq_int_type(__sb->sungetc(), __eof)) - this->setstate(ios_base::badbit); + __err |= ios_base::badbit; } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); } - else - this->setstate(ios_base::failbit); return *this; } - + template int basic_istream<_CharT, _Traits>:: sync(void) { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR60. Do not change _M_gcount. int __ret = -1; - _M_gcount = 0; sentry __cerb(*this, true); - if (__cerb) + if (__cerb) { - try + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { __streambuf_type* __sb = this->rdbuf(); if (__sb) { if (__sb->pubsync() == -1) - this->setstate(ios_base::badbit); - else + __err |= ios_base::badbit; + else __ret = 0; } } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); } return __ret; } - + template typename basic_istream<_CharT, _Traits>::pos_type basic_istream<_CharT, _Traits>:: tellg(void) { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR60. Do not change _M_gcount. pos_type __ret = pos_type(-1); - if (!this->fail()) - __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); + __try + { + if (!this->fail()) + __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, + ios_base::in); + } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + __throw_exception_again; + } + __catch(...) + { this->_M_setstate(ios_base::badbit); } return __ret; } - template basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: seekg(pos_type __pos) { - _M_gcount = 0; - if (!this->fail()) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR60. Do not change _M_gcount. + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -// 136. seekp, seekg setting wrong streams? - 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(ios_base::failbit); -#endif + if (!this->fail()) + { + // 136. seekp, seekg setting wrong streams? + const pos_type __p = this->rdbuf()->pubseekpos(__pos, + ios_base::in); + + // 129. Need error indication from seekp() and seekg() + if (__p == pos_type(off_type(-1))) + __err |= ios_base::failbit; + } + } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); return *this; } @@ -967,19 +819,31 @@ namespace std basic_istream<_CharT, _Traits>:: seekg(off_type __off, ios_base::seekdir __dir) { - _M_gcount = 0; - if (!this->fail()) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR60. Do not change _M_gcount. + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -// 136. seekp, seekg setting wrong streams? - 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(ios_base::failbit); -#endif + if (!this->fail()) + { + // 136. seekp, seekg setting wrong streams? + const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir, + ios_base::in); + + // 129. Need error indication from seekp() and seekg() + if (__p == pos_type(off_type(-1))) + __err |= ios_base::failbit; + } + } + __catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); return *this; } @@ -988,23 +852,31 @@ namespace std basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) { - typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef typename __istream_type::int_type __int_type; + typename __istream_type::sentry __cerb(__in, false); if (__cerb) { - try - { __in.get(__c); } - catch(exception& __fail) + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + __try { - // 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; + const __int_type __cb = __in.rdbuf()->sbumpc(); + if (!_Traits::eq_int_type(__cb, _Traits::eof())) + __c = _Traits::to_char_type(__cb); + else + __err |= (ios_base::eofbit | ios_base::failbit); } + __catch(__cxxabiv1::__forced_unwind&) + { + __in._M_setstate(ios_base::badbit); + __throw_exception_again; + } + __catch(...) + { __in._M_setstate(ios_base::badbit); } + if (__err) + __in.setstate(__err); } - else - __in.setstate(ios_base::failbit); return __in; } @@ -1012,183 +884,90 @@ namespace std basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) { - typedef basic_istream<_CharT, _Traits> __istream_type; - typedef typename __istream_type::__streambuf_type __streambuf_type; - typedef typename _Traits::int_type int_type; - typedef _CharT char_type; - typedef ctype<_CharT> __ctype_type; - streamsize __extracted = 0; + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef typename _Traits::int_type int_type; + typedef _CharT char_type; + typedef ctype<_CharT> __ctype_type; + streamsize __extracted = 0; + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); typename __istream_type::sentry __cerb(__in, false); if (__cerb) { - try + __try { // Figure out how many characters to extract. streamsize __num = __in.width(); - if (__num == 0) - __num = numeric_limits::max(); - - const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc()); + if (__num <= 0) + __num = __gnu_cxx::__numeric_traits::__max; + + const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); + const int_type __eof = _Traits::eof(); __streambuf_type* __sb = __in.rdbuf(); int_type __c = __sb->sgetc(); - - while (__extracted < __num - 1 + + while (__extracted < __num - 1 && !_Traits::eq_int_type(__c, __eof) - && !__ctype.is(ctype_base::space, __c)) + && !__ct.is(ctype_base::space, + _Traits::to_char_type(__c))) { - *__s++ = __c; + *__s++ = _Traits::to_char_type(__c); ++__extracted; __c = __sb->snextc(); } if (_Traits::eq_int_type(__c, __eof)) - __in.setstate(ios_base::eofbit); + __err |= ios_base::eofbit; -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -//68. Extractors for char* should store null at end + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 68. Extractors for char* should store null at end *__s = char_type(); -#endif __in.width(0); } - catch(exception& __fail) + __catch(__cxxabiv1::__forced_unwind&) { - // 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; + __in._M_setstate(ios_base::badbit); + __throw_exception_again; } + __catch(...) + { __in._M_setstate(ios_base::badbit); } } if (!__extracted) - __in.setstate(ios_base::failbit); + __err |= ios_base::failbit; + if (__err) + __in.setstate(__err); return __in; } // 27.6.1.4 Standard basic_istream manipulators template - basic_istream<_CharT,_Traits>& - ws(basic_istream<_CharT,_Traits>& __in) + basic_istream<_CharT, _Traits>& + ws(basic_istream<_CharT, _Traits>& __in) { - typedef basic_istream<_CharT, _Traits> __istream_type; - typedef typename __istream_type::__streambuf_type __streambuf_type; - typedef typename __istream_type::__ctype_type __ctype_type; - typedef typename __istream_type::int_type __int_type; + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef typename __istream_type::int_type __int_type; + typedef ctype<_CharT> __ctype_type; - const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc()); - const __int_type __eof = _Traits::eof(); + const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); + const __int_type __eof = _Traits::eof(); __streambuf_type* __sb = __in.rdbuf(); __int_type __c = __sb->sgetc(); - while (!_Traits::eq_int_type(__c, __eof) - && __ctype.is(ctype_base::space, __c)) + while (!_Traits::eq_int_type(__c, __eof) + && __ct.is(ctype_base::space, _Traits::to_char_type(__c))) __c = __sb->snextc(); if (_Traits::eq_int_type(__c, __eof)) - __in.setstate(ios_base::eofbit); - - return __in; - } - - // 21.3.7.9 basic_string::getline and operators - template - basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __in, - basic_string<_CharT, _Traits, _Alloc>& __str) - { - typedef basic_istream<_CharT, _Traits> __istream_type; - typedef typename __istream_type::int_type __int_type; - typedef typename __istream_type::__streambuf_type __streambuf_type; - typedef typename __istream_type::__ctype_type __ctype_type; - typedef basic_string<_CharT, _Traits, _Alloc> __string_type; - typedef typename __string_type::size_type __size_type; - __size_type __extracted = 0; - - typename __istream_type::sentry __cerb(__in, false); - if (__cerb) - { - __str.erase(); - streamsize __w = __in.width(); - __size_type __n; - __n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size(); - - const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc()); - const __int_type __eof = _Traits::eof(); - __streambuf_type* __sb = __in.rdbuf(); - __int_type __c = __sb->sgetc(); - - while (__extracted < __n - && !_Traits::eq_int_type(__c, __eof) - && !__ctype.is(ctype_base::space, __c)) - { - __str += _Traits::to_char_type(__c); - ++__extracted; - __c = __sb->snextc(); - } - if (_Traits::eq_int_type(__c, __eof)) - __in.setstate(ios_base::eofbit); - __in.width(0); - } -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -//211. operator>>(istream&, string&) doesn't set failbit - if (!__extracted) - __in.setstate (ios_base::failbit); -#endif - return __in; - } - - template - basic_istream<_CharT, _Traits>& - getline(basic_istream<_CharT, _Traits>& __in, - basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim) - { - typedef basic_istream<_CharT, _Traits> __istream_type; - typedef typename __istream_type::int_type __int_type; - typedef typename __istream_type::__streambuf_type __streambuf_type; - typedef typename __istream_type::__ctype_type __ctype_type; - typedef basic_string<_CharT, _Traits, _Alloc> __string_type; - typedef typename __string_type::size_type __size_type; - - __size_type __extracted = 0; - bool __testdelim = false; - typename __istream_type::sentry __cerb(__in, true); - if (__cerb) - { - __str.erase(); - __size_type __n = __str.max_size(); - - __int_type __idelim = _Traits::to_int_type(__delim); - __streambuf_type* __sb = __in.rdbuf(); - __int_type __c = __sb->sbumpc(); - const __int_type __eof = _Traits::eof(); - __testdelim = _Traits::eq_int_type(__c, __idelim); - - while (__extracted <= __n - && !_Traits::eq_int_type(__c, __eof) - && !__testdelim) - { - __str += _Traits::to_char_type(__c); - ++__extracted; - __c = __sb->sbumpc(); - __testdelim = _Traits::eq_int_type(__c, __idelim); - } - if (_Traits::eq_int_type(__c, __eof)) - __in.setstate(ios_base::eofbit); - } - if (!__extracted && !__testdelim) - __in.setstate(ios_base::failbit); + __in.setstate(ios_base::eofbit); return __in; } - template - inline basic_istream<_CharT,_Traits>& - getline(basic_istream<_CharT, _Traits>& __in, - basic_string<_CharT,_Traits,_Alloc>& __str) - { return getline(__in, __str, __in.widen('\n')); } - // Inhibit implicit instantiations for required instantiations, - // which are defined via explicit instantiations elsewhere. + // which are defined via explicit instantiations elsewhere. // NB: This syntax is a GNU extension. +#if _GLIBCXX_EXTERN_TEMPLATE extern template class basic_istream; extern template istream& ws(istream&); extern template istream& operator>>(istream&, char&); @@ -1198,10 +977,46 @@ namespace std extern template istream& operator>>(istream&, unsigned char*); extern template istream& operator>>(istream&, signed char*); -#ifdef _GLIBCPP_USE_WCHAR_T + extern template istream& istream::_M_extract(unsigned short&); + extern template istream& istream::_M_extract(unsigned int&); + extern template istream& istream::_M_extract(long&); + extern template istream& istream::_M_extract(unsigned long&); + extern template istream& istream::_M_extract(bool&); +#ifdef _GLIBCXX_USE_LONG_LONG + extern template istream& istream::_M_extract(long long&); + extern template istream& istream::_M_extract(unsigned long long&); +#endif + extern template istream& istream::_M_extract(float&); + extern template istream& istream::_M_extract(double&); + extern template istream& istream::_M_extract(long double&); + extern template istream& istream::_M_extract(void*&); + + extern template class basic_iostream; + +#ifdef _GLIBCXX_USE_WCHAR_T extern template class basic_istream; extern template wistream& ws(wistream&); extern template wistream& operator>>(wistream&, wchar_t&); extern template wistream& operator>>(wistream&, wchar_t*); + + extern template wistream& wistream::_M_extract(unsigned short&); + extern template wistream& wistream::_M_extract(unsigned int&); + extern template wistream& wistream::_M_extract(long&); + extern template wistream& wistream::_M_extract(unsigned long&); + extern template wistream& wistream::_M_extract(bool&); +#ifdef _GLIBCXX_USE_LONG_LONG + extern template wistream& wistream::_M_extract(long long&); + extern template wistream& wistream::_M_extract(unsigned long long&); +#endif + extern template wistream& wistream::_M_extract(float&); + extern template wistream& wistream::_M_extract(double&); + extern template wistream& wistream::_M_extract(long double&); + extern template wistream& wistream::_M_extract(void*&); + + extern template class basic_iostream; +#endif +#endif + +_GLIBCXX_END_NAMESPACE + #endif -} // namespace std