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