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