xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/bits/istream.tcc (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // istream classes -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*e4b17023SJohn Marino // 2006, 2007, 2008, 2009, 2010, 2011
5*e4b17023SJohn Marino // Free Software Foundation, Inc.
6*e4b17023SJohn Marino //
7*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
8*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
9*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
10*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino // any later version.
12*e4b17023SJohn Marino 
13*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*e4b17023SJohn Marino // GNU General Public License for more details.
17*e4b17023SJohn Marino 
18*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
19*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
20*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
21*e4b17023SJohn Marino 
22*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
23*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
24*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
26*e4b17023SJohn Marino 
27*e4b17023SJohn Marino /** @file bits/istream.tcc
28*e4b17023SJohn Marino  *  This is an internal header file, included by other library headers.
29*e4b17023SJohn Marino  *  Do not attempt to use it directly. @headername{istream}
30*e4b17023SJohn Marino  */
31*e4b17023SJohn Marino 
32*e4b17023SJohn Marino //
33*e4b17023SJohn Marino // ISO C++ 14882: 27.6.1  Input streams
34*e4b17023SJohn Marino //
35*e4b17023SJohn Marino 
36*e4b17023SJohn Marino #ifndef _ISTREAM_TCC
37*e4b17023SJohn Marino #define _ISTREAM_TCC 1
38*e4b17023SJohn Marino 
39*e4b17023SJohn Marino #pragma GCC system_header
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino #include <bits/cxxabi_forced.h>
42*e4b17023SJohn Marino 
43*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
44*e4b17023SJohn Marino {
45*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
46*e4b17023SJohn Marino 
47*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
48*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::sentry::
sentry(basic_istream<_CharT,_Traits> & __in,bool __noskip)49*e4b17023SJohn Marino     sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
50*e4b17023SJohn Marino     {
51*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
52*e4b17023SJohn Marino       if (__in.good())
53*e4b17023SJohn Marino 	{
54*e4b17023SJohn Marino 	  if (__in.tie())
55*e4b17023SJohn Marino 	    __in.tie()->flush();
56*e4b17023SJohn Marino 	  if (!__noskip && bool(__in.flags() & ios_base::skipws))
57*e4b17023SJohn Marino 	    {
58*e4b17023SJohn Marino 	      const __int_type __eof = traits_type::eof();
59*e4b17023SJohn Marino 	      __streambuf_type* __sb = __in.rdbuf();
60*e4b17023SJohn Marino 	      __int_type __c = __sb->sgetc();
61*e4b17023SJohn Marino 
62*e4b17023SJohn Marino 	      const __ctype_type& __ct = __check_facet(__in._M_ctype);
63*e4b17023SJohn Marino 	      while (!traits_type::eq_int_type(__c, __eof)
64*e4b17023SJohn Marino 		     && __ct.is(ctype_base::space,
65*e4b17023SJohn Marino 				traits_type::to_char_type(__c)))
66*e4b17023SJohn Marino 		__c = __sb->snextc();
67*e4b17023SJohn Marino 
68*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
69*e4b17023SJohn Marino 	      // 195. Should basic_istream::sentry's constructor ever
70*e4b17023SJohn Marino 	      // set eofbit?
71*e4b17023SJohn Marino 	      if (traits_type::eq_int_type(__c, __eof))
72*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
73*e4b17023SJohn Marino 	    }
74*e4b17023SJohn Marino 	}
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino       if (__in.good() && __err == ios_base::goodbit)
77*e4b17023SJohn Marino 	_M_ok = true;
78*e4b17023SJohn Marino       else
79*e4b17023SJohn Marino 	{
80*e4b17023SJohn Marino 	  __err |= ios_base::failbit;
81*e4b17023SJohn Marino 	  __in.setstate(__err);
82*e4b17023SJohn Marino 	}
83*e4b17023SJohn Marino     }
84*e4b17023SJohn Marino 
85*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
86*e4b17023SJohn Marino     template<typename _ValueT>
87*e4b17023SJohn Marino       basic_istream<_CharT, _Traits>&
88*e4b17023SJohn Marino       basic_istream<_CharT, _Traits>::
_M_extract(_ValueT & __v)89*e4b17023SJohn Marino       _M_extract(_ValueT& __v)
90*e4b17023SJohn Marino       {
91*e4b17023SJohn Marino 	sentry __cerb(*this, false);
92*e4b17023SJohn Marino 	if (__cerb)
93*e4b17023SJohn Marino 	  {
94*e4b17023SJohn Marino 	    ios_base::iostate __err = ios_base::goodbit;
95*e4b17023SJohn Marino 	    __try
96*e4b17023SJohn Marino 	      {
97*e4b17023SJohn Marino 		const __num_get_type& __ng = __check_facet(this->_M_num_get);
98*e4b17023SJohn Marino 		__ng.get(*this, 0, *this, __err, __v);
99*e4b17023SJohn Marino 	      }
100*e4b17023SJohn Marino 	    __catch(__cxxabiv1::__forced_unwind&)
101*e4b17023SJohn Marino 	      {
102*e4b17023SJohn Marino 		this->_M_setstate(ios_base::badbit);
103*e4b17023SJohn Marino 		__throw_exception_again;
104*e4b17023SJohn Marino 	      }
105*e4b17023SJohn Marino 	    __catch(...)
106*e4b17023SJohn Marino 	      { this->_M_setstate(ios_base::badbit); }
107*e4b17023SJohn Marino 	    if (__err)
108*e4b17023SJohn Marino 	      this->setstate(__err);
109*e4b17023SJohn Marino 	  }
110*e4b17023SJohn Marino 	return *this;
111*e4b17023SJohn Marino       }
112*e4b17023SJohn Marino 
113*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
114*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
115*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
operator >>(short & __n)116*e4b17023SJohn Marino     operator>>(short& __n)
117*e4b17023SJohn Marino     {
118*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
119*e4b17023SJohn Marino       // 118. basic_istream uses nonexistent num_get member functions.
120*e4b17023SJohn Marino       sentry __cerb(*this, false);
121*e4b17023SJohn Marino       if (__cerb)
122*e4b17023SJohn Marino 	{
123*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
124*e4b17023SJohn Marino 	  __try
125*e4b17023SJohn Marino 	    {
126*e4b17023SJohn Marino 	      long __l;
127*e4b17023SJohn Marino 	      const __num_get_type& __ng = __check_facet(this->_M_num_get);
128*e4b17023SJohn Marino 	      __ng.get(*this, 0, *this, __err, __l);
129*e4b17023SJohn Marino 
130*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
131*e4b17023SJohn Marino 	      // 696. istream::operator>>(int&) broken.
132*e4b17023SJohn Marino 	      if (__l < __gnu_cxx::__numeric_traits<short>::__min)
133*e4b17023SJohn Marino 		{
134*e4b17023SJohn Marino 		  __err |= ios_base::failbit;
135*e4b17023SJohn Marino 		  __n = __gnu_cxx::__numeric_traits<short>::__min;
136*e4b17023SJohn Marino 		}
137*e4b17023SJohn Marino 	      else if (__l > __gnu_cxx::__numeric_traits<short>::__max)
138*e4b17023SJohn Marino 		{
139*e4b17023SJohn Marino 		  __err |= ios_base::failbit;
140*e4b17023SJohn Marino 		  __n = __gnu_cxx::__numeric_traits<short>::__max;
141*e4b17023SJohn Marino 		}
142*e4b17023SJohn Marino 	      else
143*e4b17023SJohn Marino 		__n = short(__l);
144*e4b17023SJohn Marino 	    }
145*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
146*e4b17023SJohn Marino 	    {
147*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
148*e4b17023SJohn Marino 	      __throw_exception_again;
149*e4b17023SJohn Marino 	    }
150*e4b17023SJohn Marino 	  __catch(...)
151*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
152*e4b17023SJohn Marino 	  if (__err)
153*e4b17023SJohn Marino 	    this->setstate(__err);
154*e4b17023SJohn Marino 	}
155*e4b17023SJohn Marino       return *this;
156*e4b17023SJohn Marino     }
157*e4b17023SJohn Marino 
158*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
159*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
160*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
operator >>(int & __n)161*e4b17023SJohn Marino     operator>>(int& __n)
162*e4b17023SJohn Marino     {
163*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
164*e4b17023SJohn Marino       // 118. basic_istream uses nonexistent num_get member functions.
165*e4b17023SJohn Marino       sentry __cerb(*this, false);
166*e4b17023SJohn Marino       if (__cerb)
167*e4b17023SJohn Marino 	{
168*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
169*e4b17023SJohn Marino 	  __try
170*e4b17023SJohn Marino 	    {
171*e4b17023SJohn Marino 	      long __l;
172*e4b17023SJohn Marino 	      const __num_get_type& __ng = __check_facet(this->_M_num_get);
173*e4b17023SJohn Marino 	      __ng.get(*this, 0, *this, __err, __l);
174*e4b17023SJohn Marino 
175*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
176*e4b17023SJohn Marino 	      // 696. istream::operator>>(int&) broken.
177*e4b17023SJohn Marino 	      if (__l < __gnu_cxx::__numeric_traits<int>::__min)
178*e4b17023SJohn Marino 		{
179*e4b17023SJohn Marino 		  __err |= ios_base::failbit;
180*e4b17023SJohn Marino 		  __n = __gnu_cxx::__numeric_traits<int>::__min;
181*e4b17023SJohn Marino 		}
182*e4b17023SJohn Marino 	      else if (__l > __gnu_cxx::__numeric_traits<int>::__max)
183*e4b17023SJohn Marino 		{
184*e4b17023SJohn Marino 		  __err |= ios_base::failbit;
185*e4b17023SJohn Marino 		  __n = __gnu_cxx::__numeric_traits<int>::__max;
186*e4b17023SJohn Marino 		}
187*e4b17023SJohn Marino 	      else
188*e4b17023SJohn Marino 		__n = int(__l);
189*e4b17023SJohn Marino 	    }
190*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
191*e4b17023SJohn Marino 	    {
192*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
193*e4b17023SJohn Marino 	      __throw_exception_again;
194*e4b17023SJohn Marino 	    }
195*e4b17023SJohn Marino 	  __catch(...)
196*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
197*e4b17023SJohn Marino 	  if (__err)
198*e4b17023SJohn Marino 	    this->setstate(__err);
199*e4b17023SJohn Marino 	}
200*e4b17023SJohn Marino       return *this;
201*e4b17023SJohn Marino     }
202*e4b17023SJohn Marino 
203*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
204*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
205*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
operator >>(__streambuf_type * __sbout)206*e4b17023SJohn Marino     operator>>(__streambuf_type* __sbout)
207*e4b17023SJohn Marino     {
208*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
209*e4b17023SJohn Marino       sentry __cerb(*this, false);
210*e4b17023SJohn Marino       if (__cerb && __sbout)
211*e4b17023SJohn Marino 	{
212*e4b17023SJohn Marino 	  __try
213*e4b17023SJohn Marino 	    {
214*e4b17023SJohn Marino 	      bool __ineof;
215*e4b17023SJohn Marino 	      if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
216*e4b17023SJohn Marino 		__err |= ios_base::failbit;
217*e4b17023SJohn Marino 	      if (__ineof)
218*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
219*e4b17023SJohn Marino 	    }
220*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
221*e4b17023SJohn Marino 	    {
222*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::failbit);
223*e4b17023SJohn Marino 	      __throw_exception_again;
224*e4b17023SJohn Marino 	    }
225*e4b17023SJohn Marino 	  __catch(...)
226*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::failbit); }
227*e4b17023SJohn Marino 	}
228*e4b17023SJohn Marino       else if (!__sbout)
229*e4b17023SJohn Marino 	__err |= ios_base::failbit;
230*e4b17023SJohn Marino       if (__err)
231*e4b17023SJohn Marino 	this->setstate(__err);
232*e4b17023SJohn Marino       return *this;
233*e4b17023SJohn Marino     }
234*e4b17023SJohn Marino 
235*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
236*e4b17023SJohn Marino     typename basic_istream<_CharT, _Traits>::int_type
237*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
get(void)238*e4b17023SJohn Marino     get(void)
239*e4b17023SJohn Marino     {
240*e4b17023SJohn Marino       const int_type __eof = traits_type::eof();
241*e4b17023SJohn Marino       int_type __c = __eof;
242*e4b17023SJohn Marino       _M_gcount = 0;
243*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
244*e4b17023SJohn Marino       sentry __cerb(*this, true);
245*e4b17023SJohn Marino       if (__cerb)
246*e4b17023SJohn Marino 	{
247*e4b17023SJohn Marino 	  __try
248*e4b17023SJohn Marino 	    {
249*e4b17023SJohn Marino 	      __c = this->rdbuf()->sbumpc();
250*e4b17023SJohn Marino 	      // 27.6.1.1 paragraph 3
251*e4b17023SJohn Marino 	      if (!traits_type::eq_int_type(__c, __eof))
252*e4b17023SJohn Marino 		_M_gcount = 1;
253*e4b17023SJohn Marino 	      else
254*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
255*e4b17023SJohn Marino 	    }
256*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
257*e4b17023SJohn Marino 	    {
258*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
259*e4b17023SJohn Marino 	      __throw_exception_again;
260*e4b17023SJohn Marino 	    }
261*e4b17023SJohn Marino 	  __catch(...)
262*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
263*e4b17023SJohn Marino 	}
264*e4b17023SJohn Marino       if (!_M_gcount)
265*e4b17023SJohn Marino 	__err |= ios_base::failbit;
266*e4b17023SJohn Marino       if (__err)
267*e4b17023SJohn Marino 	this->setstate(__err);
268*e4b17023SJohn Marino       return __c;
269*e4b17023SJohn Marino     }
270*e4b17023SJohn Marino 
271*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
272*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
273*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
get(char_type & __c)274*e4b17023SJohn Marino     get(char_type& __c)
275*e4b17023SJohn Marino     {
276*e4b17023SJohn Marino       _M_gcount = 0;
277*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
278*e4b17023SJohn Marino       sentry __cerb(*this, true);
279*e4b17023SJohn Marino       if (__cerb)
280*e4b17023SJohn Marino 	{
281*e4b17023SJohn Marino 	  __try
282*e4b17023SJohn Marino 	    {
283*e4b17023SJohn Marino 	      const int_type __cb = this->rdbuf()->sbumpc();
284*e4b17023SJohn Marino 	      // 27.6.1.1 paragraph 3
285*e4b17023SJohn Marino 	      if (!traits_type::eq_int_type(__cb, traits_type::eof()))
286*e4b17023SJohn Marino 		{
287*e4b17023SJohn Marino 		  _M_gcount = 1;
288*e4b17023SJohn Marino 		  __c = traits_type::to_char_type(__cb);
289*e4b17023SJohn Marino 		}
290*e4b17023SJohn Marino 	      else
291*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
292*e4b17023SJohn Marino 	    }
293*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
294*e4b17023SJohn Marino 	    {
295*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
296*e4b17023SJohn Marino 	      __throw_exception_again;
297*e4b17023SJohn Marino 	    }
298*e4b17023SJohn Marino 	  __catch(...)
299*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
300*e4b17023SJohn Marino 	}
301*e4b17023SJohn Marino       if (!_M_gcount)
302*e4b17023SJohn Marino 	__err |= ios_base::failbit;
303*e4b17023SJohn Marino       if (__err)
304*e4b17023SJohn Marino 	this->setstate(__err);
305*e4b17023SJohn Marino       return *this;
306*e4b17023SJohn Marino     }
307*e4b17023SJohn Marino 
308*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
309*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
310*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
get(char_type * __s,streamsize __n,char_type __delim)311*e4b17023SJohn Marino     get(char_type* __s, streamsize __n, char_type __delim)
312*e4b17023SJohn Marino     {
313*e4b17023SJohn Marino       _M_gcount = 0;
314*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
315*e4b17023SJohn Marino       sentry __cerb(*this, true);
316*e4b17023SJohn Marino       if (__cerb)
317*e4b17023SJohn Marino 	{
318*e4b17023SJohn Marino 	  __try
319*e4b17023SJohn Marino 	    {
320*e4b17023SJohn Marino 	      const int_type __idelim = traits_type::to_int_type(__delim);
321*e4b17023SJohn Marino 	      const int_type __eof = traits_type::eof();
322*e4b17023SJohn Marino 	      __streambuf_type* __sb = this->rdbuf();
323*e4b17023SJohn Marino 	      int_type __c = __sb->sgetc();
324*e4b17023SJohn Marino 
325*e4b17023SJohn Marino 	      while (_M_gcount + 1 < __n
326*e4b17023SJohn Marino 		     && !traits_type::eq_int_type(__c, __eof)
327*e4b17023SJohn Marino 		     && !traits_type::eq_int_type(__c, __idelim))
328*e4b17023SJohn Marino 		{
329*e4b17023SJohn Marino 		  *__s++ = traits_type::to_char_type(__c);
330*e4b17023SJohn Marino 		  ++_M_gcount;
331*e4b17023SJohn Marino 		  __c = __sb->snextc();
332*e4b17023SJohn Marino 		}
333*e4b17023SJohn Marino 	      if (traits_type::eq_int_type(__c, __eof))
334*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
335*e4b17023SJohn Marino 	    }
336*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
337*e4b17023SJohn Marino 	    {
338*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
339*e4b17023SJohn Marino 	      __throw_exception_again;
340*e4b17023SJohn Marino 	    }
341*e4b17023SJohn Marino 	  __catch(...)
342*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
343*e4b17023SJohn Marino 	}
344*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
345*e4b17023SJohn Marino       // 243. get and getline when sentry reports failure.
346*e4b17023SJohn Marino       if (__n > 0)
347*e4b17023SJohn Marino 	*__s = char_type();
348*e4b17023SJohn Marino       if (!_M_gcount)
349*e4b17023SJohn Marino 	__err |= ios_base::failbit;
350*e4b17023SJohn Marino       if (__err)
351*e4b17023SJohn Marino 	this->setstate(__err);
352*e4b17023SJohn Marino       return *this;
353*e4b17023SJohn Marino     }
354*e4b17023SJohn Marino 
355*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
356*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
357*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
get(__streambuf_type & __sb,char_type __delim)358*e4b17023SJohn Marino     get(__streambuf_type& __sb, char_type __delim)
359*e4b17023SJohn Marino     {
360*e4b17023SJohn Marino       _M_gcount = 0;
361*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
362*e4b17023SJohn Marino       sentry __cerb(*this, true);
363*e4b17023SJohn Marino       if (__cerb)
364*e4b17023SJohn Marino 	{
365*e4b17023SJohn Marino 	  __try
366*e4b17023SJohn Marino 	    {
367*e4b17023SJohn Marino 	      const int_type __idelim = traits_type::to_int_type(__delim);
368*e4b17023SJohn Marino 	      const int_type __eof = traits_type::eof();
369*e4b17023SJohn Marino 	      __streambuf_type* __this_sb = this->rdbuf();
370*e4b17023SJohn Marino 	      int_type __c = __this_sb->sgetc();
371*e4b17023SJohn Marino 	      char_type __c2 = traits_type::to_char_type(__c);
372*e4b17023SJohn Marino 
373*e4b17023SJohn Marino 	      while (!traits_type::eq_int_type(__c, __eof)
374*e4b17023SJohn Marino 		     && !traits_type::eq_int_type(__c, __idelim)
375*e4b17023SJohn Marino 		     && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
376*e4b17023SJohn Marino 		{
377*e4b17023SJohn Marino 		  ++_M_gcount;
378*e4b17023SJohn Marino 		  __c = __this_sb->snextc();
379*e4b17023SJohn Marino 		  __c2 = traits_type::to_char_type(__c);
380*e4b17023SJohn Marino 		}
381*e4b17023SJohn Marino 	      if (traits_type::eq_int_type(__c, __eof))
382*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
383*e4b17023SJohn Marino 	    }
384*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
385*e4b17023SJohn Marino 	    {
386*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
387*e4b17023SJohn Marino 	      __throw_exception_again;
388*e4b17023SJohn Marino 	    }
389*e4b17023SJohn Marino 	  __catch(...)
390*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
391*e4b17023SJohn Marino 	}
392*e4b17023SJohn Marino       if (!_M_gcount)
393*e4b17023SJohn Marino 	__err |= ios_base::failbit;
394*e4b17023SJohn Marino       if (__err)
395*e4b17023SJohn Marino 	this->setstate(__err);
396*e4b17023SJohn Marino       return *this;
397*e4b17023SJohn Marino     }
398*e4b17023SJohn Marino 
399*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
400*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
401*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
getline(char_type * __s,streamsize __n,char_type __delim)402*e4b17023SJohn Marino     getline(char_type* __s, streamsize __n, char_type __delim)
403*e4b17023SJohn Marino     {
404*e4b17023SJohn Marino       _M_gcount = 0;
405*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
406*e4b17023SJohn Marino       sentry __cerb(*this, true);
407*e4b17023SJohn Marino       if (__cerb)
408*e4b17023SJohn Marino         {
409*e4b17023SJohn Marino           __try
410*e4b17023SJohn Marino             {
411*e4b17023SJohn Marino               const int_type __idelim = traits_type::to_int_type(__delim);
412*e4b17023SJohn Marino               const int_type __eof = traits_type::eof();
413*e4b17023SJohn Marino               __streambuf_type* __sb = this->rdbuf();
414*e4b17023SJohn Marino               int_type __c = __sb->sgetc();
415*e4b17023SJohn Marino 
416*e4b17023SJohn Marino               while (_M_gcount + 1 < __n
417*e4b17023SJohn Marino                      && !traits_type::eq_int_type(__c, __eof)
418*e4b17023SJohn Marino                      && !traits_type::eq_int_type(__c, __idelim))
419*e4b17023SJohn Marino                 {
420*e4b17023SJohn Marino                   *__s++ = traits_type::to_char_type(__c);
421*e4b17023SJohn Marino                   __c = __sb->snextc();
422*e4b17023SJohn Marino                   ++_M_gcount;
423*e4b17023SJohn Marino                 }
424*e4b17023SJohn Marino               if (traits_type::eq_int_type(__c, __eof))
425*e4b17023SJohn Marino                 __err |= ios_base::eofbit;
426*e4b17023SJohn Marino               else
427*e4b17023SJohn Marino                 {
428*e4b17023SJohn Marino                   if (traits_type::eq_int_type(__c, __idelim))
429*e4b17023SJohn Marino                     {
430*e4b17023SJohn Marino                       __sb->sbumpc();
431*e4b17023SJohn Marino                       ++_M_gcount;
432*e4b17023SJohn Marino                     }
433*e4b17023SJohn Marino                   else
434*e4b17023SJohn Marino                     __err |= ios_base::failbit;
435*e4b17023SJohn Marino                 }
436*e4b17023SJohn Marino             }
437*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
438*e4b17023SJohn Marino 	    {
439*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
440*e4b17023SJohn Marino 	      __throw_exception_again;
441*e4b17023SJohn Marino 	    }
442*e4b17023SJohn Marino           __catch(...)
443*e4b17023SJohn Marino             { this->_M_setstate(ios_base::badbit); }
444*e4b17023SJohn Marino         }
445*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
446*e4b17023SJohn Marino       // 243. get and getline when sentry reports failure.
447*e4b17023SJohn Marino       if (__n > 0)
448*e4b17023SJohn Marino 	*__s = char_type();
449*e4b17023SJohn Marino       if (!_M_gcount)
450*e4b17023SJohn Marino         __err |= ios_base::failbit;
451*e4b17023SJohn Marino       if (__err)
452*e4b17023SJohn Marino         this->setstate(__err);
453*e4b17023SJohn Marino       return *this;
454*e4b17023SJohn Marino     }
455*e4b17023SJohn Marino 
456*e4b17023SJohn Marino   // We provide three overloads, since the first two are much simpler
457*e4b17023SJohn Marino   // than the general case. Also, the latter two can thus adopt the
458*e4b17023SJohn Marino   // same "batchy" strategy used by getline above.
459*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
460*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
461*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
ignore(void)462*e4b17023SJohn Marino     ignore(void)
463*e4b17023SJohn Marino     {
464*e4b17023SJohn Marino       _M_gcount = 0;
465*e4b17023SJohn Marino       sentry __cerb(*this, true);
466*e4b17023SJohn Marino       if (__cerb)
467*e4b17023SJohn Marino 	{
468*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
469*e4b17023SJohn Marino 	  __try
470*e4b17023SJohn Marino 	    {
471*e4b17023SJohn Marino 	      const int_type __eof = traits_type::eof();
472*e4b17023SJohn Marino 	      __streambuf_type* __sb = this->rdbuf();
473*e4b17023SJohn Marino 
474*e4b17023SJohn Marino 	      if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
475*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
476*e4b17023SJohn Marino 	      else
477*e4b17023SJohn Marino 		_M_gcount = 1;
478*e4b17023SJohn Marino 	    }
479*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
480*e4b17023SJohn Marino 	    {
481*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
482*e4b17023SJohn Marino 	      __throw_exception_again;
483*e4b17023SJohn Marino 	    }
484*e4b17023SJohn Marino 	  __catch(...)
485*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
486*e4b17023SJohn Marino 	  if (__err)
487*e4b17023SJohn Marino 	    this->setstate(__err);
488*e4b17023SJohn Marino 	}
489*e4b17023SJohn Marino       return *this;
490*e4b17023SJohn Marino     }
491*e4b17023SJohn Marino 
492*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
493*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
494*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
ignore(streamsize __n)495*e4b17023SJohn Marino     ignore(streamsize __n)
496*e4b17023SJohn Marino     {
497*e4b17023SJohn Marino       _M_gcount = 0;
498*e4b17023SJohn Marino       sentry __cerb(*this, true);
499*e4b17023SJohn Marino       if (__cerb && __n > 0)
500*e4b17023SJohn Marino         {
501*e4b17023SJohn Marino           ios_base::iostate __err = ios_base::goodbit;
502*e4b17023SJohn Marino           __try
503*e4b17023SJohn Marino             {
504*e4b17023SJohn Marino               const int_type __eof = traits_type::eof();
505*e4b17023SJohn Marino               __streambuf_type* __sb = this->rdbuf();
506*e4b17023SJohn Marino               int_type __c = __sb->sgetc();
507*e4b17023SJohn Marino 
508*e4b17023SJohn Marino 	      // N.B. On LFS-enabled platforms streamsize is still 32 bits
509*e4b17023SJohn Marino 	      // wide: if we want to implement the standard mandated behavior
510*e4b17023SJohn Marino 	      // for n == max() (see 27.6.1.3/24) we are at risk of signed
511*e4b17023SJohn Marino 	      // integer overflow: thus these contortions. Also note that,
512*e4b17023SJohn Marino 	      // by definition, when more than 2G chars are actually ignored,
513*e4b17023SJohn Marino 	      // _M_gcount (the return value of gcount, that is) cannot be
514*e4b17023SJohn Marino 	      // really correct, being unavoidably too small.
515*e4b17023SJohn Marino 	      bool __large_ignore = false;
516*e4b17023SJohn Marino 	      while (true)
517*e4b17023SJohn Marino 		{
518*e4b17023SJohn Marino 		  while (_M_gcount < __n
519*e4b17023SJohn Marino 			 && !traits_type::eq_int_type(__c, __eof))
520*e4b17023SJohn Marino 		    {
521*e4b17023SJohn Marino 		      ++_M_gcount;
522*e4b17023SJohn Marino 		      __c = __sb->snextc();
523*e4b17023SJohn Marino 		    }
524*e4b17023SJohn Marino 		  if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
525*e4b17023SJohn Marino 		      && !traits_type::eq_int_type(__c, __eof))
526*e4b17023SJohn Marino 		    {
527*e4b17023SJohn Marino 		      _M_gcount =
528*e4b17023SJohn Marino 			__gnu_cxx::__numeric_traits<streamsize>::__min;
529*e4b17023SJohn Marino 		      __large_ignore = true;
530*e4b17023SJohn Marino 		    }
531*e4b17023SJohn Marino 		  else
532*e4b17023SJohn Marino 		    break;
533*e4b17023SJohn Marino 		}
534*e4b17023SJohn Marino 
535*e4b17023SJohn Marino 	      if (__large_ignore)
536*e4b17023SJohn Marino 		_M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
537*e4b17023SJohn Marino 
538*e4b17023SJohn Marino 	      if (traits_type::eq_int_type(__c, __eof))
539*e4b17023SJohn Marino                 __err |= ios_base::eofbit;
540*e4b17023SJohn Marino             }
541*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
542*e4b17023SJohn Marino 	    {
543*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
544*e4b17023SJohn Marino 	      __throw_exception_again;
545*e4b17023SJohn Marino 	    }
546*e4b17023SJohn Marino           __catch(...)
547*e4b17023SJohn Marino             { this->_M_setstate(ios_base::badbit); }
548*e4b17023SJohn Marino           if (__err)
549*e4b17023SJohn Marino             this->setstate(__err);
550*e4b17023SJohn Marino         }
551*e4b17023SJohn Marino       return *this;
552*e4b17023SJohn Marino     }
553*e4b17023SJohn Marino 
554*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
555*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
556*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
ignore(streamsize __n,int_type __delim)557*e4b17023SJohn Marino     ignore(streamsize __n, int_type __delim)
558*e4b17023SJohn Marino     {
559*e4b17023SJohn Marino       _M_gcount = 0;
560*e4b17023SJohn Marino       sentry __cerb(*this, true);
561*e4b17023SJohn Marino       if (__cerb && __n > 0)
562*e4b17023SJohn Marino         {
563*e4b17023SJohn Marino           ios_base::iostate __err = ios_base::goodbit;
564*e4b17023SJohn Marino           __try
565*e4b17023SJohn Marino             {
566*e4b17023SJohn Marino               const int_type __eof = traits_type::eof();
567*e4b17023SJohn Marino               __streambuf_type* __sb = this->rdbuf();
568*e4b17023SJohn Marino               int_type __c = __sb->sgetc();
569*e4b17023SJohn Marino 
570*e4b17023SJohn Marino 	      // See comment above.
571*e4b17023SJohn Marino 	      bool __large_ignore = false;
572*e4b17023SJohn Marino 	      while (true)
573*e4b17023SJohn Marino 		{
574*e4b17023SJohn Marino 		  while (_M_gcount < __n
575*e4b17023SJohn Marino 			 && !traits_type::eq_int_type(__c, __eof)
576*e4b17023SJohn Marino 			 && !traits_type::eq_int_type(__c, __delim))
577*e4b17023SJohn Marino 		    {
578*e4b17023SJohn Marino 		      ++_M_gcount;
579*e4b17023SJohn Marino 		      __c = __sb->snextc();
580*e4b17023SJohn Marino 		    }
581*e4b17023SJohn Marino 		  if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
582*e4b17023SJohn Marino 		      && !traits_type::eq_int_type(__c, __eof)
583*e4b17023SJohn Marino 		      && !traits_type::eq_int_type(__c, __delim))
584*e4b17023SJohn Marino 		    {
585*e4b17023SJohn Marino 		      _M_gcount =
586*e4b17023SJohn Marino 			__gnu_cxx::__numeric_traits<streamsize>::__min;
587*e4b17023SJohn Marino 		      __large_ignore = true;
588*e4b17023SJohn Marino 		    }
589*e4b17023SJohn Marino 		  else
590*e4b17023SJohn Marino 		    break;
591*e4b17023SJohn Marino 		}
592*e4b17023SJohn Marino 
593*e4b17023SJohn Marino 	      if (__large_ignore)
594*e4b17023SJohn Marino 		_M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
595*e4b17023SJohn Marino 
596*e4b17023SJohn Marino               if (traits_type::eq_int_type(__c, __eof))
597*e4b17023SJohn Marino                 __err |= ios_base::eofbit;
598*e4b17023SJohn Marino 	      else if (traits_type::eq_int_type(__c, __delim))
599*e4b17023SJohn Marino 		{
600*e4b17023SJohn Marino 		  if (_M_gcount
601*e4b17023SJohn Marino 		      < __gnu_cxx::__numeric_traits<streamsize>::__max)
602*e4b17023SJohn Marino 		    ++_M_gcount;
603*e4b17023SJohn Marino 		  __sb->sbumpc();
604*e4b17023SJohn Marino 		}
605*e4b17023SJohn Marino             }
606*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
607*e4b17023SJohn Marino 	    {
608*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
609*e4b17023SJohn Marino 	      __throw_exception_again;
610*e4b17023SJohn Marino 	    }
611*e4b17023SJohn Marino           __catch(...)
612*e4b17023SJohn Marino             { this->_M_setstate(ios_base::badbit); }
613*e4b17023SJohn Marino           if (__err)
614*e4b17023SJohn Marino             this->setstate(__err);
615*e4b17023SJohn Marino         }
616*e4b17023SJohn Marino       return *this;
617*e4b17023SJohn Marino     }
618*e4b17023SJohn Marino 
619*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
620*e4b17023SJohn Marino     typename basic_istream<_CharT, _Traits>::int_type
621*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
peek(void)622*e4b17023SJohn Marino     peek(void)
623*e4b17023SJohn Marino     {
624*e4b17023SJohn Marino       int_type __c = traits_type::eof();
625*e4b17023SJohn Marino       _M_gcount = 0;
626*e4b17023SJohn Marino       sentry __cerb(*this, true);
627*e4b17023SJohn Marino       if (__cerb)
628*e4b17023SJohn Marino 	{
629*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
630*e4b17023SJohn Marino 	  __try
631*e4b17023SJohn Marino 	    {
632*e4b17023SJohn Marino 	      __c = this->rdbuf()->sgetc();
633*e4b17023SJohn Marino 	      if (traits_type::eq_int_type(__c, traits_type::eof()))
634*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
635*e4b17023SJohn Marino 	    }
636*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
637*e4b17023SJohn Marino 	    {
638*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
639*e4b17023SJohn Marino 	      __throw_exception_again;
640*e4b17023SJohn Marino 	    }
641*e4b17023SJohn Marino 	  __catch(...)
642*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
643*e4b17023SJohn Marino 	  if (__err)
644*e4b17023SJohn Marino 	    this->setstate(__err);
645*e4b17023SJohn Marino 	}
646*e4b17023SJohn Marino       return __c;
647*e4b17023SJohn Marino     }
648*e4b17023SJohn Marino 
649*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
650*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
651*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
read(char_type * __s,streamsize __n)652*e4b17023SJohn Marino     read(char_type* __s, streamsize __n)
653*e4b17023SJohn Marino     {
654*e4b17023SJohn Marino       _M_gcount = 0;
655*e4b17023SJohn Marino       sentry __cerb(*this, true);
656*e4b17023SJohn Marino       if (__cerb)
657*e4b17023SJohn Marino 	{
658*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
659*e4b17023SJohn Marino 	  __try
660*e4b17023SJohn Marino 	    {
661*e4b17023SJohn Marino 	      _M_gcount = this->rdbuf()->sgetn(__s, __n);
662*e4b17023SJohn Marino 	      if (_M_gcount != __n)
663*e4b17023SJohn Marino 		__err |= (ios_base::eofbit | ios_base::failbit);
664*e4b17023SJohn Marino 	    }
665*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
666*e4b17023SJohn Marino 	    {
667*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
668*e4b17023SJohn Marino 	      __throw_exception_again;
669*e4b17023SJohn Marino 	    }
670*e4b17023SJohn Marino 	  __catch(...)
671*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
672*e4b17023SJohn Marino 	  if (__err)
673*e4b17023SJohn Marino 	    this->setstate(__err);
674*e4b17023SJohn Marino 	}
675*e4b17023SJohn Marino       return *this;
676*e4b17023SJohn Marino     }
677*e4b17023SJohn Marino 
678*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
679*e4b17023SJohn Marino     streamsize
680*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
readsome(char_type * __s,streamsize __n)681*e4b17023SJohn Marino     readsome(char_type* __s, streamsize __n)
682*e4b17023SJohn Marino     {
683*e4b17023SJohn Marino       _M_gcount = 0;
684*e4b17023SJohn Marino       sentry __cerb(*this, true);
685*e4b17023SJohn Marino       if (__cerb)
686*e4b17023SJohn Marino 	{
687*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
688*e4b17023SJohn Marino 	  __try
689*e4b17023SJohn Marino 	    {
690*e4b17023SJohn Marino 	      // Cannot compare int_type with streamsize generically.
691*e4b17023SJohn Marino 	      const streamsize __num = this->rdbuf()->in_avail();
692*e4b17023SJohn Marino 	      if (__num > 0)
693*e4b17023SJohn Marino 		_M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
694*e4b17023SJohn Marino 	      else if (__num == -1)
695*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
696*e4b17023SJohn Marino 	    }
697*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
698*e4b17023SJohn Marino 	    {
699*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
700*e4b17023SJohn Marino 	      __throw_exception_again;
701*e4b17023SJohn Marino 	    }
702*e4b17023SJohn Marino 	  __catch(...)
703*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
704*e4b17023SJohn Marino 	  if (__err)
705*e4b17023SJohn Marino 	    this->setstate(__err);
706*e4b17023SJohn Marino 	}
707*e4b17023SJohn Marino       return _M_gcount;
708*e4b17023SJohn Marino     }
709*e4b17023SJohn Marino 
710*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
711*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
712*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
putback(char_type __c)713*e4b17023SJohn Marino     putback(char_type __c)
714*e4b17023SJohn Marino     {
715*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
716*e4b17023SJohn Marino       // 60. What is a formatted input function?
717*e4b17023SJohn Marino       _M_gcount = 0;
718*e4b17023SJohn Marino       // Clear eofbit per N3168.
719*e4b17023SJohn Marino       this->clear(this->rdstate() & ~ios_base::eofbit);
720*e4b17023SJohn Marino       sentry __cerb(*this, true);
721*e4b17023SJohn Marino       if (__cerb)
722*e4b17023SJohn Marino 	{
723*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
724*e4b17023SJohn Marino 	  __try
725*e4b17023SJohn Marino 	    {
726*e4b17023SJohn Marino 	      const int_type __eof = traits_type::eof();
727*e4b17023SJohn Marino 	      __streambuf_type* __sb = this->rdbuf();
728*e4b17023SJohn Marino 	      if (!__sb
729*e4b17023SJohn Marino 		  || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
730*e4b17023SJohn Marino 		__err |= ios_base::badbit;
731*e4b17023SJohn Marino 	    }
732*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
733*e4b17023SJohn Marino 	    {
734*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
735*e4b17023SJohn Marino 	      __throw_exception_again;
736*e4b17023SJohn Marino 	    }
737*e4b17023SJohn Marino 	  __catch(...)
738*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
739*e4b17023SJohn Marino 	  if (__err)
740*e4b17023SJohn Marino 	    this->setstate(__err);
741*e4b17023SJohn Marino 	}
742*e4b17023SJohn Marino       return *this;
743*e4b17023SJohn Marino     }
744*e4b17023SJohn Marino 
745*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
746*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
747*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
unget(void)748*e4b17023SJohn Marino     unget(void)
749*e4b17023SJohn Marino     {
750*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
751*e4b17023SJohn Marino       // 60. What is a formatted input function?
752*e4b17023SJohn Marino       _M_gcount = 0;
753*e4b17023SJohn Marino       // Clear eofbit per N3168.
754*e4b17023SJohn Marino       this->clear(this->rdstate() & ~ios_base::eofbit);
755*e4b17023SJohn Marino       sentry __cerb(*this, true);
756*e4b17023SJohn Marino       if (__cerb)
757*e4b17023SJohn Marino 	{
758*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
759*e4b17023SJohn Marino 	  __try
760*e4b17023SJohn Marino 	    {
761*e4b17023SJohn Marino 	      const int_type __eof = traits_type::eof();
762*e4b17023SJohn Marino 	      __streambuf_type* __sb = this->rdbuf();
763*e4b17023SJohn Marino 	      if (!__sb
764*e4b17023SJohn Marino 		  || traits_type::eq_int_type(__sb->sungetc(), __eof))
765*e4b17023SJohn Marino 		__err |= ios_base::badbit;
766*e4b17023SJohn Marino 	    }
767*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
768*e4b17023SJohn Marino 	    {
769*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
770*e4b17023SJohn Marino 	      __throw_exception_again;
771*e4b17023SJohn Marino 	    }
772*e4b17023SJohn Marino 	  __catch(...)
773*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
774*e4b17023SJohn Marino 	  if (__err)
775*e4b17023SJohn Marino 	    this->setstate(__err);
776*e4b17023SJohn Marino 	}
777*e4b17023SJohn Marino       return *this;
778*e4b17023SJohn Marino     }
779*e4b17023SJohn Marino 
780*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
781*e4b17023SJohn Marino     int
782*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
sync(void)783*e4b17023SJohn Marino     sync(void)
784*e4b17023SJohn Marino     {
785*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
786*e4b17023SJohn Marino       // DR60.  Do not change _M_gcount.
787*e4b17023SJohn Marino       int __ret = -1;
788*e4b17023SJohn Marino       sentry __cerb(*this, true);
789*e4b17023SJohn Marino       if (__cerb)
790*e4b17023SJohn Marino 	{
791*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
792*e4b17023SJohn Marino 	  __try
793*e4b17023SJohn Marino 	    {
794*e4b17023SJohn Marino 	      __streambuf_type* __sb = this->rdbuf();
795*e4b17023SJohn Marino 	      if (__sb)
796*e4b17023SJohn Marino 		{
797*e4b17023SJohn Marino 		  if (__sb->pubsync() == -1)
798*e4b17023SJohn Marino 		    __err |= ios_base::badbit;
799*e4b17023SJohn Marino 		  else
800*e4b17023SJohn Marino 		    __ret = 0;
801*e4b17023SJohn Marino 		}
802*e4b17023SJohn Marino 	    }
803*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
804*e4b17023SJohn Marino 	    {
805*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
806*e4b17023SJohn Marino 	      __throw_exception_again;
807*e4b17023SJohn Marino 	    }
808*e4b17023SJohn Marino 	  __catch(...)
809*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
810*e4b17023SJohn Marino 	  if (__err)
811*e4b17023SJohn Marino 	    this->setstate(__err);
812*e4b17023SJohn Marino 	}
813*e4b17023SJohn Marino       return __ret;
814*e4b17023SJohn Marino     }
815*e4b17023SJohn Marino 
816*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
817*e4b17023SJohn Marino     typename basic_istream<_CharT, _Traits>::pos_type
818*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
tellg(void)819*e4b17023SJohn Marino     tellg(void)
820*e4b17023SJohn Marino     {
821*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
822*e4b17023SJohn Marino       // DR60.  Do not change _M_gcount.
823*e4b17023SJohn Marino       pos_type __ret = pos_type(-1);
824*e4b17023SJohn Marino       sentry __cerb(*this, true);
825*e4b17023SJohn Marino       if (__cerb)
826*e4b17023SJohn Marino 	{
827*e4b17023SJohn Marino 	  __try
828*e4b17023SJohn Marino 	    {
829*e4b17023SJohn Marino 	      if (!this->fail())
830*e4b17023SJohn Marino 		__ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
831*e4b17023SJohn Marino 						  ios_base::in);
832*e4b17023SJohn Marino 	    }
833*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
834*e4b17023SJohn Marino 	    {
835*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
836*e4b17023SJohn Marino 	      __throw_exception_again;
837*e4b17023SJohn Marino 	    }
838*e4b17023SJohn Marino 	  __catch(...)
839*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
840*e4b17023SJohn Marino 	}
841*e4b17023SJohn Marino       return __ret;
842*e4b17023SJohn Marino     }
843*e4b17023SJohn Marino 
844*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
845*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
846*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
seekg(pos_type __pos)847*e4b17023SJohn Marino     seekg(pos_type __pos)
848*e4b17023SJohn Marino     {
849*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
850*e4b17023SJohn Marino       // DR60.  Do not change _M_gcount.
851*e4b17023SJohn Marino       // Clear eofbit per N3168.
852*e4b17023SJohn Marino       this->clear(this->rdstate() & ~ios_base::eofbit);
853*e4b17023SJohn Marino       sentry __cerb(*this, true);
854*e4b17023SJohn Marino       if (__cerb)
855*e4b17023SJohn Marino 	{
856*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
857*e4b17023SJohn Marino 	  __try
858*e4b17023SJohn Marino 	    {
859*e4b17023SJohn Marino 	      if (!this->fail())
860*e4b17023SJohn Marino 		{
861*e4b17023SJohn Marino 		  // 136.  seekp, seekg setting wrong streams?
862*e4b17023SJohn Marino 		  const pos_type __p = this->rdbuf()->pubseekpos(__pos,
863*e4b17023SJohn Marino 								 ios_base::in);
864*e4b17023SJohn Marino 
865*e4b17023SJohn Marino 		  // 129.  Need error indication from seekp() and seekg()
866*e4b17023SJohn Marino 		  if (__p == pos_type(off_type(-1)))
867*e4b17023SJohn Marino 		    __err |= ios_base::failbit;
868*e4b17023SJohn Marino 		}
869*e4b17023SJohn Marino 	    }
870*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
871*e4b17023SJohn Marino 	    {
872*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
873*e4b17023SJohn Marino 	      __throw_exception_again;
874*e4b17023SJohn Marino 	    }
875*e4b17023SJohn Marino 	  __catch(...)
876*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
877*e4b17023SJohn Marino 	  if (__err)
878*e4b17023SJohn Marino 	    this->setstate(__err);
879*e4b17023SJohn Marino 	}
880*e4b17023SJohn Marino       return *this;
881*e4b17023SJohn Marino     }
882*e4b17023SJohn Marino 
883*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
884*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
885*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>::
seekg(off_type __off,ios_base::seekdir __dir)886*e4b17023SJohn Marino     seekg(off_type __off, ios_base::seekdir __dir)
887*e4b17023SJohn Marino     {
888*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
889*e4b17023SJohn Marino       // DR60.  Do not change _M_gcount.
890*e4b17023SJohn Marino       // Clear eofbit per N3168.
891*e4b17023SJohn Marino       this->clear(this->rdstate() & ~ios_base::eofbit);
892*e4b17023SJohn Marino       sentry __cerb(*this, true);
893*e4b17023SJohn Marino       if (__cerb)
894*e4b17023SJohn Marino 	{
895*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
896*e4b17023SJohn Marino 	  __try
897*e4b17023SJohn Marino 	    {
898*e4b17023SJohn Marino 	      if (!this->fail())
899*e4b17023SJohn Marino 		{
900*e4b17023SJohn Marino 		  // 136.  seekp, seekg setting wrong streams?
901*e4b17023SJohn Marino 		  const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
902*e4b17023SJohn Marino 								 ios_base::in);
903*e4b17023SJohn Marino 
904*e4b17023SJohn Marino 		  // 129.  Need error indication from seekp() and seekg()
905*e4b17023SJohn Marino 		  if (__p == pos_type(off_type(-1)))
906*e4b17023SJohn Marino 		    __err |= ios_base::failbit;
907*e4b17023SJohn Marino 		}
908*e4b17023SJohn Marino 	    }
909*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
910*e4b17023SJohn Marino 	    {
911*e4b17023SJohn Marino 	      this->_M_setstate(ios_base::badbit);
912*e4b17023SJohn Marino 	      __throw_exception_again;
913*e4b17023SJohn Marino 	    }
914*e4b17023SJohn Marino 	  __catch(...)
915*e4b17023SJohn Marino 	    { this->_M_setstate(ios_base::badbit); }
916*e4b17023SJohn Marino 	  if (__err)
917*e4b17023SJohn Marino 	    this->setstate(__err);
918*e4b17023SJohn Marino 	}
919*e4b17023SJohn Marino       return *this;
920*e4b17023SJohn Marino     }
921*e4b17023SJohn Marino 
922*e4b17023SJohn Marino   // 27.6.1.2.3 Character extraction templates
923*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
924*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT & __c)925*e4b17023SJohn Marino     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
926*e4b17023SJohn Marino     {
927*e4b17023SJohn Marino       typedef basic_istream<_CharT, _Traits>		__istream_type;
928*e4b17023SJohn Marino       typedef typename __istream_type::int_type         __int_type;
929*e4b17023SJohn Marino 
930*e4b17023SJohn Marino       typename __istream_type::sentry __cerb(__in, false);
931*e4b17023SJohn Marino       if (__cerb)
932*e4b17023SJohn Marino 	{
933*e4b17023SJohn Marino 	  ios_base::iostate __err = ios_base::goodbit;
934*e4b17023SJohn Marino 	  __try
935*e4b17023SJohn Marino 	    {
936*e4b17023SJohn Marino 	      const __int_type __cb = __in.rdbuf()->sbumpc();
937*e4b17023SJohn Marino 	      if (!_Traits::eq_int_type(__cb, _Traits::eof()))
938*e4b17023SJohn Marino 		__c = _Traits::to_char_type(__cb);
939*e4b17023SJohn Marino 	      else
940*e4b17023SJohn Marino 		__err |= (ios_base::eofbit | ios_base::failbit);
941*e4b17023SJohn Marino 	    }
942*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
943*e4b17023SJohn Marino 	    {
944*e4b17023SJohn Marino 	      __in._M_setstate(ios_base::badbit);
945*e4b17023SJohn Marino 	      __throw_exception_again;
946*e4b17023SJohn Marino 	    }
947*e4b17023SJohn Marino 	  __catch(...)
948*e4b17023SJohn Marino 	    { __in._M_setstate(ios_base::badbit); }
949*e4b17023SJohn Marino 	  if (__err)
950*e4b17023SJohn Marino 	    __in.setstate(__err);
951*e4b17023SJohn Marino 	}
952*e4b17023SJohn Marino       return __in;
953*e4b17023SJohn Marino     }
954*e4b17023SJohn Marino 
955*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
956*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT * __s)957*e4b17023SJohn Marino     operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
958*e4b17023SJohn Marino     {
959*e4b17023SJohn Marino       typedef basic_istream<_CharT, _Traits>		__istream_type;
960*e4b17023SJohn Marino       typedef basic_streambuf<_CharT, _Traits>          __streambuf_type;
961*e4b17023SJohn Marino       typedef typename _Traits::int_type		int_type;
962*e4b17023SJohn Marino       typedef _CharT					char_type;
963*e4b17023SJohn Marino       typedef ctype<_CharT>				__ctype_type;
964*e4b17023SJohn Marino 
965*e4b17023SJohn Marino       streamsize __extracted = 0;
966*e4b17023SJohn Marino       ios_base::iostate __err = ios_base::goodbit;
967*e4b17023SJohn Marino       typename __istream_type::sentry __cerb(__in, false);
968*e4b17023SJohn Marino       if (__cerb)
969*e4b17023SJohn Marino 	{
970*e4b17023SJohn Marino 	  __try
971*e4b17023SJohn Marino 	    {
972*e4b17023SJohn Marino 	      // Figure out how many characters to extract.
973*e4b17023SJohn Marino 	      streamsize __num = __in.width();
974*e4b17023SJohn Marino 	      if (__num <= 0)
975*e4b17023SJohn Marino 		__num = __gnu_cxx::__numeric_traits<streamsize>::__max;
976*e4b17023SJohn Marino 
977*e4b17023SJohn Marino 	      const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
978*e4b17023SJohn Marino 
979*e4b17023SJohn Marino 	      const int_type __eof = _Traits::eof();
980*e4b17023SJohn Marino 	      __streambuf_type* __sb = __in.rdbuf();
981*e4b17023SJohn Marino 	      int_type __c = __sb->sgetc();
982*e4b17023SJohn Marino 
983*e4b17023SJohn Marino 	      while (__extracted < __num - 1
984*e4b17023SJohn Marino 		     && !_Traits::eq_int_type(__c, __eof)
985*e4b17023SJohn Marino 		     && !__ct.is(ctype_base::space,
986*e4b17023SJohn Marino 				 _Traits::to_char_type(__c)))
987*e4b17023SJohn Marino 		{
988*e4b17023SJohn Marino 		  *__s++ = _Traits::to_char_type(__c);
989*e4b17023SJohn Marino 		  ++__extracted;
990*e4b17023SJohn Marino 		  __c = __sb->snextc();
991*e4b17023SJohn Marino 		}
992*e4b17023SJohn Marino 	      if (_Traits::eq_int_type(__c, __eof))
993*e4b17023SJohn Marino 		__err |= ios_base::eofbit;
994*e4b17023SJohn Marino 
995*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
996*e4b17023SJohn Marino 	      // 68.  Extractors for char* should store null at end
997*e4b17023SJohn Marino 	      *__s = char_type();
998*e4b17023SJohn Marino 	      __in.width(0);
999*e4b17023SJohn Marino 	    }
1000*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
1001*e4b17023SJohn Marino 	    {
1002*e4b17023SJohn Marino 	      __in._M_setstate(ios_base::badbit);
1003*e4b17023SJohn Marino 	      __throw_exception_again;
1004*e4b17023SJohn Marino 	    }
1005*e4b17023SJohn Marino 	  __catch(...)
1006*e4b17023SJohn Marino 	    { __in._M_setstate(ios_base::badbit); }
1007*e4b17023SJohn Marino 	}
1008*e4b17023SJohn Marino       if (!__extracted)
1009*e4b17023SJohn Marino 	__err |= ios_base::failbit;
1010*e4b17023SJohn Marino       if (__err)
1011*e4b17023SJohn Marino 	__in.setstate(__err);
1012*e4b17023SJohn Marino       return __in;
1013*e4b17023SJohn Marino     }
1014*e4b17023SJohn Marino 
1015*e4b17023SJohn Marino   // 27.6.1.4 Standard basic_istream manipulators
1016*e4b17023SJohn Marino   template<typename _CharT, typename _Traits>
1017*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
ws(basic_istream<_CharT,_Traits> & __in)1018*e4b17023SJohn Marino     ws(basic_istream<_CharT, _Traits>& __in)
1019*e4b17023SJohn Marino     {
1020*e4b17023SJohn Marino       typedef basic_istream<_CharT, _Traits>		__istream_type;
1021*e4b17023SJohn Marino       typedef basic_streambuf<_CharT, _Traits>          __streambuf_type;
1022*e4b17023SJohn Marino       typedef typename __istream_type::int_type		__int_type;
1023*e4b17023SJohn Marino       typedef ctype<_CharT>				__ctype_type;
1024*e4b17023SJohn Marino 
1025*e4b17023SJohn Marino       const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
1026*e4b17023SJohn Marino       const __int_type __eof = _Traits::eof();
1027*e4b17023SJohn Marino       __streambuf_type* __sb = __in.rdbuf();
1028*e4b17023SJohn Marino       __int_type __c = __sb->sgetc();
1029*e4b17023SJohn Marino 
1030*e4b17023SJohn Marino       while (!_Traits::eq_int_type(__c, __eof)
1031*e4b17023SJohn Marino 	     && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
1032*e4b17023SJohn Marino 	__c = __sb->snextc();
1033*e4b17023SJohn Marino 
1034*e4b17023SJohn Marino        if (_Traits::eq_int_type(__c, __eof))
1035*e4b17023SJohn Marino 	 __in.setstate(ios_base::eofbit);
1036*e4b17023SJohn Marino       return __in;
1037*e4b17023SJohn Marino     }
1038*e4b17023SJohn Marino 
1039*e4b17023SJohn Marino   // Inhibit implicit instantiations for required instantiations,
1040*e4b17023SJohn Marino   // which are defined via explicit instantiations elsewhere.
1041*e4b17023SJohn Marino #if _GLIBCXX_EXTERN_TEMPLATE
1042*e4b17023SJohn Marino   extern template class basic_istream<char>;
1043*e4b17023SJohn Marino   extern template istream& ws(istream&);
1044*e4b17023SJohn Marino   extern template istream& operator>>(istream&, char&);
1045*e4b17023SJohn Marino   extern template istream& operator>>(istream&, char*);
1046*e4b17023SJohn Marino   extern template istream& operator>>(istream&, unsigned char&);
1047*e4b17023SJohn Marino   extern template istream& operator>>(istream&, signed char&);
1048*e4b17023SJohn Marino   extern template istream& operator>>(istream&, unsigned char*);
1049*e4b17023SJohn Marino   extern template istream& operator>>(istream&, signed char*);
1050*e4b17023SJohn Marino 
1051*e4b17023SJohn Marino   extern template istream& istream::_M_extract(unsigned short&);
1052*e4b17023SJohn Marino   extern template istream& istream::_M_extract(unsigned int&);
1053*e4b17023SJohn Marino   extern template istream& istream::_M_extract(long&);
1054*e4b17023SJohn Marino   extern template istream& istream::_M_extract(unsigned long&);
1055*e4b17023SJohn Marino   extern template istream& istream::_M_extract(bool&);
1056*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_LONG_LONG
1057*e4b17023SJohn Marino   extern template istream& istream::_M_extract(long long&);
1058*e4b17023SJohn Marino   extern template istream& istream::_M_extract(unsigned long long&);
1059*e4b17023SJohn Marino #endif
1060*e4b17023SJohn Marino   extern template istream& istream::_M_extract(float&);
1061*e4b17023SJohn Marino   extern template istream& istream::_M_extract(double&);
1062*e4b17023SJohn Marino   extern template istream& istream::_M_extract(long double&);
1063*e4b17023SJohn Marino   extern template istream& istream::_M_extract(void*&);
1064*e4b17023SJohn Marino 
1065*e4b17023SJohn Marino   extern template class basic_iostream<char>;
1066*e4b17023SJohn Marino 
1067*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_WCHAR_T
1068*e4b17023SJohn Marino   extern template class basic_istream<wchar_t>;
1069*e4b17023SJohn Marino   extern template wistream& ws(wistream&);
1070*e4b17023SJohn Marino   extern template wistream& operator>>(wistream&, wchar_t&);
1071*e4b17023SJohn Marino   extern template wistream& operator>>(wistream&, wchar_t*);
1072*e4b17023SJohn Marino 
1073*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(unsigned short&);
1074*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(unsigned int&);
1075*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(long&);
1076*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(unsigned long&);
1077*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(bool&);
1078*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_LONG_LONG
1079*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(long long&);
1080*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(unsigned long long&);
1081*e4b17023SJohn Marino #endif
1082*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(float&);
1083*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(double&);
1084*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(long double&);
1085*e4b17023SJohn Marino   extern template wistream& wistream::_M_extract(void*&);
1086*e4b17023SJohn Marino 
1087*e4b17023SJohn Marino   extern template class basic_iostream<wchar_t>;
1088*e4b17023SJohn Marino #endif
1089*e4b17023SJohn Marino #endif
1090*e4b17023SJohn Marino 
1091*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
1092*e4b17023SJohn Marino } // namespace std
1093*e4b17023SJohn Marino 
1094*e4b17023SJohn Marino #endif
1095