1*38fd1498Szrj // Input streams -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2004-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj // 26*38fd1498Szrj // ISO C++ 14882: 27.6.1 Input streams 27*38fd1498Szrj // 28*38fd1498Szrj 29*38fd1498Szrj #include <istream> 30*38fd1498Szrj 31*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default) 32*38fd1498Szrj { 33*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION 34*38fd1498Szrj 35*38fd1498Szrj template<> 36*38fd1498Szrj basic_istream<char>& 37*38fd1498Szrj basic_istream<char>:: getline(char_type * __s,streamsize __n,char_type __delim)38*38fd1498Szrj getline(char_type* __s, streamsize __n, char_type __delim) 39*38fd1498Szrj { 40*38fd1498Szrj _M_gcount = 0; 41*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 42*38fd1498Szrj sentry __cerb(*this, true); 43*38fd1498Szrj if (__cerb) 44*38fd1498Szrj { 45*38fd1498Szrj __try 46*38fd1498Szrj { 47*38fd1498Szrj const int_type __idelim = traits_type::to_int_type(__delim); 48*38fd1498Szrj const int_type __eof = traits_type::eof(); 49*38fd1498Szrj __streambuf_type* __sb = this->rdbuf(); 50*38fd1498Szrj int_type __c = __sb->sgetc(); 51*38fd1498Szrj 52*38fd1498Szrj while (_M_gcount + 1 < __n 53*38fd1498Szrj && !traits_type::eq_int_type(__c, __eof) 54*38fd1498Szrj && !traits_type::eq_int_type(__c, __idelim)) 55*38fd1498Szrj { 56*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 57*38fd1498Szrj - __sb->gptr()), 58*38fd1498Szrj streamsize(__n - _M_gcount 59*38fd1498Szrj - 1)); 60*38fd1498Szrj if (__size > 1) 61*38fd1498Szrj { 62*38fd1498Szrj const char_type* __p = traits_type::find(__sb->gptr(), 63*38fd1498Szrj __size, 64*38fd1498Szrj __delim); 65*38fd1498Szrj if (__p) 66*38fd1498Szrj __size = __p - __sb->gptr(); 67*38fd1498Szrj traits_type::copy(__s, __sb->gptr(), __size); 68*38fd1498Szrj __s += __size; 69*38fd1498Szrj __sb->__safe_gbump(__size); 70*38fd1498Szrj _M_gcount += __size; 71*38fd1498Szrj __c = __sb->sgetc(); 72*38fd1498Szrj } 73*38fd1498Szrj else 74*38fd1498Szrj { 75*38fd1498Szrj *__s++ = traits_type::to_char_type(__c); 76*38fd1498Szrj ++_M_gcount; 77*38fd1498Szrj __c = __sb->snextc(); 78*38fd1498Szrj } 79*38fd1498Szrj } 80*38fd1498Szrj 81*38fd1498Szrj if (traits_type::eq_int_type(__c, __eof)) 82*38fd1498Szrj __err |= ios_base::eofbit; 83*38fd1498Szrj else if (traits_type::eq_int_type(__c, __idelim)) 84*38fd1498Szrj { 85*38fd1498Szrj ++_M_gcount; 86*38fd1498Szrj __sb->sbumpc(); 87*38fd1498Szrj } 88*38fd1498Szrj else 89*38fd1498Szrj __err |= ios_base::failbit; 90*38fd1498Szrj } 91*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 92*38fd1498Szrj { 93*38fd1498Szrj this->_M_setstate(ios_base::badbit); 94*38fd1498Szrj __throw_exception_again; 95*38fd1498Szrj } 96*38fd1498Szrj __catch(...) 97*38fd1498Szrj { this->_M_setstate(ios_base::badbit); } 98*38fd1498Szrj } 99*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 100*38fd1498Szrj // 243. get and getline when sentry reports failure. 101*38fd1498Szrj if (__n > 0) 102*38fd1498Szrj *__s = char_type(); 103*38fd1498Szrj if (!_M_gcount) 104*38fd1498Szrj __err |= ios_base::failbit; 105*38fd1498Szrj if (__err) 106*38fd1498Szrj this->setstate(__err); 107*38fd1498Szrj return *this; 108*38fd1498Szrj } 109*38fd1498Szrj 110*38fd1498Szrj template<> 111*38fd1498Szrj basic_istream<char>& 112*38fd1498Szrj basic_istream<char>:: ignore(streamsize __n,int_type __delim)113*38fd1498Szrj ignore(streamsize __n, int_type __delim) 114*38fd1498Szrj { 115*38fd1498Szrj if (traits_type::eq_int_type(__delim, traits_type::eof())) 116*38fd1498Szrj return ignore(__n); 117*38fd1498Szrj 118*38fd1498Szrj _M_gcount = 0; 119*38fd1498Szrj sentry __cerb(*this, true); 120*38fd1498Szrj if (__n > 0 && __cerb) 121*38fd1498Szrj { 122*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 123*38fd1498Szrj __try 124*38fd1498Szrj { 125*38fd1498Szrj const char_type __cdelim = traits_type::to_char_type(__delim); 126*38fd1498Szrj const int_type __eof = traits_type::eof(); 127*38fd1498Szrj __streambuf_type* __sb = this->rdbuf(); 128*38fd1498Szrj int_type __c = __sb->sgetc(); 129*38fd1498Szrj 130*38fd1498Szrj bool __large_ignore = false; 131*38fd1498Szrj while (true) 132*38fd1498Szrj { 133*38fd1498Szrj while (_M_gcount < __n 134*38fd1498Szrj && !traits_type::eq_int_type(__c, __eof) 135*38fd1498Szrj && !traits_type::eq_int_type(__c, __delim)) 136*38fd1498Szrj { 137*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 138*38fd1498Szrj - __sb->gptr()), 139*38fd1498Szrj streamsize(__n - _M_gcount)); 140*38fd1498Szrj if (__size > 1) 141*38fd1498Szrj { 142*38fd1498Szrj const char_type* __p = traits_type::find(__sb->gptr(), 143*38fd1498Szrj __size, 144*38fd1498Szrj __cdelim); 145*38fd1498Szrj if (__p) 146*38fd1498Szrj __size = __p - __sb->gptr(); 147*38fd1498Szrj __sb->__safe_gbump(__size); 148*38fd1498Szrj _M_gcount += __size; 149*38fd1498Szrj __c = __sb->sgetc(); 150*38fd1498Szrj } 151*38fd1498Szrj else 152*38fd1498Szrj { 153*38fd1498Szrj ++_M_gcount; 154*38fd1498Szrj __c = __sb->snextc(); 155*38fd1498Szrj } 156*38fd1498Szrj } 157*38fd1498Szrj if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max 158*38fd1498Szrj && !traits_type::eq_int_type(__c, __eof) 159*38fd1498Szrj && !traits_type::eq_int_type(__c, __delim)) 160*38fd1498Szrj { 161*38fd1498Szrj _M_gcount = 162*38fd1498Szrj __gnu_cxx::__numeric_traits<streamsize>::__min; 163*38fd1498Szrj __large_ignore = true; 164*38fd1498Szrj } 165*38fd1498Szrj else 166*38fd1498Szrj break; 167*38fd1498Szrj } 168*38fd1498Szrj 169*38fd1498Szrj if (__large_ignore) 170*38fd1498Szrj _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max; 171*38fd1498Szrj 172*38fd1498Szrj if (traits_type::eq_int_type(__c, __eof)) 173*38fd1498Szrj __err |= ios_base::eofbit; 174*38fd1498Szrj else if (traits_type::eq_int_type(__c, __delim)) 175*38fd1498Szrj { 176*38fd1498Szrj if (_M_gcount 177*38fd1498Szrj < __gnu_cxx::__numeric_traits<streamsize>::__max) 178*38fd1498Szrj ++_M_gcount; 179*38fd1498Szrj __sb->sbumpc(); 180*38fd1498Szrj } 181*38fd1498Szrj } 182*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 183*38fd1498Szrj { 184*38fd1498Szrj this->_M_setstate(ios_base::badbit); 185*38fd1498Szrj __throw_exception_again; 186*38fd1498Szrj } 187*38fd1498Szrj __catch(...) 188*38fd1498Szrj { this->_M_setstate(ios_base::badbit); } 189*38fd1498Szrj if (__err) 190*38fd1498Szrj this->setstate(__err); 191*38fd1498Szrj } 192*38fd1498Szrj return *this; 193*38fd1498Szrj } 194*38fd1498Szrj 195*38fd1498Szrj template<> 196*38fd1498Szrj basic_istream<char>& operator >>(basic_istream<char> & __in,char * __s)197*38fd1498Szrj operator>>(basic_istream<char>& __in, char* __s) 198*38fd1498Szrj { 199*38fd1498Szrj typedef basic_istream<char> __istream_type; 200*38fd1498Szrj typedef __istream_type::int_type __int_type; 201*38fd1498Szrj typedef __istream_type::char_type __char_type; 202*38fd1498Szrj typedef __istream_type::traits_type __traits_type; 203*38fd1498Szrj typedef __istream_type::__streambuf_type __streambuf_type; 204*38fd1498Szrj typedef __istream_type::__ctype_type __ctype_type; 205*38fd1498Szrj 206*38fd1498Szrj streamsize __extracted = 0; 207*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 208*38fd1498Szrj __istream_type::sentry __cerb(__in, false); 209*38fd1498Szrj if (__cerb) 210*38fd1498Szrj { 211*38fd1498Szrj __try 212*38fd1498Szrj { 213*38fd1498Szrj // Figure out how many characters to extract. 214*38fd1498Szrj streamsize __num = __in.width(); 215*38fd1498Szrj if (__num <= 0) 216*38fd1498Szrj __num = __gnu_cxx::__numeric_traits<streamsize>::__max; 217*38fd1498Szrj 218*38fd1498Szrj const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); 219*38fd1498Szrj 220*38fd1498Szrj const __int_type __eof = __traits_type::eof(); 221*38fd1498Szrj __streambuf_type* __sb = __in.rdbuf(); 222*38fd1498Szrj __int_type __c = __sb->sgetc(); 223*38fd1498Szrj 224*38fd1498Szrj while (__extracted < __num - 1 225*38fd1498Szrj && !__traits_type::eq_int_type(__c, __eof) 226*38fd1498Szrj && !__ct.is(ctype_base::space, 227*38fd1498Szrj __traits_type::to_char_type(__c))) 228*38fd1498Szrj { 229*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 230*38fd1498Szrj - __sb->gptr()), 231*38fd1498Szrj streamsize(__num - __extracted 232*38fd1498Szrj - 1)); 233*38fd1498Szrj if (__size > 1) 234*38fd1498Szrj { 235*38fd1498Szrj __size = (__ct.scan_is(ctype_base::space, 236*38fd1498Szrj __sb->gptr() + 1, 237*38fd1498Szrj __sb->gptr() + __size) 238*38fd1498Szrj - __sb->gptr()); 239*38fd1498Szrj __traits_type::copy(__s, __sb->gptr(), __size); 240*38fd1498Szrj __s += __size; 241*38fd1498Szrj __sb->__safe_gbump(__size); 242*38fd1498Szrj __extracted += __size; 243*38fd1498Szrj __c = __sb->sgetc(); 244*38fd1498Szrj } 245*38fd1498Szrj else 246*38fd1498Szrj { 247*38fd1498Szrj *__s++ = __traits_type::to_char_type(__c); 248*38fd1498Szrj ++__extracted; 249*38fd1498Szrj __c = __sb->snextc(); 250*38fd1498Szrj } 251*38fd1498Szrj } 252*38fd1498Szrj 253*38fd1498Szrj if (__traits_type::eq_int_type(__c, __eof)) 254*38fd1498Szrj __err |= ios_base::eofbit; 255*38fd1498Szrj 256*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 257*38fd1498Szrj // 68. Extractors for char* should store null at end 258*38fd1498Szrj *__s = __char_type(); 259*38fd1498Szrj __in.width(0); 260*38fd1498Szrj } 261*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 262*38fd1498Szrj { 263*38fd1498Szrj __in._M_setstate(ios_base::badbit); 264*38fd1498Szrj __throw_exception_again; 265*38fd1498Szrj } 266*38fd1498Szrj __catch(...) 267*38fd1498Szrj { __in._M_setstate(ios_base::badbit); } 268*38fd1498Szrj } 269*38fd1498Szrj if (!__extracted) 270*38fd1498Szrj __err |= ios_base::failbit; 271*38fd1498Szrj if (__err) 272*38fd1498Szrj __in.setstate(__err); 273*38fd1498Szrj return __in; 274*38fd1498Szrj } 275*38fd1498Szrj 276*38fd1498Szrj #ifdef _GLIBCXX_USE_WCHAR_T 277*38fd1498Szrj template<> 278*38fd1498Szrj basic_istream<wchar_t>& 279*38fd1498Szrj basic_istream<wchar_t>:: getline(char_type * __s,streamsize __n,char_type __delim)280*38fd1498Szrj getline(char_type* __s, streamsize __n, char_type __delim) 281*38fd1498Szrj { 282*38fd1498Szrj _M_gcount = 0; 283*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 284*38fd1498Szrj sentry __cerb(*this, true); 285*38fd1498Szrj if (__cerb) 286*38fd1498Szrj { 287*38fd1498Szrj __try 288*38fd1498Szrj { 289*38fd1498Szrj const int_type __idelim = traits_type::to_int_type(__delim); 290*38fd1498Szrj const int_type __eof = traits_type::eof(); 291*38fd1498Szrj __streambuf_type* __sb = this->rdbuf(); 292*38fd1498Szrj int_type __c = __sb->sgetc(); 293*38fd1498Szrj 294*38fd1498Szrj while (_M_gcount + 1 < __n 295*38fd1498Szrj && !traits_type::eq_int_type(__c, __eof) 296*38fd1498Szrj && !traits_type::eq_int_type(__c, __idelim)) 297*38fd1498Szrj { 298*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 299*38fd1498Szrj - __sb->gptr()), 300*38fd1498Szrj streamsize(__n - _M_gcount 301*38fd1498Szrj - 1)); 302*38fd1498Szrj if (__size > 1) 303*38fd1498Szrj { 304*38fd1498Szrj const char_type* __p = traits_type::find(__sb->gptr(), 305*38fd1498Szrj __size, 306*38fd1498Szrj __delim); 307*38fd1498Szrj if (__p) 308*38fd1498Szrj __size = __p - __sb->gptr(); 309*38fd1498Szrj traits_type::copy(__s, __sb->gptr(), __size); 310*38fd1498Szrj __s += __size; 311*38fd1498Szrj __sb->__safe_gbump(__size); 312*38fd1498Szrj _M_gcount += __size; 313*38fd1498Szrj __c = __sb->sgetc(); 314*38fd1498Szrj } 315*38fd1498Szrj else 316*38fd1498Szrj { 317*38fd1498Szrj *__s++ = traits_type::to_char_type(__c); 318*38fd1498Szrj ++_M_gcount; 319*38fd1498Szrj __c = __sb->snextc(); 320*38fd1498Szrj } 321*38fd1498Szrj } 322*38fd1498Szrj 323*38fd1498Szrj if (traits_type::eq_int_type(__c, __eof)) 324*38fd1498Szrj __err |= ios_base::eofbit; 325*38fd1498Szrj else if (traits_type::eq_int_type(__c, __idelim)) 326*38fd1498Szrj { 327*38fd1498Szrj ++_M_gcount; 328*38fd1498Szrj __sb->sbumpc(); 329*38fd1498Szrj } 330*38fd1498Szrj else 331*38fd1498Szrj __err |= ios_base::failbit; 332*38fd1498Szrj } 333*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 334*38fd1498Szrj { 335*38fd1498Szrj this->_M_setstate(ios_base::badbit); 336*38fd1498Szrj __throw_exception_again; 337*38fd1498Szrj } 338*38fd1498Szrj __catch(...) 339*38fd1498Szrj { this->_M_setstate(ios_base::badbit); } 340*38fd1498Szrj } 341*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 342*38fd1498Szrj // 243. get and getline when sentry reports failure. 343*38fd1498Szrj if (__n > 0) 344*38fd1498Szrj *__s = char_type(); 345*38fd1498Szrj if (!_M_gcount) 346*38fd1498Szrj __err |= ios_base::failbit; 347*38fd1498Szrj if (__err) 348*38fd1498Szrj this->setstate(__err); 349*38fd1498Szrj return *this; 350*38fd1498Szrj } 351*38fd1498Szrj 352*38fd1498Szrj template<> 353*38fd1498Szrj basic_istream<wchar_t>& 354*38fd1498Szrj basic_istream<wchar_t>:: ignore(streamsize __n,int_type __delim)355*38fd1498Szrj ignore(streamsize __n, int_type __delim) 356*38fd1498Szrj { 357*38fd1498Szrj if (traits_type::eq_int_type(__delim, traits_type::eof())) 358*38fd1498Szrj return ignore(__n); 359*38fd1498Szrj 360*38fd1498Szrj _M_gcount = 0; 361*38fd1498Szrj sentry __cerb(*this, true); 362*38fd1498Szrj if (__n > 0 && __cerb) 363*38fd1498Szrj { 364*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 365*38fd1498Szrj __try 366*38fd1498Szrj { 367*38fd1498Szrj const char_type __cdelim = traits_type::to_char_type(__delim); 368*38fd1498Szrj const int_type __eof = traits_type::eof(); 369*38fd1498Szrj __streambuf_type* __sb = this->rdbuf(); 370*38fd1498Szrj int_type __c = __sb->sgetc(); 371*38fd1498Szrj 372*38fd1498Szrj bool __large_ignore = false; 373*38fd1498Szrj while (true) 374*38fd1498Szrj { 375*38fd1498Szrj while (_M_gcount < __n 376*38fd1498Szrj && !traits_type::eq_int_type(__c, __eof) 377*38fd1498Szrj && !traits_type::eq_int_type(__c, __delim)) 378*38fd1498Szrj { 379*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 380*38fd1498Szrj - __sb->gptr()), 381*38fd1498Szrj streamsize(__n - _M_gcount)); 382*38fd1498Szrj if (__size > 1) 383*38fd1498Szrj { 384*38fd1498Szrj const char_type* __p = traits_type::find(__sb->gptr(), 385*38fd1498Szrj __size, 386*38fd1498Szrj __cdelim); 387*38fd1498Szrj if (__p) 388*38fd1498Szrj __size = __p - __sb->gptr(); 389*38fd1498Szrj __sb->__safe_gbump(__size); 390*38fd1498Szrj _M_gcount += __size; 391*38fd1498Szrj __c = __sb->sgetc(); 392*38fd1498Szrj } 393*38fd1498Szrj else 394*38fd1498Szrj { 395*38fd1498Szrj ++_M_gcount; 396*38fd1498Szrj __c = __sb->snextc(); 397*38fd1498Szrj } 398*38fd1498Szrj } 399*38fd1498Szrj if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max 400*38fd1498Szrj && !traits_type::eq_int_type(__c, __eof) 401*38fd1498Szrj && !traits_type::eq_int_type(__c, __delim)) 402*38fd1498Szrj { 403*38fd1498Szrj _M_gcount = 404*38fd1498Szrj __gnu_cxx::__numeric_traits<streamsize>::__min; 405*38fd1498Szrj __large_ignore = true; 406*38fd1498Szrj } 407*38fd1498Szrj else 408*38fd1498Szrj break; 409*38fd1498Szrj } 410*38fd1498Szrj 411*38fd1498Szrj if (__large_ignore) 412*38fd1498Szrj _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max; 413*38fd1498Szrj 414*38fd1498Szrj if (traits_type::eq_int_type(__c, __eof)) 415*38fd1498Szrj __err |= ios_base::eofbit; 416*38fd1498Szrj else if (traits_type::eq_int_type(__c, __delim)) 417*38fd1498Szrj { 418*38fd1498Szrj if (_M_gcount 419*38fd1498Szrj < __gnu_cxx::__numeric_traits<streamsize>::__max) 420*38fd1498Szrj ++_M_gcount; 421*38fd1498Szrj __sb->sbumpc(); 422*38fd1498Szrj } 423*38fd1498Szrj } 424*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 425*38fd1498Szrj { 426*38fd1498Szrj this->_M_setstate(ios_base::badbit); 427*38fd1498Szrj __throw_exception_again; 428*38fd1498Szrj } 429*38fd1498Szrj __catch(...) 430*38fd1498Szrj { this->_M_setstate(ios_base::badbit); } 431*38fd1498Szrj if (__err) 432*38fd1498Szrj this->setstate(__err); 433*38fd1498Szrj } 434*38fd1498Szrj return *this; 435*38fd1498Szrj } 436*38fd1498Szrj #endif 437*38fd1498Szrj 438*38fd1498Szrj 439*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION 440*38fd1498Szrj } // namespace 441