• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-armeabi-2013.11/arm-none-eabi/include/c++/4.8.1/bits/
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
41namespace 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