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