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