1 // istream classes -*- C++ -*-
2 
3 // Copyright (C) 1997-2014 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::
sentry(basic_istream<_CharT,_Traits> & __in,bool __noskip)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>::
_M_extract(_ValueT & __v)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>::
operator >>(short & __n)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>::
operator >>(int & __n)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>::
operator >>(__streambuf_type * __sbout)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>::
get(void)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>::
get(char_type & __c)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>::
get(char_type * __s,streamsize __n,char_type __delim)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>::
get(__streambuf_type & __sb,char_type __delim)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>::
getline(char_type * __s,streamsize __n,char_type __delim)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>::
ignore(void)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>::
ignore(streamsize __n)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>::
ignore(streamsize __n,int_type __delim)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>::
peek(void)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>::
read(char_type * __s,streamsize __n)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>::
readsome(char_type * __s,streamsize __n)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>::
putback(char_type __c)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>::
unget(void)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>::
sync(void)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>::
tellg(void)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>::
seekg(pos_type __pos)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>::
seekg(off_type __off,ios_base::seekdir __dir)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>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT & __c)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>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT * __s)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>&
ws(basic_istream<_CharT,_Traits> & __in)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