100db7afdSDavid E. O'Brien // istream classes -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*f8a1b7d9SAlexander Kabaev // 2006, 2007
500db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
600db7afdSDavid E. O'Brien //
700db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
800db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
900db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
1000db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1100db7afdSDavid E. O'Brien // any later version.
1200db7afdSDavid E. O'Brien 
1300db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1400db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1500db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1600db7afdSDavid E. O'Brien // GNU General Public License for more details.
1700db7afdSDavid E. O'Brien 
1800db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1900db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
20*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2100db7afdSDavid E. O'Brien // USA.
2200db7afdSDavid E. O'Brien 
2300db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2400db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2500db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2600db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2700db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2900db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
3000db7afdSDavid E. O'Brien // the GNU General Public License.
3100db7afdSDavid E. O'Brien 
32*f8a1b7d9SAlexander Kabaev /** @file istream.tcc
33*f8a1b7d9SAlexander Kabaev  *  This is an internal header file, included by other library headers.
34*f8a1b7d9SAlexander Kabaev  *  You should not attempt to use it directly.
35*f8a1b7d9SAlexander Kabaev  */
36*f8a1b7d9SAlexander Kabaev 
3700db7afdSDavid E. O'Brien //
38ffeaf689SAlexander Kabaev // ISO C++ 14882: 27.6.1  Input streams
3900db7afdSDavid E. O'Brien //
4000db7afdSDavid E. O'Brien 
41ffeaf689SAlexander Kabaev #ifndef _ISTREAM_TCC
42ffeaf689SAlexander Kabaev #define _ISTREAM_TCC 1
43ffeaf689SAlexander Kabaev 
4400db7afdSDavid E. O'Brien #pragma GCC system_header
4500db7afdSDavid E. O'Brien 
4600db7afdSDavid E. O'Brien #include <locale>
4700db7afdSDavid E. O'Brien #include <ostream> // For flush()
4800db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)49*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
50*f8a1b7d9SAlexander Kabaev 
5100db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
5200db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::sentry::
53ffeaf689SAlexander Kabaev     sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
5400db7afdSDavid E. O'Brien     {
55ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
5600db7afdSDavid E. O'Brien       if (__in.good())
5700db7afdSDavid E. O'Brien 	{
5800db7afdSDavid E. O'Brien 	  if (__in.tie())
5900db7afdSDavid E. O'Brien 	    __in.tie()->flush();
60ffeaf689SAlexander Kabaev 	  if (!__noskip && (__in.flags() & ios_base::skipws))
6100db7afdSDavid E. O'Brien 	    {
6200db7afdSDavid E. O'Brien 	      const __int_type __eof = traits_type::eof();
6300db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = __in.rdbuf();
6400db7afdSDavid E. O'Brien 	      __int_type __c = __sb->sgetc();
6500db7afdSDavid E. O'Brien 
66ffeaf689SAlexander Kabaev 	      const __ctype_type& __ct = __check_facet(__in._M_ctype);
67ca6500fcSAlexander Kabaev 	      while (!traits_type::eq_int_type(__c, __eof)
68ffeaf689SAlexander Kabaev 		     && __ct.is(ctype_base::space,
69ca6500fcSAlexander Kabaev 				traits_type::to_char_type(__c)))
7000db7afdSDavid E. O'Brien 		__c = __sb->snextc();
7100db7afdSDavid E. O'Brien 
72ffeaf689SAlexander Kabaev 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
73ffeaf689SAlexander Kabaev 	      // 195. Should basic_istream::sentry's constructor ever
74ffeaf689SAlexander Kabaev 	      // set eofbit?
75ca6500fcSAlexander Kabaev 	      if (traits_type::eq_int_type(__c, __eof))
76ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
7700db7afdSDavid E. O'Brien 	    }
7800db7afdSDavid E. O'Brien 	}
7900db7afdSDavid E. O'Brien 
80ffeaf689SAlexander Kabaev       if (__in.good() && __err == ios_base::goodbit)
8100db7afdSDavid E. O'Brien 	_M_ok = true;
8200db7afdSDavid E. O'Brien       else
8300db7afdSDavid E. O'Brien 	{
84ffeaf689SAlexander Kabaev 	  __err |= ios_base::failbit;
85ffeaf689SAlexander Kabaev 	  __in.setstate(__err);
8600db7afdSDavid E. O'Brien 	}
8700db7afdSDavid E. O'Brien     }
8800db7afdSDavid E. O'Brien 
8900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
90*f8a1b7d9SAlexander Kabaev     template<typename _ValueT>
9100db7afdSDavid E. O'Brien       basic_istream<_CharT, _Traits>&
9200db7afdSDavid E. O'Brien       basic_istream<_CharT, _Traits>::
_M_extract(_ValueT & __v)93*f8a1b7d9SAlexander Kabaev       _M_extract(_ValueT& __v)
9400db7afdSDavid E. O'Brien       {
9500db7afdSDavid E. O'Brien 	sentry __cerb(*this, false);
9600db7afdSDavid E. O'Brien 	if (__cerb)
9700db7afdSDavid E. O'Brien 	  {
98ffeaf689SAlexander Kabaev 	    ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
9900db7afdSDavid E. O'Brien 	    try
10000db7afdSDavid E. O'Brien 	      {
101ffeaf689SAlexander Kabaev 		const __num_get_type& __ng = __check_facet(this->_M_num_get);
102*f8a1b7d9SAlexander Kabaev 		__ng.get(*this, 0, *this, __err, __v);
10300db7afdSDavid E. O'Brien 	      }
1041b86b14eSAlexander Kabaev 	    catch(...)
105ffeaf689SAlexander Kabaev 	      { this->_M_setstate(ios_base::badbit); }
106ffeaf689SAlexander Kabaev 	    if (__err)
107ffeaf689SAlexander Kabaev 	      this->setstate(__err);
10800db7afdSDavid E. O'Brien 	  }
10900db7afdSDavid E. O'Brien 	return *this;
11000db7afdSDavid E. O'Brien       }
11100db7afdSDavid E. O'Brien 
11200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
11300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
11400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
operator >>(short & __n)11500db7afdSDavid E. O'Brien     operator>>(short& __n)
11600db7afdSDavid E. O'Brien     {
117ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
11800db7afdSDavid E. O'Brien       // 118. basic_istream uses nonexistent num_get member functions.
119*f8a1b7d9SAlexander Kabaev       long __l;
120*f8a1b7d9SAlexander Kabaev       _M_extract(__l);
121*f8a1b7d9SAlexander Kabaev       if (!this->fail())
122*f8a1b7d9SAlexander Kabaev 	{
123*f8a1b7d9SAlexander Kabaev 	  if (numeric_limits<short>::min() <= __l
124*f8a1b7d9SAlexander Kabaev 	      && __l <= numeric_limits<short>::max())
12500db7afdSDavid E. O'Brien 	    __n = __l;
12600db7afdSDavid E. O'Brien 	  else
127*f8a1b7d9SAlexander Kabaev 	    this->setstate(ios_base::failbit);
12800db7afdSDavid E. O'Brien 	}
12900db7afdSDavid E. O'Brien       return *this;
13000db7afdSDavid E. O'Brien     }
13100db7afdSDavid E. O'Brien 
13200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
13300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
13400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
operator >>(int & __n)13500db7afdSDavid E. O'Brien     operator>>(int& __n)
13600db7afdSDavid E. O'Brien     {
137ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
13800db7afdSDavid E. O'Brien       // 118. basic_istream uses nonexistent num_get member functions.
139*f8a1b7d9SAlexander Kabaev       long __l;
140*f8a1b7d9SAlexander Kabaev       _M_extract(__l);
141*f8a1b7d9SAlexander Kabaev       if (!this->fail())
142*f8a1b7d9SAlexander Kabaev 	{
143*f8a1b7d9SAlexander Kabaev 	  if (numeric_limits<int>::min() <= __l
144*f8a1b7d9SAlexander Kabaev 	      && __l <= numeric_limits<int>::max())
14500db7afdSDavid E. O'Brien 	    __n = __l;
14600db7afdSDavid E. O'Brien 	  else
147*f8a1b7d9SAlexander Kabaev 	    this->setstate(ios_base::failbit);
14800db7afdSDavid E. O'Brien 	}
14900db7afdSDavid E. O'Brien       return *this;
15000db7afdSDavid E. O'Brien     }
15100db7afdSDavid E. O'Brien 
15200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
15300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
15400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
operator >>(__streambuf_type * __sbout)15500db7afdSDavid E. O'Brien     operator>>(__streambuf_type* __sbout)
15600db7afdSDavid E. O'Brien     {
157ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
15800db7afdSDavid E. O'Brien       sentry __cerb(*this, false);
159ffeaf689SAlexander Kabaev       if (__cerb && __sbout)
16000db7afdSDavid E. O'Brien 	{
16100db7afdSDavid E. O'Brien 	  try
16200db7afdSDavid E. O'Brien 	    {
163*f8a1b7d9SAlexander Kabaev 	      bool __ineof;
164*f8a1b7d9SAlexander Kabaev 	      if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
165ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
166*f8a1b7d9SAlexander Kabaev 	      if (__ineof)
167*f8a1b7d9SAlexander Kabaev 		__err |= ios_base::eofbit;
16800db7afdSDavid E. O'Brien 	    }
1691b86b14eSAlexander Kabaev 	  catch(...)
170ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::failbit); }
17100db7afdSDavid E. O'Brien 	}
172ffeaf689SAlexander Kabaev       else if (!__sbout)
173ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
174ffeaf689SAlexander Kabaev       if (__err)
175ffeaf689SAlexander Kabaev 	this->setstate(__err);
17600db7afdSDavid E. O'Brien       return *this;
17700db7afdSDavid E. O'Brien     }
17800db7afdSDavid E. O'Brien 
17900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
18000db7afdSDavid E. O'Brien     typename basic_istream<_CharT, _Traits>::int_type
18100db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
get(void)18200db7afdSDavid E. O'Brien     get(void)
18300db7afdSDavid E. O'Brien     {
18400db7afdSDavid E. O'Brien       const int_type __eof = traits_type::eof();
18500db7afdSDavid E. O'Brien       int_type __c = __eof;
18600db7afdSDavid E. O'Brien       _M_gcount = 0;
187ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
18800db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
18900db7afdSDavid E. O'Brien       if (__cerb)
19000db7afdSDavid E. O'Brien 	{
19100db7afdSDavid E. O'Brien 	  try
19200db7afdSDavid E. O'Brien 	    {
19300db7afdSDavid E. O'Brien 	      __c = this->rdbuf()->sbumpc();
19400db7afdSDavid E. O'Brien 	      // 27.6.1.1 paragraph 3
195ca6500fcSAlexander Kabaev 	      if (!traits_type::eq_int_type(__c, __eof))
19600db7afdSDavid E. O'Brien 		_M_gcount = 1;
19700db7afdSDavid E. O'Brien 	      else
198ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
19900db7afdSDavid E. O'Brien 	    }
2001b86b14eSAlexander Kabaev 	  catch(...)
201ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
20200db7afdSDavid E. O'Brien 	}
203ffeaf689SAlexander Kabaev       if (!_M_gcount)
204ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
205ffeaf689SAlexander Kabaev       if (__err)
206ffeaf689SAlexander Kabaev 	this->setstate(__err);
20700db7afdSDavid E. O'Brien       return __c;
20800db7afdSDavid E. O'Brien     }
20900db7afdSDavid E. O'Brien 
21000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
21100db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
21200db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
get(char_type & __c)21300db7afdSDavid E. O'Brien     get(char_type& __c)
21400db7afdSDavid E. O'Brien     {
21500db7afdSDavid E. O'Brien       _M_gcount = 0;
216ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
21700db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
21800db7afdSDavid E. O'Brien       if (__cerb)
21900db7afdSDavid E. O'Brien 	{
22000db7afdSDavid E. O'Brien 	  try
22100db7afdSDavid E. O'Brien 	    {
222ffeaf689SAlexander Kabaev 	      const int_type __cb = this->rdbuf()->sbumpc();
22300db7afdSDavid E. O'Brien 	      // 27.6.1.1 paragraph 3
224ffeaf689SAlexander Kabaev 	      if (!traits_type::eq_int_type(__cb, traits_type::eof()))
22500db7afdSDavid E. O'Brien 		{
22600db7afdSDavid E. O'Brien 		  _M_gcount = 1;
227ffeaf689SAlexander Kabaev 		  __c = traits_type::to_char_type(__cb);
22800db7afdSDavid E. O'Brien 		}
22900db7afdSDavid E. O'Brien 	      else
230ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
23100db7afdSDavid E. O'Brien 	    }
2321b86b14eSAlexander Kabaev 	  catch(...)
233ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
23400db7afdSDavid E. O'Brien 	}
235ffeaf689SAlexander Kabaev       if (!_M_gcount)
236ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
237ffeaf689SAlexander Kabaev       if (__err)
238ffeaf689SAlexander Kabaev 	this->setstate(__err);
23900db7afdSDavid E. O'Brien       return *this;
24000db7afdSDavid E. O'Brien     }
24100db7afdSDavid E. O'Brien 
24200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
24300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
24400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
get(char_type * __s,streamsize __n,char_type __delim)24500db7afdSDavid E. O'Brien     get(char_type* __s, streamsize __n, char_type __delim)
24600db7afdSDavid E. O'Brien     {
24700db7afdSDavid E. O'Brien       _M_gcount = 0;
248ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
24900db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
25000db7afdSDavid E. O'Brien       if (__cerb)
25100db7afdSDavid E. O'Brien 	{
25200db7afdSDavid E. O'Brien 	  try
25300db7afdSDavid E. O'Brien 	    {
25400db7afdSDavid E. O'Brien 	      const int_type __idelim = traits_type::to_int_type(__delim);
25500db7afdSDavid E. O'Brien 	      const int_type __eof = traits_type::eof();
25600db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = this->rdbuf();
25700db7afdSDavid E. O'Brien 	      int_type __c = __sb->sgetc();
25800db7afdSDavid E. O'Brien 
259ca6500fcSAlexander Kabaev 	      while (_M_gcount + 1 < __n
260ca6500fcSAlexander Kabaev 		     && !traits_type::eq_int_type(__c, __eof)
261ca6500fcSAlexander Kabaev 		     && !traits_type::eq_int_type(__c, __idelim))
26200db7afdSDavid E. O'Brien 		{
26300db7afdSDavid E. O'Brien 		  *__s++ = traits_type::to_char_type(__c);
26400db7afdSDavid E. O'Brien 		  ++_M_gcount;
265ffeaf689SAlexander Kabaev 		  __c = __sb->snextc();
26600db7afdSDavid E. O'Brien 		}
267ca6500fcSAlexander Kabaev 	      if (traits_type::eq_int_type(__c, __eof))
268ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
26900db7afdSDavid E. O'Brien 	    }
2701b86b14eSAlexander Kabaev 	  catch(...)
271ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
27200db7afdSDavid E. O'Brien 	}
273*f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
274*f8a1b7d9SAlexander Kabaev       // 243. get and getline when sentry reports failure.
275*f8a1b7d9SAlexander Kabaev       if (__n > 0)
27600db7afdSDavid E. O'Brien 	*__s = char_type();
27700db7afdSDavid E. O'Brien       if (!_M_gcount)
278ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
279ffeaf689SAlexander Kabaev       if (__err)
280ffeaf689SAlexander Kabaev 	this->setstate(__err);
28100db7afdSDavid E. O'Brien       return *this;
28200db7afdSDavid E. O'Brien     }
28300db7afdSDavid E. O'Brien 
28400db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
28500db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
28600db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
get(__streambuf_type & __sb,char_type __delim)28700db7afdSDavid E. O'Brien     get(__streambuf_type& __sb, char_type __delim)
28800db7afdSDavid E. O'Brien     {
28900db7afdSDavid E. O'Brien       _M_gcount = 0;
290ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
29100db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
29200db7afdSDavid E. O'Brien       if (__cerb)
29300db7afdSDavid E. O'Brien 	{
29400db7afdSDavid E. O'Brien 	  try
29500db7afdSDavid E. O'Brien 	    {
29600db7afdSDavid E. O'Brien 	      const int_type __idelim = traits_type::to_int_type(__delim);
29700db7afdSDavid E. O'Brien 	      const int_type __eof = traits_type::eof();
29800db7afdSDavid E. O'Brien 	      __streambuf_type* __this_sb = this->rdbuf();
29900db7afdSDavid E. O'Brien 	      int_type __c = __this_sb->sgetc();
300ca6500fcSAlexander Kabaev 	      char_type __c2 = traits_type::to_char_type(__c);
30100db7afdSDavid E. O'Brien 
302ca6500fcSAlexander Kabaev 	      while (!traits_type::eq_int_type(__c, __eof)
303ca6500fcSAlexander Kabaev 		     && !traits_type::eq_int_type(__c, __idelim)
304ca6500fcSAlexander Kabaev 		     && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
30500db7afdSDavid E. O'Brien 		{
30600db7afdSDavid E. O'Brien 		  ++_M_gcount;
30700db7afdSDavid E. O'Brien 		  __c = __this_sb->snextc();
308ca6500fcSAlexander Kabaev 		  __c2 = traits_type::to_char_type(__c);
30900db7afdSDavid E. O'Brien 		}
310ca6500fcSAlexander Kabaev 	      if (traits_type::eq_int_type(__c, __eof))
311ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
31200db7afdSDavid E. O'Brien 	    }
3131b86b14eSAlexander Kabaev 	  catch(...)
314ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
31500db7afdSDavid E. O'Brien 	}
31600db7afdSDavid E. O'Brien       if (!_M_gcount)
317ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
318ffeaf689SAlexander Kabaev       if (__err)
319ffeaf689SAlexander Kabaev 	this->setstate(__err);
32000db7afdSDavid E. O'Brien       return *this;
32100db7afdSDavid E. O'Brien     }
32200db7afdSDavid E. O'Brien 
32300db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
32400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
32500db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
getline(char_type * __s,streamsize __n,char_type __delim)32600db7afdSDavid E. O'Brien     getline(char_type* __s, streamsize __n, char_type __delim)
32700db7afdSDavid E. O'Brien     {
32800db7afdSDavid E. O'Brien       _M_gcount = 0;
329ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
33000db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
33100db7afdSDavid E. O'Brien       if (__cerb)
33200db7afdSDavid E. O'Brien         {
33300db7afdSDavid E. O'Brien           try
33400db7afdSDavid E. O'Brien             {
33500db7afdSDavid E. O'Brien               const int_type __idelim = traits_type::to_int_type(__delim);
33600db7afdSDavid E. O'Brien               const int_type __eof = traits_type::eof();
33700db7afdSDavid E. O'Brien               __streambuf_type* __sb = this->rdbuf();
33800db7afdSDavid E. O'Brien               int_type __c = __sb->sgetc();
33900db7afdSDavid E. O'Brien 
340ca6500fcSAlexander Kabaev               while (_M_gcount + 1 < __n
341ca6500fcSAlexander Kabaev                      && !traits_type::eq_int_type(__c, __eof)
342ca6500fcSAlexander Kabaev                      && !traits_type::eq_int_type(__c, __idelim))
34300db7afdSDavid E. O'Brien                 {
34400db7afdSDavid E. O'Brien                   *__s++ = traits_type::to_char_type(__c);
34500db7afdSDavid E. O'Brien                   __c = __sb->snextc();
346*f8a1b7d9SAlexander Kabaev                   ++_M_gcount;
34700db7afdSDavid E. O'Brien                 }
348ca6500fcSAlexander Kabaev               if (traits_type::eq_int_type(__c, __eof))
349ffeaf689SAlexander Kabaev                 __err |= ios_base::eofbit;
350*f8a1b7d9SAlexander Kabaev               else
35100db7afdSDavid E. O'Brien                 {
352*f8a1b7d9SAlexander Kabaev                   if (traits_type::eq_int_type(__c, __idelim))
353*f8a1b7d9SAlexander Kabaev                     {
354ffeaf689SAlexander Kabaev                       __sb->sbumpc();
355*f8a1b7d9SAlexander Kabaev                       ++_M_gcount;
35600db7afdSDavid E. O'Brien                     }
35700db7afdSDavid E. O'Brien                   else
358ffeaf689SAlexander Kabaev                     __err |= ios_base::failbit;
35900db7afdSDavid E. O'Brien                 }
360*f8a1b7d9SAlexander Kabaev             }
3611b86b14eSAlexander Kabaev           catch(...)
362ffeaf689SAlexander Kabaev             { this->_M_setstate(ios_base::badbit); }
36300db7afdSDavid E. O'Brien         }
364*f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
365*f8a1b7d9SAlexander Kabaev       // 243. get and getline when sentry reports failure.
366*f8a1b7d9SAlexander Kabaev       if (__n > 0)
36700db7afdSDavid E. O'Brien 	*__s = char_type();
36800db7afdSDavid E. O'Brien       if (!_M_gcount)
369ffeaf689SAlexander Kabaev         __err |= ios_base::failbit;
370ffeaf689SAlexander Kabaev       if (__err)
371ffeaf689SAlexander Kabaev         this->setstate(__err);
37200db7afdSDavid E. O'Brien       return *this;
37300db7afdSDavid E. O'Brien     }
37400db7afdSDavid E. O'Brien 
375*f8a1b7d9SAlexander Kabaev   // We provide three overloads, since the first two are much simpler
376*f8a1b7d9SAlexander Kabaev   // than the general case. Also, the latter two can thus adopt the
377*f8a1b7d9SAlexander Kabaev   // same "batchy" strategy used by getline above.
378*f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits>
379*f8a1b7d9SAlexander Kabaev     basic_istream<_CharT, _Traits>&
380*f8a1b7d9SAlexander Kabaev     basic_istream<_CharT, _Traits>::
ignore(void)381*f8a1b7d9SAlexander Kabaev     ignore(void)
382*f8a1b7d9SAlexander Kabaev     {
383*f8a1b7d9SAlexander Kabaev       _M_gcount = 0;
384*f8a1b7d9SAlexander Kabaev       sentry __cerb(*this, true);
385*f8a1b7d9SAlexander Kabaev       if (__cerb)
386*f8a1b7d9SAlexander Kabaev 	{
387*f8a1b7d9SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
388*f8a1b7d9SAlexander Kabaev 	  try
389*f8a1b7d9SAlexander Kabaev 	    {
390*f8a1b7d9SAlexander Kabaev 	      const int_type __eof = traits_type::eof();
391*f8a1b7d9SAlexander Kabaev 	      __streambuf_type* __sb = this->rdbuf();
392*f8a1b7d9SAlexander Kabaev 
393*f8a1b7d9SAlexander Kabaev 	      if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
394*f8a1b7d9SAlexander Kabaev 		__err |= ios_base::eofbit;
395*f8a1b7d9SAlexander Kabaev 	      else
396*f8a1b7d9SAlexander Kabaev 		_M_gcount = 1;
397*f8a1b7d9SAlexander Kabaev 	    }
398*f8a1b7d9SAlexander Kabaev 	  catch(...)
399*f8a1b7d9SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
400*f8a1b7d9SAlexander Kabaev 	  if (__err)
401*f8a1b7d9SAlexander Kabaev 	    this->setstate(__err);
402*f8a1b7d9SAlexander Kabaev 	}
403*f8a1b7d9SAlexander Kabaev       return *this;
404*f8a1b7d9SAlexander Kabaev     }
405*f8a1b7d9SAlexander Kabaev 
406*f8a1b7d9SAlexander Kabaev   template<typename _CharT, typename _Traits>
407*f8a1b7d9SAlexander Kabaev     basic_istream<_CharT, _Traits>&
408*f8a1b7d9SAlexander Kabaev     basic_istream<_CharT, _Traits>::
ignore(streamsize __n)409*f8a1b7d9SAlexander Kabaev     ignore(streamsize __n)
410*f8a1b7d9SAlexander Kabaev     {
411*f8a1b7d9SAlexander Kabaev       _M_gcount = 0;
412*f8a1b7d9SAlexander Kabaev       sentry __cerb(*this, true);
413*f8a1b7d9SAlexander Kabaev       if (__cerb && __n > 0)
414*f8a1b7d9SAlexander Kabaev         {
415*f8a1b7d9SAlexander Kabaev           ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
416*f8a1b7d9SAlexander Kabaev           try
417*f8a1b7d9SAlexander Kabaev             {
418*f8a1b7d9SAlexander Kabaev               const int_type __eof = traits_type::eof();
419*f8a1b7d9SAlexander Kabaev               __streambuf_type* __sb = this->rdbuf();
420*f8a1b7d9SAlexander Kabaev               int_type __c = __sb->sgetc();
421*f8a1b7d9SAlexander Kabaev 
422*f8a1b7d9SAlexander Kabaev 	      // N.B. On LFS-enabled platforms streamsize is still 32 bits
423*f8a1b7d9SAlexander Kabaev 	      // wide: if we want to implement the standard mandated behavior
424*f8a1b7d9SAlexander Kabaev 	      // for n == max() (see 27.6.1.3/24) we are at risk of signed
425*f8a1b7d9SAlexander Kabaev 	      // integer overflow: thus these contortions. Also note that,
426*f8a1b7d9SAlexander Kabaev 	      // by definition, when more than 2G chars are actually ignored,
427*f8a1b7d9SAlexander Kabaev 	      // _M_gcount (the return value of gcount, that is) cannot be
428*f8a1b7d9SAlexander Kabaev 	      // really correct, being unavoidably too small.
429*f8a1b7d9SAlexander Kabaev 	      bool __large_ignore = false;
430*f8a1b7d9SAlexander Kabaev 	      while (true)
431*f8a1b7d9SAlexander Kabaev 		{
432*f8a1b7d9SAlexander Kabaev 		  while (_M_gcount < __n
433*f8a1b7d9SAlexander Kabaev 			 && !traits_type::eq_int_type(__c, __eof))
434*f8a1b7d9SAlexander Kabaev 		    {
435*f8a1b7d9SAlexander Kabaev 		      ++_M_gcount;
436*f8a1b7d9SAlexander Kabaev 		      __c = __sb->snextc();
437*f8a1b7d9SAlexander Kabaev 		    }
438*f8a1b7d9SAlexander Kabaev 		  if (__n == numeric_limits<streamsize>::max()
439*f8a1b7d9SAlexander Kabaev 		      && !traits_type::eq_int_type(__c, __eof))
440*f8a1b7d9SAlexander Kabaev 		    {
441*f8a1b7d9SAlexander Kabaev 		      _M_gcount = numeric_limits<streamsize>::min();
442*f8a1b7d9SAlexander Kabaev 		      __large_ignore = true;
443*f8a1b7d9SAlexander Kabaev 		    }
444*f8a1b7d9SAlexander Kabaev 		  else
445*f8a1b7d9SAlexander Kabaev 		    break;
446*f8a1b7d9SAlexander Kabaev 		}
447*f8a1b7d9SAlexander Kabaev 
448*f8a1b7d9SAlexander Kabaev 	      if (__large_ignore)
449*f8a1b7d9SAlexander Kabaev 		_M_gcount = numeric_limits<streamsize>::max();
450*f8a1b7d9SAlexander Kabaev 
451*f8a1b7d9SAlexander Kabaev 	      if (traits_type::eq_int_type(__c, __eof))
452*f8a1b7d9SAlexander Kabaev                 __err |= ios_base::eofbit;
453*f8a1b7d9SAlexander Kabaev             }
454*f8a1b7d9SAlexander Kabaev           catch(...)
455*f8a1b7d9SAlexander Kabaev             { this->_M_setstate(ios_base::badbit); }
456*f8a1b7d9SAlexander Kabaev           if (__err)
457*f8a1b7d9SAlexander Kabaev             this->setstate(__err);
458*f8a1b7d9SAlexander Kabaev         }
459*f8a1b7d9SAlexander Kabaev       return *this;
460*f8a1b7d9SAlexander Kabaev     }
461*f8a1b7d9SAlexander Kabaev 
46200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
46300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
46400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
ignore(streamsize __n,int_type __delim)46500db7afdSDavid E. O'Brien     ignore(streamsize __n, int_type __delim)
46600db7afdSDavid E. O'Brien     {
46700db7afdSDavid E. O'Brien       _M_gcount = 0;
46800db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
469ca6500fcSAlexander Kabaev       if (__cerb && __n > 0)
47000db7afdSDavid E. O'Brien         {
471ffeaf689SAlexander Kabaev           ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
47200db7afdSDavid E. O'Brien           try
47300db7afdSDavid E. O'Brien             {
47400db7afdSDavid E. O'Brien               const int_type __eof = traits_type::eof();
47500db7afdSDavid E. O'Brien               __streambuf_type* __sb = this->rdbuf();
476*f8a1b7d9SAlexander Kabaev               int_type __c = __sb->sgetc();
47700db7afdSDavid E. O'Brien 
478*f8a1b7d9SAlexander Kabaev 	      // See comment above.
479*f8a1b7d9SAlexander Kabaev 	      bool __large_ignore = false;
480*f8a1b7d9SAlexander Kabaev 	      while (true)
481*f8a1b7d9SAlexander Kabaev 		{
482*f8a1b7d9SAlexander Kabaev 		  while (_M_gcount < __n
483*f8a1b7d9SAlexander Kabaev 			 && !traits_type::eq_int_type(__c, __eof)
484*f8a1b7d9SAlexander Kabaev 			 && !traits_type::eq_int_type(__c, __delim))
48500db7afdSDavid E. O'Brien 		    {
48600db7afdSDavid E. O'Brien 		      ++_M_gcount;
487*f8a1b7d9SAlexander Kabaev 		      __c = __sb->snextc();
488*f8a1b7d9SAlexander Kabaev 		    }
489*f8a1b7d9SAlexander Kabaev 		  if (__n == numeric_limits<streamsize>::max()
490*f8a1b7d9SAlexander Kabaev 		      && !traits_type::eq_int_type(__c, __eof)
491*f8a1b7d9SAlexander Kabaev 		      && !traits_type::eq_int_type(__c, __delim))
492*f8a1b7d9SAlexander Kabaev 		    {
493*f8a1b7d9SAlexander Kabaev 		      _M_gcount = numeric_limits<streamsize>::min();
494*f8a1b7d9SAlexander Kabaev 		      __large_ignore = true;
495*f8a1b7d9SAlexander Kabaev 		    }
496*f8a1b7d9SAlexander Kabaev 		  else
497ca6500fcSAlexander Kabaev 		    break;
49800db7afdSDavid E. O'Brien 		}
499*f8a1b7d9SAlexander Kabaev 
500*f8a1b7d9SAlexander Kabaev 	      if (__large_ignore)
501*f8a1b7d9SAlexander Kabaev 		_M_gcount = numeric_limits<streamsize>::max();
502*f8a1b7d9SAlexander Kabaev 
503ca6500fcSAlexander Kabaev               if (traits_type::eq_int_type(__c, __eof))
504ffeaf689SAlexander Kabaev                 __err |= ios_base::eofbit;
505*f8a1b7d9SAlexander Kabaev 	      else if (traits_type::eq_int_type(__c, __delim))
506*f8a1b7d9SAlexander Kabaev 		{
507*f8a1b7d9SAlexander Kabaev 		  if (_M_gcount < numeric_limits<streamsize>::max())
508*f8a1b7d9SAlexander Kabaev 		    ++_M_gcount;
509*f8a1b7d9SAlexander Kabaev 		  __sb->sbumpc();
510*f8a1b7d9SAlexander Kabaev 		}
51100db7afdSDavid E. O'Brien             }
5121b86b14eSAlexander Kabaev           catch(...)
513ffeaf689SAlexander Kabaev             { this->_M_setstate(ios_base::badbit); }
514ffeaf689SAlexander Kabaev           if (__err)
515ffeaf689SAlexander Kabaev             this->setstate(__err);
51600db7afdSDavid E. O'Brien         }
51700db7afdSDavid E. O'Brien       return *this;
51800db7afdSDavid E. O'Brien     }
51900db7afdSDavid E. O'Brien 
52000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
52100db7afdSDavid E. O'Brien     typename basic_istream<_CharT, _Traits>::int_type
52200db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
peek(void)52300db7afdSDavid E. O'Brien     peek(void)
52400db7afdSDavid E. O'Brien     {
52500db7afdSDavid E. O'Brien       int_type __c = traits_type::eof();
52600db7afdSDavid E. O'Brien       _M_gcount = 0;
52700db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
52800db7afdSDavid E. O'Brien       if (__cerb)
52900db7afdSDavid E. O'Brien 	{
530ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
53100db7afdSDavid E. O'Brien 	  try
532bbe4dd5dSAlexander Kabaev 	    {
533bbe4dd5dSAlexander Kabaev 	      __c = this->rdbuf()->sgetc();
534bbe4dd5dSAlexander Kabaev 	      if (traits_type::eq_int_type(__c, traits_type::eof()))
535ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
536bbe4dd5dSAlexander Kabaev 	    }
5371b86b14eSAlexander Kabaev 	  catch(...)
538ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
539ffeaf689SAlexander Kabaev 	  if (__err)
540ffeaf689SAlexander Kabaev 	    this->setstate(__err);
54100db7afdSDavid E. O'Brien 	}
54200db7afdSDavid E. O'Brien       return __c;
54300db7afdSDavid E. O'Brien     }
54400db7afdSDavid E. O'Brien 
54500db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
54600db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
54700db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
read(char_type * __s,streamsize __n)54800db7afdSDavid E. O'Brien     read(char_type* __s, streamsize __n)
54900db7afdSDavid E. O'Brien     {
55000db7afdSDavid E. O'Brien       _M_gcount = 0;
55100db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
55200db7afdSDavid E. O'Brien       if (__cerb)
55300db7afdSDavid E. O'Brien 	{
554ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
55500db7afdSDavid E. O'Brien 	  try
55600db7afdSDavid E. O'Brien 	    {
55700db7afdSDavid E. O'Brien 	      _M_gcount = this->rdbuf()->sgetn(__s, __n);
55800db7afdSDavid E. O'Brien 	      if (_M_gcount != __n)
559ffeaf689SAlexander Kabaev 		__err |= (ios_base::eofbit | ios_base::failbit);
56000db7afdSDavid E. O'Brien 	    }
5611b86b14eSAlexander Kabaev 	  catch(...)
562ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
563ffeaf689SAlexander Kabaev 	  if (__err)
564ffeaf689SAlexander Kabaev 	    this->setstate(__err);
56500db7afdSDavid E. O'Brien 	}
56600db7afdSDavid E. O'Brien       return *this;
56700db7afdSDavid E. O'Brien     }
56800db7afdSDavid E. O'Brien 
56900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
57000db7afdSDavid E. O'Brien     streamsize
57100db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
readsome(char_type * __s,streamsize __n)57200db7afdSDavid E. O'Brien     readsome(char_type* __s, streamsize __n)
57300db7afdSDavid E. O'Brien     {
57400db7afdSDavid E. O'Brien       _M_gcount = 0;
57500db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
57600db7afdSDavid E. O'Brien       if (__cerb)
57700db7afdSDavid E. O'Brien 	{
578ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
57900db7afdSDavid E. O'Brien 	  try
58000db7afdSDavid E. O'Brien 	    {
5818f1134fbSDavid E. O'Brien 	      // Cannot compare int_type with streamsize generically.
582ffeaf689SAlexander Kabaev 	      const streamsize __num = this->rdbuf()->in_avail();
583ffeaf689SAlexander Kabaev 	      if (__num > 0)
584ffeaf689SAlexander Kabaev 		_M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
585ffeaf689SAlexander Kabaev 	      else if (__num == -1)
586ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
58700db7afdSDavid E. O'Brien 	    }
5881b86b14eSAlexander Kabaev 	  catch(...)
589ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
590ffeaf689SAlexander Kabaev 	  if (__err)
591ffeaf689SAlexander Kabaev 	    this->setstate(__err);
59200db7afdSDavid E. O'Brien 	}
59300db7afdSDavid E. O'Brien       return _M_gcount;
59400db7afdSDavid E. O'Brien     }
59500db7afdSDavid E. O'Brien 
59600db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
59700db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
59800db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
putback(char_type __c)59900db7afdSDavid E. O'Brien     putback(char_type __c)
60000db7afdSDavid E. O'Brien     {
601ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
6021b86b14eSAlexander Kabaev       // 60. What is a formatted input function?
6031b86b14eSAlexander Kabaev       _M_gcount = 0;
60400db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
60500db7afdSDavid E. O'Brien       if (__cerb)
60600db7afdSDavid E. O'Brien 	{
607ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
60800db7afdSDavid E. O'Brien 	  try
60900db7afdSDavid E. O'Brien 	    {
61000db7afdSDavid E. O'Brien 	      const int_type __eof = traits_type::eof();
61100db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = this->rdbuf();
612ca6500fcSAlexander Kabaev 	      if (!__sb
613ca6500fcSAlexander Kabaev 		  || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
614ffeaf689SAlexander Kabaev 		__err |= ios_base::badbit;
61500db7afdSDavid E. O'Brien 	    }
6161b86b14eSAlexander Kabaev 	  catch(...)
617ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
618ffeaf689SAlexander Kabaev 	  if (__err)
619ffeaf689SAlexander Kabaev 	    this->setstate(__err);
62000db7afdSDavid E. O'Brien 	}
62100db7afdSDavid E. O'Brien       return *this;
62200db7afdSDavid E. O'Brien     }
62300db7afdSDavid E. O'Brien 
62400db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
62500db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
62600db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
unget(void)62700db7afdSDavid E. O'Brien     unget(void)
62800db7afdSDavid E. O'Brien     {
629ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
6301b86b14eSAlexander Kabaev       // 60. What is a formatted input function?
63100db7afdSDavid E. O'Brien       _M_gcount = 0;
63200db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
63300db7afdSDavid E. O'Brien       if (__cerb)
63400db7afdSDavid E. O'Brien 	{
635ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
63600db7afdSDavid E. O'Brien 	  try
63700db7afdSDavid E. O'Brien 	    {
63800db7afdSDavid E. O'Brien 	      const int_type __eof = traits_type::eof();
63900db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = this->rdbuf();
640ca6500fcSAlexander Kabaev 	      if (!__sb
641ca6500fcSAlexander Kabaev 		  || traits_type::eq_int_type(__sb->sungetc(), __eof))
642ffeaf689SAlexander Kabaev 		__err |= ios_base::badbit;
64300db7afdSDavid E. O'Brien 	    }
6441b86b14eSAlexander Kabaev 	  catch(...)
645ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
646ffeaf689SAlexander Kabaev 	  if (__err)
647ffeaf689SAlexander Kabaev 	    this->setstate(__err);
64800db7afdSDavid E. O'Brien 	}
64900db7afdSDavid E. O'Brien       return *this;
65000db7afdSDavid E. O'Brien     }
65100db7afdSDavid E. O'Brien 
65200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
65300db7afdSDavid E. O'Brien     int
65400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
sync(void)65500db7afdSDavid E. O'Brien     sync(void)
65600db7afdSDavid E. O'Brien     {
657ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
6581b86b14eSAlexander Kabaev       // DR60.  Do not change _M_gcount.
659ca6500fcSAlexander Kabaev       int __ret = -1;
66000db7afdSDavid E. O'Brien       sentry __cerb(*this, true);
66100db7afdSDavid E. O'Brien       if (__cerb)
66200db7afdSDavid E. O'Brien 	{
663ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
66400db7afdSDavid E. O'Brien 	  try
66500db7afdSDavid E. O'Brien 	    {
66600db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = this->rdbuf();
667ca6500fcSAlexander Kabaev 	      if (__sb)
668ca6500fcSAlexander Kabaev 		{
669ca6500fcSAlexander Kabaev 		  if (__sb->pubsync() == -1)
670ffeaf689SAlexander Kabaev 		    __err |= ios_base::badbit;
67100db7afdSDavid E. O'Brien 		  else
67200db7afdSDavid E. O'Brien 		    __ret = 0;
67300db7afdSDavid E. O'Brien 		}
674ca6500fcSAlexander Kabaev 	    }
6751b86b14eSAlexander Kabaev 	  catch(...)
676ffeaf689SAlexander Kabaev 	    { this->_M_setstate(ios_base::badbit); }
677ffeaf689SAlexander Kabaev 	  if (__err)
678ffeaf689SAlexander Kabaev 	    this->setstate(__err);
67900db7afdSDavid E. O'Brien 	}
68000db7afdSDavid E. O'Brien       return __ret;
68100db7afdSDavid E. O'Brien     }
68200db7afdSDavid E. O'Brien 
68300db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
68400db7afdSDavid E. O'Brien     typename basic_istream<_CharT, _Traits>::pos_type
68500db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
tellg(void)68600db7afdSDavid E. O'Brien     tellg(void)
68700db7afdSDavid E. O'Brien     {
688ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
6891b86b14eSAlexander Kabaev       // DR60.  Do not change _M_gcount.
69000db7afdSDavid E. O'Brien       pos_type __ret = pos_type(-1);
691ffeaf689SAlexander Kabaev       try
692ffeaf689SAlexander Kabaev 	{
6938f1134fbSDavid E. O'Brien 	  if (!this->fail())
694*f8a1b7d9SAlexander Kabaev 	    __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
695*f8a1b7d9SAlexander Kabaev 					      ios_base::in);
696ffeaf689SAlexander Kabaev 	}
697ffeaf689SAlexander Kabaev       catch(...)
698ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
69900db7afdSDavid E. O'Brien       return __ret;
70000db7afdSDavid E. O'Brien     }
70100db7afdSDavid E. O'Brien 
70200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
70300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
70400db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
seekg(pos_type __pos)70500db7afdSDavid E. O'Brien     seekg(pos_type __pos)
70600db7afdSDavid E. O'Brien     {
707ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
7081b86b14eSAlexander Kabaev       // DR60.  Do not change _M_gcount.
709ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
710ffeaf689SAlexander Kabaev       try
711ffeaf689SAlexander Kabaev 	{
7128f1134fbSDavid E. O'Brien 	  if (!this->fail())
71300db7afdSDavid E. O'Brien 	    {
71400db7afdSDavid E. O'Brien 	      // 136.  seekp, seekg setting wrong streams?
715ffeaf689SAlexander Kabaev 	      const pos_type __p = this->rdbuf()->pubseekpos(__pos,
716ffeaf689SAlexander Kabaev 							     ios_base::in);
71700db7afdSDavid E. O'Brien 
71800db7afdSDavid E. O'Brien 	      // 129.  Need error indication from seekp() and seekg()
719ffeaf689SAlexander Kabaev 	      if (__p == pos_type(off_type(-1)))
720ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
72100db7afdSDavid E. O'Brien 	    }
722ffeaf689SAlexander Kabaev 	}
723ffeaf689SAlexander Kabaev       catch(...)
724ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
725ffeaf689SAlexander Kabaev       if (__err)
726ffeaf689SAlexander Kabaev 	this->setstate(__err);
72700db7afdSDavid E. O'Brien       return *this;
72800db7afdSDavid E. O'Brien     }
72900db7afdSDavid E. O'Brien 
73000db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
73100db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
73200db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>::
seekg(off_type __off,ios_base::seekdir __dir)73300db7afdSDavid E. O'Brien     seekg(off_type __off, ios_base::seekdir __dir)
73400db7afdSDavid E. O'Brien     {
735ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
7361b86b14eSAlexander Kabaev       // DR60.  Do not change _M_gcount.
737ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
738ffeaf689SAlexander Kabaev       try
739ffeaf689SAlexander Kabaev 	{
7408f1134fbSDavid E. O'Brien 	  if (!this->fail())
74100db7afdSDavid E. O'Brien 	    {
74200db7afdSDavid E. O'Brien 	      // 136.  seekp, seekg setting wrong streams?
743ffeaf689SAlexander Kabaev 	      const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
74400db7afdSDavid E. O'Brien 							     ios_base::in);
74500db7afdSDavid E. O'Brien 
74600db7afdSDavid E. O'Brien 	      // 129.  Need error indication from seekp() and seekg()
747ffeaf689SAlexander Kabaev 	      if (__p == pos_type(off_type(-1)))
748ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
74900db7afdSDavid E. O'Brien 	    }
750ffeaf689SAlexander Kabaev 	}
751ffeaf689SAlexander Kabaev       catch(...)
752ffeaf689SAlexander Kabaev 	{ this->_M_setstate(ios_base::badbit); }
753ffeaf689SAlexander Kabaev       if (__err)
754ffeaf689SAlexander Kabaev 	this->setstate(__err);
75500db7afdSDavid E. O'Brien       return *this;
75600db7afdSDavid E. O'Brien     }
75700db7afdSDavid E. O'Brien 
75800db7afdSDavid E. O'Brien   // 27.6.1.2.3 Character extraction templates
75900db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
76000db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT & __c)76100db7afdSDavid E. O'Brien     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
76200db7afdSDavid E. O'Brien     {
76300db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
764ffeaf689SAlexander Kabaev       typedef typename __istream_type::int_type         __int_type;
765ffeaf689SAlexander Kabaev 
76600db7afdSDavid E. O'Brien       typename __istream_type::sentry __cerb(__in, false);
76700db7afdSDavid E. O'Brien       if (__cerb)
76800db7afdSDavid E. O'Brien 	{
769ffeaf689SAlexander Kabaev 	  ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
77000db7afdSDavid E. O'Brien 	  try
77100db7afdSDavid E. O'Brien 	    {
772ffeaf689SAlexander Kabaev 	      const __int_type __cb = __in.rdbuf()->sbumpc();
773ffeaf689SAlexander Kabaev 	      if (!_Traits::eq_int_type(__cb, _Traits::eof()))
774ffeaf689SAlexander Kabaev 		__c = _Traits::to_char_type(__cb);
77500db7afdSDavid E. O'Brien 	      else
776ffeaf689SAlexander Kabaev 		__err |= (ios_base::eofbit | ios_base::failbit);
777ffeaf689SAlexander Kabaev 	    }
778ffeaf689SAlexander Kabaev 	  catch(...)
779ffeaf689SAlexander Kabaev 	    { __in._M_setstate(ios_base::badbit); }
780ffeaf689SAlexander Kabaev 	  if (__err)
781ffeaf689SAlexander Kabaev 	    __in.setstate(__err);
782ffeaf689SAlexander Kabaev 	}
78300db7afdSDavid E. O'Brien       return __in;
78400db7afdSDavid E. O'Brien     }
78500db7afdSDavid E. O'Brien 
78600db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
78700db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT * __s)78800db7afdSDavid E. O'Brien     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
78900db7afdSDavid E. O'Brien     {
79000db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
79100db7afdSDavid E. O'Brien       typedef typename __istream_type::__streambuf_type __streambuf_type;
79200db7afdSDavid E. O'Brien       typedef typename _Traits::int_type		int_type;
79300db7afdSDavid E. O'Brien       typedef _CharT					char_type;
79400db7afdSDavid E. O'Brien       typedef ctype<_CharT>				__ctype_type;
79500db7afdSDavid E. O'Brien 
796ffeaf689SAlexander Kabaev       streamsize __extracted = 0;
797ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
79800db7afdSDavid E. O'Brien       typename __istream_type::sentry __cerb(__in, false);
79900db7afdSDavid E. O'Brien       if (__cerb)
80000db7afdSDavid E. O'Brien 	{
80100db7afdSDavid E. O'Brien 	  try
80200db7afdSDavid E. O'Brien 	    {
80300db7afdSDavid E. O'Brien 	      // Figure out how many characters to extract.
80400db7afdSDavid E. O'Brien 	      streamsize __num = __in.width();
8051b86b14eSAlexander Kabaev 	      if (__num <= 0)
80600db7afdSDavid E. O'Brien 		__num = numeric_limits<streamsize>::max();
80700db7afdSDavid E. O'Brien 
808ffeaf689SAlexander Kabaev 	      const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
809ffeaf689SAlexander Kabaev 
81000db7afdSDavid E. O'Brien 	      const int_type __eof = _Traits::eof();
81100db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = __in.rdbuf();
81200db7afdSDavid E. O'Brien 	      int_type __c = __sb->sgetc();
81300db7afdSDavid E. O'Brien 
81400db7afdSDavid E. O'Brien 	      while (__extracted < __num - 1
8158f1134fbSDavid E. O'Brien 		     && !_Traits::eq_int_type(__c, __eof)
816ffeaf689SAlexander Kabaev 		     && !__ct.is(ctype_base::space,
817ffeaf689SAlexander Kabaev 				 _Traits::to_char_type(__c)))
81800db7afdSDavid E. O'Brien 		{
8191b86b14eSAlexander Kabaev 		  *__s++ = _Traits::to_char_type(__c);
82000db7afdSDavid E. O'Brien 		  ++__extracted;
82100db7afdSDavid E. O'Brien 		  __c = __sb->snextc();
82200db7afdSDavid E. O'Brien 		}
8238f1134fbSDavid E. O'Brien 	      if (_Traits::eq_int_type(__c, __eof))
824ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
82500db7afdSDavid E. O'Brien 
826ffeaf689SAlexander Kabaev 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
82700db7afdSDavid E. O'Brien 	      // 68.  Extractors for char* should store null at end
82800db7afdSDavid E. O'Brien 	      *__s = char_type();
82900db7afdSDavid E. O'Brien 	      __in.width(0);
83000db7afdSDavid E. O'Brien 	    }
8311b86b14eSAlexander Kabaev 	  catch(...)
832ffeaf689SAlexander Kabaev 	    { __in._M_setstate(ios_base::badbit); }
83300db7afdSDavid E. O'Brien 	}
83400db7afdSDavid E. O'Brien       if (!__extracted)
835ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
836ffeaf689SAlexander Kabaev       if (__err)
837ffeaf689SAlexander Kabaev 	__in.setstate(__err);
83800db7afdSDavid E. O'Brien       return __in;
83900db7afdSDavid E. O'Brien     }
84000db7afdSDavid E. O'Brien 
84100db7afdSDavid E. O'Brien   // 27.6.1.4 Standard basic_istream manipulators
84200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits>
84300db7afdSDavid E. O'Brien     basic_istream<_CharT,_Traits>&
ws(basic_istream<_CharT,_Traits> & __in)84400db7afdSDavid E. O'Brien     ws(basic_istream<_CharT,_Traits>& __in)
84500db7afdSDavid E. O'Brien     {
84600db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
84700db7afdSDavid E. O'Brien       typedef typename __istream_type::__streambuf_type __streambuf_type;
84800db7afdSDavid E. O'Brien       typedef typename __istream_type::__ctype_type	__ctype_type;
84900db7afdSDavid E. O'Brien       typedef typename __istream_type::int_type		__int_type;
85000db7afdSDavid E. O'Brien 
851ffeaf689SAlexander Kabaev       const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
85200db7afdSDavid E. O'Brien       const __int_type __eof = _Traits::eof();
85300db7afdSDavid E. O'Brien       __streambuf_type* __sb = __in.rdbuf();
85400db7afdSDavid E. O'Brien       __int_type __c = __sb->sgetc();
85500db7afdSDavid E. O'Brien 
8568f1134fbSDavid E. O'Brien       while (!_Traits::eq_int_type(__c, __eof)
857ffeaf689SAlexander Kabaev 	     && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
85800db7afdSDavid E. O'Brien 	__c = __sb->snextc();
8598f1134fbSDavid E. O'Brien 
8608f1134fbSDavid E. O'Brien        if (_Traits::eq_int_type(__c, __eof))
86100db7afdSDavid E. O'Brien 	 __in.setstate(ios_base::eofbit);
86200db7afdSDavid E. O'Brien       return __in;
86300db7afdSDavid E. O'Brien     }
86400db7afdSDavid E. O'Brien 
86500db7afdSDavid E. O'Brien   // 21.3.7.9 basic_string::getline and operators
86600db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
86700db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,basic_string<_CharT,_Traits,_Alloc> & __str)86800db7afdSDavid E. O'Brien     operator>>(basic_istream<_CharT, _Traits>& __in,
86900db7afdSDavid E. O'Brien 	       basic_string<_CharT, _Traits, _Alloc>& __str)
87000db7afdSDavid E. O'Brien     {
87100db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
87200db7afdSDavid E. O'Brien       typedef typename __istream_type::int_type		__int_type;
87300db7afdSDavid E. O'Brien       typedef typename __istream_type::__streambuf_type __streambuf_type;
87400db7afdSDavid E. O'Brien       typedef typename __istream_type::__ctype_type	__ctype_type;
87500db7afdSDavid E. O'Brien       typedef basic_string<_CharT, _Traits, _Alloc>	__string_type;
87600db7afdSDavid E. O'Brien       typedef typename __string_type::size_type		__size_type;
87700db7afdSDavid E. O'Brien 
878ffeaf689SAlexander Kabaev       __size_type __extracted = 0;
879ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
88000db7afdSDavid E. O'Brien       typename __istream_type::sentry __cerb(__in, false);
88100db7afdSDavid E. O'Brien       if (__cerb)
88200db7afdSDavid E. O'Brien 	{
883ffeaf689SAlexander Kabaev 	  try
884ffeaf689SAlexander Kabaev 	    {
885ffeaf689SAlexander Kabaev 	      // Avoid reallocation for common case.
88600db7afdSDavid E. O'Brien 	      __str.erase();
887ffeaf689SAlexander Kabaev 	      _CharT __buf[128];
888ffeaf689SAlexander Kabaev 	      __size_type __len = 0;
889ffeaf689SAlexander Kabaev 	      const streamsize __w = __in.width();
890ffeaf689SAlexander Kabaev 	      const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
891ffeaf689SAlexander Kabaev 		                              : __str.max_size();
892ffeaf689SAlexander Kabaev 	      const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
89300db7afdSDavid E. O'Brien 	      const __int_type __eof = _Traits::eof();
89400db7afdSDavid E. O'Brien 	      __streambuf_type* __sb = __in.rdbuf();
89500db7afdSDavid E. O'Brien 	      __int_type __c = __sb->sgetc();
89600db7afdSDavid E. O'Brien 
89700db7afdSDavid E. O'Brien 	      while (__extracted < __n
8988f1134fbSDavid E. O'Brien 		     && !_Traits::eq_int_type(__c, __eof)
899ffeaf689SAlexander Kabaev 		     && !__ct.is(ctype_base::space, _Traits::to_char_type(__c)))
90000db7afdSDavid E. O'Brien 		{
901ffeaf689SAlexander Kabaev 		  if (__len == sizeof(__buf) / sizeof(_CharT))
902ffeaf689SAlexander Kabaev 		    {
903ffeaf689SAlexander Kabaev 		      __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
904ffeaf689SAlexander Kabaev 		      __len = 0;
905ffeaf689SAlexander Kabaev 		    }
906ffeaf689SAlexander Kabaev 		  __buf[__len++] = _Traits::to_char_type(__c);
90700db7afdSDavid E. O'Brien 		  ++__extracted;
90800db7afdSDavid E. O'Brien 		  __c = __sb->snextc();
90900db7afdSDavid E. O'Brien 		}
910ffeaf689SAlexander Kabaev 	      __str.append(__buf, __len);
911ffeaf689SAlexander Kabaev 
9128f1134fbSDavid E. O'Brien 	      if (_Traits::eq_int_type(__c, __eof))
913ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
91400db7afdSDavid E. O'Brien 	      __in.width(0);
91500db7afdSDavid E. O'Brien 	    }
916ffeaf689SAlexander Kabaev 	  catch(...)
917ffeaf689SAlexander Kabaev 	    {
918ffeaf689SAlexander Kabaev 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
919ffeaf689SAlexander Kabaev 	      // 91. Description of operator>> and getline() for string<>
920ffeaf689SAlexander Kabaev 	      // might cause endless loop
921ffeaf689SAlexander Kabaev 	      __in._M_setstate(ios_base::badbit);
922ffeaf689SAlexander Kabaev 	    }
923ffeaf689SAlexander Kabaev 	}
92400db7afdSDavid E. O'Brien       // 211.  operator>>(istream&, string&) doesn't set failbit
92500db7afdSDavid E. O'Brien       if (!__extracted)
926ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
927ffeaf689SAlexander Kabaev       if (__err)
928ffeaf689SAlexander Kabaev 	__in.setstate(__err);
92900db7afdSDavid E. O'Brien       return __in;
93000db7afdSDavid E. O'Brien     }
93100db7afdSDavid E. O'Brien 
93200db7afdSDavid E. O'Brien   template<typename _CharT, typename _Traits, typename _Alloc>
93300db7afdSDavid E. O'Brien     basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT,_Traits> & __in,basic_string<_CharT,_Traits,_Alloc> & __str,_CharT __delim)93400db7afdSDavid E. O'Brien     getline(basic_istream<_CharT, _Traits>& __in,
93500db7afdSDavid E. O'Brien 	    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
93600db7afdSDavid E. O'Brien     {
93700db7afdSDavid E. O'Brien       typedef basic_istream<_CharT, _Traits>		__istream_type;
93800db7afdSDavid E. O'Brien       typedef typename __istream_type::int_type		__int_type;
93900db7afdSDavid E. O'Brien       typedef typename __istream_type::__streambuf_type __streambuf_type;
94000db7afdSDavid E. O'Brien       typedef typename __istream_type::__ctype_type	__ctype_type;
94100db7afdSDavid E. O'Brien       typedef basic_string<_CharT, _Traits, _Alloc>	__string_type;
94200db7afdSDavid E. O'Brien       typedef typename __string_type::size_type		__size_type;
94300db7afdSDavid E. O'Brien 
94400db7afdSDavid E. O'Brien       __size_type __extracted = 0;
945ffeaf689SAlexander Kabaev       const __size_type __n = __str.max_size();
946ffeaf689SAlexander Kabaev       ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
94700db7afdSDavid E. O'Brien       typename __istream_type::sentry __cerb(__in, true);
94800db7afdSDavid E. O'Brien       if (__cerb)
94900db7afdSDavid E. O'Brien 	{
950ffeaf689SAlexander Kabaev 	  try
95100db7afdSDavid E. O'Brien 	    {
952ffeaf689SAlexander Kabaev 	      __str.erase();
953ffeaf689SAlexander Kabaev 	      const __int_type __idelim = _Traits::to_int_type(__delim);
954ffeaf689SAlexander Kabaev 	      const __int_type __eof = _Traits::eof();
955ffeaf689SAlexander Kabaev 	      __streambuf_type* __sb = __in.rdbuf();
956ffeaf689SAlexander Kabaev 	      __int_type __c = __sb->sgetc();
957ffeaf689SAlexander Kabaev 
958ffeaf689SAlexander Kabaev 	      while (__extracted < __n
959ffeaf689SAlexander Kabaev 		     && !_Traits::eq_int_type(__c, __eof)
960ffeaf689SAlexander Kabaev 		     && !_Traits::eq_int_type(__c, __idelim))
961ffeaf689SAlexander Kabaev 		{
962*f8a1b7d9SAlexander Kabaev 		  __str += _Traits::to_char_type(__c);
96300db7afdSDavid E. O'Brien 		  ++__extracted;
964ffeaf689SAlexander Kabaev 		  __c = __sb->snextc();
96500db7afdSDavid E. O'Brien 		}
966ffeaf689SAlexander Kabaev 
967ca6500fcSAlexander Kabaev 	      if (_Traits::eq_int_type(__c, __eof))
968ffeaf689SAlexander Kabaev 		__err |= ios_base::eofbit;
969ffeaf689SAlexander Kabaev 	      else if (_Traits::eq_int_type(__c, __idelim))
970ffeaf689SAlexander Kabaev 		{
971ffeaf689SAlexander Kabaev 		  ++__extracted;
972ffeaf689SAlexander Kabaev 		  __sb->sbumpc();
97300db7afdSDavid E. O'Brien 		}
974ffeaf689SAlexander Kabaev 	      else
975ffeaf689SAlexander Kabaev 		__err |= ios_base::failbit;
976ffeaf689SAlexander Kabaev 	    }
977ffeaf689SAlexander Kabaev 	  catch(...)
978ffeaf689SAlexander Kabaev 	    {
979ffeaf689SAlexander Kabaev 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
980ffeaf689SAlexander Kabaev 	      // 91. Description of operator>> and getline() for string<>
981ffeaf689SAlexander Kabaev 	      // might cause endless loop
982ffeaf689SAlexander Kabaev 	      __in._M_setstate(ios_base::badbit);
983ffeaf689SAlexander Kabaev 	    }
984ffeaf689SAlexander Kabaev 	}
985ffeaf689SAlexander Kabaev       if (!__extracted)
986ffeaf689SAlexander Kabaev 	__err |= ios_base::failbit;
987ffeaf689SAlexander Kabaev       if (__err)
988ffeaf689SAlexander Kabaev 	__in.setstate(__err);
98900db7afdSDavid E. O'Brien       return __in;
99000db7afdSDavid E. O'Brien     }
99100db7afdSDavid E. O'Brien 
99200db7afdSDavid E. O'Brien   // Inhibit implicit instantiations for required instantiations,
99300db7afdSDavid E. O'Brien   // which are defined via explicit instantiations elsewhere.
99400db7afdSDavid E. O'Brien   // NB:  This syntax is a GNU extension.
995ffeaf689SAlexander Kabaev #if _GLIBCXX_EXTERN_TEMPLATE
99600db7afdSDavid E. O'Brien   extern template class basic_istream<char>;
99700db7afdSDavid E. O'Brien   extern template istream& ws(istream&);
99800db7afdSDavid E. O'Brien   extern template istream& operator>>(istream&, char&);
99900db7afdSDavid E. O'Brien   extern template istream& operator>>(istream&, char*);
100000db7afdSDavid E. O'Brien   extern template istream& operator>>(istream&, unsigned char&);
100100db7afdSDavid E. O'Brien   extern template istream& operator>>(istream&, signed char&);
100200db7afdSDavid E. O'Brien   extern template istream& operator>>(istream&, unsigned char*);
100300db7afdSDavid E. O'Brien   extern template istream& operator>>(istream&, signed char*);
100400db7afdSDavid E. O'Brien 
1005*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(unsigned short&);
1006*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(unsigned int&);
1007*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(long&);
1008*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(unsigned long&);
1009*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(bool&);
1010*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
1011*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(long long&);
1012*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(unsigned long long&);
1013*f8a1b7d9SAlexander Kabaev #endif
1014*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(float&);
1015*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(double&);
1016*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(long double&);
1017*f8a1b7d9SAlexander Kabaev   extern template istream& istream::_M_extract(void*&);
1018*f8a1b7d9SAlexander Kabaev 
1019f260e61bSAlexander Kabaev   extern template class basic_iostream<char>;
1020f260e61bSAlexander Kabaev 
1021ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
102200db7afdSDavid E. O'Brien   extern template class basic_istream<wchar_t>;
102300db7afdSDavid E. O'Brien   extern template wistream& ws(wistream&);
102400db7afdSDavid E. O'Brien   extern template wistream& operator>>(wistream&, wchar_t&);
102500db7afdSDavid E. O'Brien   extern template wistream& operator>>(wistream&, wchar_t*);
1026f260e61bSAlexander Kabaev 
1027*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(unsigned short&);
1028*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(unsigned int&);
1029*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(long&);
1030*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(unsigned long&);
1031*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(bool&);
1032*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
1033*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(long long&);
1034*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(unsigned long long&);
1035*f8a1b7d9SAlexander Kabaev #endif
1036*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(float&);
1037*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(double&);
1038*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(long double&);
1039*f8a1b7d9SAlexander Kabaev   extern template wistream& wistream::_M_extract(void*&);
1040*f8a1b7d9SAlexander Kabaev 
1041f260e61bSAlexander Kabaev   extern template class basic_iostream<wchar_t>;
1042ca6500fcSAlexander Kabaev #endif
10431b86b14eSAlexander Kabaev #endif
1044*f8a1b7d9SAlexander Kabaev 
1045*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
1046ffeaf689SAlexander Kabaev 
1047ffeaf689SAlexander Kabaev #endif
1048