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 41namespace 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