1 // istream classes -*- C++ -*-
3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 // Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING. If not, write to the Free
19 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
32 // ISO C++ 14882: 27.6.2 Output streams
35 #pragma GCC system_header
38 #include <ostream> // For flush()
42 template<typename _CharT, typename _Traits>
43 basic_istream<_CharT, _Traits>::sentry::
44 sentry(basic_istream<_CharT, _Traits>& __in, bool __noskipws)
50 if (!__noskipws && (__in.flags() & ios_base::skipws))
52 const __int_type __eof = traits_type::eof();
53 __streambuf_type* __sb = __in.rdbuf();
54 __int_type __c = __sb->sgetc();
56 if (__in._M_check_facet(__in._M_fctype))
57 while (!traits_type::eq_int_type(__c, __eof)
58 && __in._M_fctype->is(ctype_base::space,
59 traits_type::to_char_type(__c)))
62 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
63 //195. Should basic_istream::sentry's constructor ever set eofbit?
64 if (traits_type::eq_int_type(__c, __eof))
65 __in.setstate(ios_base::eofbit);
75 __in.setstate(ios_base::failbit);
79 template<typename _CharT, typename _Traits>
80 basic_istream<_CharT, _Traits>&
81 basic_istream<_CharT, _Traits>::
82 operator>>(__istream_type& (*__pf)(__istream_type&))
88 template<typename _CharT, typename _Traits>
89 basic_istream<_CharT, _Traits>&
90 basic_istream<_CharT, _Traits>::
91 operator>>(__ios_type& (*__pf)(__ios_type&))
97 template<typename _CharT, typename _Traits>
98 basic_istream<_CharT, _Traits>&
99 basic_istream<_CharT, _Traits>::
100 operator>>(ios_base& (*__pf)(ios_base&))
106 template<typename _CharT, typename _Traits>
107 basic_istream<_CharT, _Traits>&
108 basic_istream<_CharT, _Traits>::
109 operator>>(bool& __n)
111 sentry __cerb(*this, false);
116 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
117 if (_M_check_facet(this->_M_fnumget))
118 this->_M_fnumget->get(*this, 0, *this, __err, __n);
119 this->setstate(__err);
123 // 27.6.1.2.1 Common requirements.
124 // Turn this on without causing an ios::failure to be thrown.
125 this->_M_setstate(ios_base::badbit);
126 if ((this->exceptions() & ios_base::badbit) != 0)
127 __throw_exception_again;
133 template<typename _CharT, typename _Traits>
134 basic_istream<_CharT, _Traits>&
135 basic_istream<_CharT, _Traits>::
136 operator>>(short& __n)
138 sentry __cerb(*this, false);
143 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
145 if (_M_check_facet(this->_M_fnumget))
146 this->_M_fnumget->get(*this, 0, *this, __err, __l);
147 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
148 // 118. basic_istream uses nonexistent num_get member functions.
149 if (!(__err & ios_base::failbit)
150 && (numeric_limits<short>::min() <= __l
151 && __l <= numeric_limits<short>::max()))
154 __err |= ios_base::failbit;
156 this->setstate(__err);
160 // 27.6.1.2.1 Common requirements.
161 // Turn this on without causing an ios::failure to be thrown.
162 this->_M_setstate(ios_base::badbit);
163 if ((this->exceptions() & ios_base::badbit) != 0)
164 __throw_exception_again;
170 template<typename _CharT, typename _Traits>
171 basic_istream<_CharT, _Traits>&
172 basic_istream<_CharT, _Traits>::
173 operator>>(unsigned short& __n)
175 sentry __cerb(*this, false);
180 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
181 if (_M_check_facet(this->_M_fnumget))
182 this->_M_fnumget->get(*this, 0, *this, __err, __n);
183 this->setstate(__err);
187 // 27.6.1.2.1 Common requirements.
188 // Turn this on without causing an ios::failure to be thrown.
189 this->_M_setstate(ios_base::badbit);
190 if ((this->exceptions() & ios_base::badbit) != 0)
191 __throw_exception_again;
197 template<typename _CharT, typename _Traits>
198 basic_istream<_CharT, _Traits>&
199 basic_istream<_CharT, _Traits>::
202 sentry __cerb(*this, false);
207 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
209 if (_M_check_facet(this->_M_fnumget))
210 this->_M_fnumget->get(*this, 0, *this, __err, __l);
211 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
212 // 118. basic_istream uses nonexistent num_get member functions.
213 if (!(__err & ios_base::failbit)
214 && (numeric_limits<int>::min() <= __l
215 && __l <= numeric_limits<int>::max()))
218 __err |= ios_base::failbit;
220 this->setstate(__err);
224 // 27.6.1.2.1 Common requirements.
225 // Turn this on without causing an ios::failure to be thrown.
226 this->_M_setstate(ios_base::badbit);
227 if ((this->exceptions() & ios_base::badbit) != 0)
228 __throw_exception_again;
234 template<typename _CharT, typename _Traits>
235 basic_istream<_CharT, _Traits>&
236 basic_istream<_CharT, _Traits>::
237 operator>>(unsigned int& __n)
239 sentry __cerb(*this, false);
244 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
245 if (_M_check_facet(this->_M_fnumget))
246 this->_M_fnumget->get(*this, 0, *this, __err, __n);
247 this->setstate(__err);
251 // 27.6.1.2.1 Common requirements.
252 // Turn this on without causing an ios::failure to be thrown.
253 this->_M_setstate(ios_base::badbit);
254 if ((this->exceptions() & ios_base::badbit) != 0)
255 __throw_exception_again;
261 template<typename _CharT, typename _Traits>
262 basic_istream<_CharT, _Traits>&
263 basic_istream<_CharT, _Traits>::
264 operator>>(long& __n)
266 sentry __cerb(*this, false);
271 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
272 if (_M_check_facet(this->_M_fnumget))
273 this->_M_fnumget->get(*this, 0, *this, __err, __n);
274 this->setstate(__err);
278 // 27.6.1.2.1 Common requirements.
279 // Turn this on without causing an ios::failure to be thrown.
280 this->_M_setstate(ios_base::badbit);
281 if ((this->exceptions() & ios_base::badbit) != 0)
282 __throw_exception_again;
288 template<typename _CharT, typename _Traits>
289 basic_istream<_CharT, _Traits>&
290 basic_istream<_CharT, _Traits>::
291 operator>>(unsigned long& __n)
293 sentry __cerb(*this, false);
298 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
299 if (_M_check_facet(this->_M_fnumget))
300 this->_M_fnumget->get(*this, 0, *this, __err, __n);
301 this->setstate(__err);
305 // 27.6.1.2.1 Common requirements.
306 // Turn this on without causing an ios::failure to be thrown.
307 this->_M_setstate(ios_base::badbit);
308 if ((this->exceptions() & ios_base::badbit) != 0)
309 __throw_exception_again;
315 #ifdef _GLIBCPP_USE_LONG_LONG
316 template<typename _CharT, typename _Traits>
317 basic_istream<_CharT, _Traits>&
318 basic_istream<_CharT, _Traits>::
319 operator>>(long long& __n)
321 sentry __cerb(*this, false);
326 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
327 if (_M_check_facet(this->_M_fnumget))
328 this->_M_fnumget->get(*this, 0, *this, __err, __n);
329 this->setstate(__err);
333 // 27.6.1.2.1 Common requirements.
334 // Turn this on without causing an ios::failure to be thrown.
335 this->_M_setstate(ios_base::badbit);
336 if ((this->exceptions() & ios_base::badbit) != 0)
337 __throw_exception_again;
343 template<typename _CharT, typename _Traits>
344 basic_istream<_CharT, _Traits>&
345 basic_istream<_CharT, _Traits>::
346 operator>>(unsigned long long& __n)
348 sentry __cerb(*this, false);
353 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
354 if (_M_check_facet(this->_M_fnumget))
355 this->_M_fnumget->get(*this, 0, *this, __err, __n);
356 this->setstate(__err);
360 // 27.6.1.2.1 Common requirements.
361 // Turn this on without causing an ios::failure to be thrown.
362 this->_M_setstate(ios_base::badbit);
363 if ((this->exceptions() & ios_base::badbit) != 0)
364 __throw_exception_again;
371 template<typename _CharT, typename _Traits>
372 basic_istream<_CharT, _Traits>&
373 basic_istream<_CharT, _Traits>::
374 operator>>(float& __n)
376 sentry __cerb(*this, false);
381 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
382 if (_M_check_facet(this->_M_fnumget))
383 this->_M_fnumget->get(*this, 0, *this, __err, __n);
384 this->setstate(__err);
388 // 27.6.1.2.1 Common requirements.
389 // Turn this on without causing an ios::failure to be thrown.
390 this->_M_setstate(ios_base::badbit);
391 if ((this->exceptions() & ios_base::badbit) != 0)
392 __throw_exception_again;
398 template<typename _CharT, typename _Traits>
399 basic_istream<_CharT, _Traits>&
400 basic_istream<_CharT, _Traits>::
401 operator>>(double& __n)
403 sentry __cerb(*this, false);
408 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
409 if (_M_check_facet(this->_M_fnumget))
410 this->_M_fnumget->get(*this, 0, *this, __err, __n);
411 this->setstate(__err);
415 // 27.6.1.2.1 Common requirements.
416 // Turn this on without causing an ios::failure to be thrown.
417 this->_M_setstate(ios_base::badbit);
418 if ((this->exceptions() & ios_base::badbit) != 0)
419 __throw_exception_again;
425 template<typename _CharT, typename _Traits>
426 basic_istream<_CharT, _Traits>&
427 basic_istream<_CharT, _Traits>::
428 operator>>(long double& __n)
430 sentry __cerb(*this, false);
435 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
436 if (_M_check_facet(this->_M_fnumget))
437 this->_M_fnumget->get(*this, 0, *this, __err, __n);
438 this->setstate(__err);
442 // 27.6.1.2.1 Common requirements.
443 // Turn this on without causing an ios::failure to be thrown.
444 this->_M_setstate(ios_base::badbit);
445 if ((this->exceptions() & ios_base::badbit) != 0)
446 __throw_exception_again;
452 template<typename _CharT, typename _Traits>
453 basic_istream<_CharT, _Traits>&
454 basic_istream<_CharT, _Traits>::
455 operator>>(void*& __n)
457 sentry __cerb(*this, false);
462 ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
463 if (_M_check_facet(this->_M_fnumget))
464 this->_M_fnumget->get(*this, 0, *this, __err, __n);
465 this->setstate(__err);
469 // 27.6.1.2.1 Common requirements.
470 // Turn this on without causing an ios::failure to be thrown.
471 this->_M_setstate(ios_base::badbit);
472 if ((this->exceptions() & ios_base::badbit) != 0)
473 __throw_exception_again;
479 template<typename _CharT, typename _Traits>
480 basic_istream<_CharT, _Traits>&
481 basic_istream<_CharT, _Traits>::
482 operator>>(__streambuf_type* __sbout)
484 sentry __cerb(*this, false);
489 streamsize __xtrct = 0;
492 __streambuf_type* __sbin = this->rdbuf();
493 __xtrct = __copy_streambufs(*this, __sbin, __sbout);
495 if (!__sbout || !__xtrct)
496 this->setstate(ios_base::failbit);
500 // 27.6.2.5.1 Common requirements.
501 // Turn this on without causing an ios::failure to be thrown.
502 this->_M_setstate(ios_base::badbit);
503 if ((this->exceptions() & ios_base::badbit) != 0)
504 __throw_exception_again;
510 template<typename _CharT, typename _Traits>
511 typename basic_istream<_CharT, _Traits>::int_type
512 basic_istream<_CharT, _Traits>::
515 const int_type __eof = traits_type::eof();
516 int_type __c = __eof;
518 sentry __cerb(*this, true);
523 __c = this->rdbuf()->sbumpc();
524 // 27.6.1.1 paragraph 3
525 if (!traits_type::eq_int_type(__c, __eof))
528 this->setstate(ios_base::eofbit | ios_base::failbit);
532 // 27.6.1.3 paragraph 1
533 // Turn this on without causing an ios::failure to be thrown.
534 this->_M_setstate(ios_base::badbit);
535 if ((this->exceptions() & ios_base::badbit) != 0)
536 __throw_exception_again;
542 template<typename _CharT, typename _Traits>
543 basic_istream<_CharT, _Traits>&
544 basic_istream<_CharT, _Traits>::
548 sentry __cerb(*this, true);
553 const int_type __eof = traits_type::eof();
554 int_type __bufval = this->rdbuf()->sbumpc();
555 // 27.6.1.1 paragraph 3
556 if (!traits_type::eq_int_type(__bufval, __eof))
559 __c = traits_type::to_char_type(__bufval);
562 this->setstate(ios_base::eofbit | ios_base::failbit);
566 // 27.6.1.3 paragraph 1
567 // Turn this on without causing an ios::failure to be thrown.
568 this->_M_setstate(ios_base::badbit);
569 if ((this->exceptions() & ios_base::badbit) != 0)
570 __throw_exception_again;
576 template<typename _CharT, typename _Traits>
577 basic_istream<_CharT, _Traits>&
578 basic_istream<_CharT, _Traits>::
579 get(char_type* __s, streamsize __n, char_type __delim)
582 sentry __cerb(*this, true);
587 const int_type __idelim = traits_type::to_int_type(__delim);
588 const int_type __eof = traits_type::eof();
589 __streambuf_type* __sb = this->rdbuf();
590 int_type __c = __sb->sgetc();
592 while (_M_gcount + 1 < __n
593 && !traits_type::eq_int_type(__c, __eof)
594 && !traits_type::eq_int_type(__c, __idelim))
596 *__s++ = traits_type::to_char_type(__c);
597 __c = __sb->snextc();
600 if (traits_type::eq_int_type(__c, __eof))
601 this->setstate(ios_base::eofbit);
605 // 27.6.1.3 paragraph 1
606 // Turn this on without causing an ios::failure to be thrown.
607 this->_M_setstate(ios_base::badbit);
608 if ((this->exceptions() & ios_base::badbit) != 0)
609 __throw_exception_again;
614 this->setstate(ios_base::failbit);
618 template<typename _CharT, typename _Traits>
619 basic_istream<_CharT, _Traits>&
620 basic_istream<_CharT, _Traits>::
621 get(__streambuf_type& __sb, char_type __delim)
624 sentry __cerb(*this, true);
629 const int_type __idelim = traits_type::to_int_type(__delim);
630 const int_type __eof = traits_type::eof();
631 __streambuf_type* __this_sb = this->rdbuf();
632 int_type __c = __this_sb->sgetc();
633 char_type __c2 = traits_type::to_char_type(__c);
635 while (!traits_type::eq_int_type(__c, __eof)
636 && !traits_type::eq_int_type(__c, __idelim)
637 && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
640 __c = __this_sb->snextc();
641 __c2 = traits_type::to_char_type(__c);
643 if (traits_type::eq_int_type(__c, __eof))
644 this->setstate(ios_base::eofbit);
648 // 27.6.1.3 paragraph 1
649 // Turn this on without causing an ios::failure to be thrown.
650 this->_M_setstate(ios_base::badbit);
651 if ((this->exceptions() & ios_base::badbit) != 0)
652 __throw_exception_again;
656 this->setstate(ios_base::failbit);
660 template<typename _CharT, typename _Traits>
661 basic_istream<_CharT, _Traits>&
662 basic_istream<_CharT, _Traits>::
663 getline(char_type* __s, streamsize __n, char_type __delim)
666 sentry __cerb(*this, true);
671 const int_type __idelim = traits_type::to_int_type(__delim);
672 const int_type __eof = traits_type::eof();
673 __streambuf_type* __sb = this->rdbuf();
674 int_type __c = __sb->sgetc();
676 while (_M_gcount + 1 < __n
677 && !traits_type::eq_int_type(__c, __eof)
678 && !traits_type::eq_int_type(__c, __idelim))
680 *__s++ = traits_type::to_char_type(__c);
681 __c = __sb->snextc();
684 if (traits_type::eq_int_type(__c, __eof))
685 this->setstate(ios_base::eofbit);
688 if (traits_type::eq_int_type(__c, __idelim))
694 this->setstate(ios_base::failbit);
699 // 27.6.1.3 paragraph 1
700 // Turn this on without causing an ios::failure to be thrown.
701 this->_M_setstate(ios_base::badbit);
702 if ((this->exceptions() & ios_base::badbit) != 0)
703 __throw_exception_again;
708 this->setstate(ios_base::failbit);
712 template<typename _CharT, typename _Traits>
713 basic_istream<_CharT, _Traits>&
714 basic_istream<_CharT, _Traits>::
715 ignore(streamsize __n, int_type __delim)
718 sentry __cerb(*this, true);
719 if (__cerb && __n > 0)
723 const int_type __eof = traits_type::eof();
724 __streambuf_type* __sb = this->rdbuf();
727 __n = std::min(__n, numeric_limits<streamsize>::max());
728 while (_M_gcount < __n
729 && !traits_type::eq_int_type(__c = __sb->sbumpc(), __eof))
732 if (traits_type::eq_int_type(__c, __delim))
735 if (traits_type::eq_int_type(__c, __eof))
736 this->setstate(ios_base::eofbit);
740 // 27.6.1.3 paragraph 1
741 // Turn this on without causing an ios::failure to be thrown.
742 this->_M_setstate(ios_base::badbit);
743 if ((this->exceptions() & ios_base::badbit) != 0)
744 __throw_exception_again;
750 template<typename _CharT, typename _Traits>
751 typename basic_istream<_CharT, _Traits>::int_type
752 basic_istream<_CharT, _Traits>::
755 int_type __c = traits_type::eof();
757 sentry __cerb(*this, true);
761 { __c = this->rdbuf()->sgetc(); }
764 // 27.6.1.3 paragraph 1
765 // Turn this on without causing an ios::failure to be thrown.
766 this->_M_setstate(ios_base::badbit);
767 if ((this->exceptions() & ios_base::badbit) != 0)
768 __throw_exception_again;
774 template<typename _CharT, typename _Traits>
775 basic_istream<_CharT, _Traits>&
776 basic_istream<_CharT, _Traits>::
777 read(char_type* __s, streamsize __n)
780 sentry __cerb(*this, true);
785 _M_gcount = this->rdbuf()->sgetn(__s, __n);
786 if (_M_gcount != __n)
787 this->setstate(ios_base::eofbit | ios_base::failbit);
791 // 27.6.1.3 paragraph 1
792 // Turn this on without causing an ios::failure to be thrown.
793 this->_M_setstate(ios_base::badbit);
794 if ((this->exceptions() & ios_base::badbit) != 0)
795 __throw_exception_again;
799 this->setstate(ios_base::failbit);
803 template<typename _CharT, typename _Traits>
805 basic_istream<_CharT, _Traits>::
806 readsome(char_type* __s, streamsize __n)
809 sentry __cerb(*this, true);
814 // Cannot compare int_type with streamsize generically.
815 streamsize __num = this->rdbuf()->in_avail();
818 __num = std::min(__num, __n);
820 _M_gcount = this->rdbuf()->sgetn(__s, __num);
823 this->setstate(ios_base::eofbit);
827 // 27.6.1.3 paragraph 1
828 // Turn this on without causing an ios::failure to be thrown.
829 this->_M_setstate(ios_base::badbit);
830 if ((this->exceptions() & ios_base::badbit) != 0)
831 __throw_exception_again;
835 this->setstate(ios_base::failbit);
839 template<typename _CharT, typename _Traits>
840 basic_istream<_CharT, _Traits>&
841 basic_istream<_CharT, _Traits>::
842 putback(char_type __c)
844 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
845 // 60. What is a formatted input function?
848 sentry __cerb(*this, true);
853 const int_type __eof = traits_type::eof();
854 __streambuf_type* __sb = this->rdbuf();
856 || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
857 this->setstate(ios_base::badbit);
861 // 27.6.1.3 paragraph 1
862 // Turn this on without causing an ios::failure to be thrown.
863 this->_M_setstate(ios_base::badbit);
864 if ((this->exceptions() & ios_base::badbit) != 0)
865 __throw_exception_again;
869 this->setstate(ios_base::failbit);
873 template<typename _CharT, typename _Traits>
874 basic_istream<_CharT, _Traits>&
875 basic_istream<_CharT, _Traits>::
878 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
879 // 60. What is a formatted input function?
882 sentry __cerb(*this, true);
887 const int_type __eof = traits_type::eof();
888 __streambuf_type* __sb = this->rdbuf();
890 || traits_type::eq_int_type(__sb->sungetc(), __eof))
891 this->setstate(ios_base::badbit);
895 // 27.6.1.3 paragraph 1
896 // Turn this on without causing an ios::failure to be thrown.
897 this->_M_setstate(ios_base::badbit);
898 if ((this->exceptions() & ios_base::badbit) != 0)
899 __throw_exception_again;
903 this->setstate(ios_base::failbit);
907 template<typename _CharT, typename _Traits>
909 basic_istream<_CharT, _Traits>::
912 // DR60. Do not change _M_gcount.
914 sentry __cerb(*this, true);
919 __streambuf_type* __sb = this->rdbuf();
922 if (__sb->pubsync() == -1)
923 this->setstate(ios_base::badbit);
930 // 27.6.1.3 paragraph 1
931 // Turn this on without causing an ios::failure to be thrown.
932 this->_M_setstate(ios_base::badbit);
933 if ((this->exceptions() & ios_base::badbit) != 0)
934 __throw_exception_again;
940 template<typename _CharT, typename _Traits>
941 typename basic_istream<_CharT, _Traits>::pos_type
942 basic_istream<_CharT, _Traits>::
945 // DR60. Do not change _M_gcount.
946 pos_type __ret = pos_type(-1);
948 __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
953 template<typename _CharT, typename _Traits>
954 basic_istream<_CharT, _Traits>&
955 basic_istream<_CharT, _Traits>::
956 seekg(pos_type __pos)
958 // DR60. Do not change _M_gcount.
961 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
962 // 136. seekp, seekg setting wrong streams?
963 pos_type __err = this->rdbuf()->pubseekpos(__pos, ios_base::in);
965 // 129. Need error indication from seekp() and seekg()
966 if (__err == pos_type(off_type(-1)))
967 this->setstate(ios_base::failbit);
973 template<typename _CharT, typename _Traits>
974 basic_istream<_CharT, _Traits>&
975 basic_istream<_CharT, _Traits>::
976 seekg(off_type __off, ios_base::seekdir __dir)
978 // DR60. Do not change _M_gcount.
981 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
982 // 136. seekp, seekg setting wrong streams?
983 pos_type __err = this->rdbuf()->pubseekoff(__off, __dir,
986 // 129. Need error indication from seekp() and seekg()
987 if (__err == pos_type(off_type(-1)))
988 this->setstate(ios_base::failbit);
994 // 27.6.1.2.3 Character extraction templates
995 template<typename _CharT, typename _Traits>
996 basic_istream<_CharT, _Traits>&
997 operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
999 typedef basic_istream<_CharT, _Traits> __istream_type;
1000 typename __istream_type::sentry __cerb(__in, false);
1007 // 27.6.1.2.1 Common requirements.
1008 // Turn this on without causing an ios::failure to be thrown.
1009 __in._M_setstate(ios_base::badbit);
1010 if ((__in.exceptions() & ios_base::badbit) != 0)
1011 __throw_exception_again;
1015 __in.setstate(ios_base::failbit);
1019 template<typename _CharT, typename _Traits>
1020 basic_istream<_CharT, _Traits>&
1021 operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
1023 typedef basic_istream<_CharT, _Traits> __istream_type;
1024 typedef typename __istream_type::__streambuf_type __streambuf_type;
1025 typedef typename _Traits::int_type int_type;
1026 typedef _CharT char_type;
1027 typedef ctype<_CharT> __ctype_type;
1028 streamsize __extracted = 0;
1030 typename __istream_type::sentry __cerb(__in, false);
1035 // Figure out how many characters to extract.
1036 streamsize __num = __in.width();
1038 __num = numeric_limits<streamsize>::max();
1040 const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc());
1041 const int_type __eof = _Traits::eof();
1042 __streambuf_type* __sb = __in.rdbuf();
1043 int_type __c = __sb->sgetc();
1045 while (__extracted < __num - 1
1046 && !_Traits::eq_int_type(__c, __eof)
1047 && !__ctype.is(ctype_base::space, _Traits::to_char_type(__c)))
1049 *__s++ = _Traits::to_char_type(__c);
1051 __c = __sb->snextc();
1053 if (_Traits::eq_int_type(__c, __eof))
1054 __in.setstate(ios_base::eofbit);
1056 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
1057 //68. Extractors for char* should store null at end
1064 // 27.6.1.2.1 Common requirements.
1065 // Turn this on without causing an ios::failure to be thrown.
1066 __in._M_setstate(ios_base::badbit);
1067 if ((__in.exceptions() & ios_base::badbit) != 0)
1068 __throw_exception_again;
1072 __in.setstate(ios_base::failbit);
1076 // 27.6.1.4 Standard basic_istream manipulators
1077 template<typename _CharT, typename _Traits>
1078 basic_istream<_CharT,_Traits>&
1079 ws(basic_istream<_CharT,_Traits>& __in)
1081 typedef basic_istream<_CharT, _Traits> __istream_type;
1082 typedef typename __istream_type::__streambuf_type __streambuf_type;
1083 typedef typename __istream_type::__ctype_type __ctype_type;
1084 typedef typename __istream_type::int_type __int_type;
1086 const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc());
1087 const __int_type __eof = _Traits::eof();
1088 __streambuf_type* __sb = __in.rdbuf();
1089 __int_type __c = __sb->sgetc();
1091 while (!_Traits::eq_int_type(__c, __eof)
1092 && __ctype.is(ctype_base::space, _Traits::to_char_type(__c)))
1093 __c = __sb->snextc();
1095 if (_Traits::eq_int_type(__c, __eof))
1096 __in.setstate(ios_base::eofbit);
1101 // 21.3.7.9 basic_string::getline and operators
1102 template<typename _CharT, typename _Traits, typename _Alloc>
1103 basic_istream<_CharT, _Traits>&
1104 operator>>(basic_istream<_CharT, _Traits>& __in,
1105 basic_string<_CharT, _Traits, _Alloc>& __str)
1107 typedef basic_istream<_CharT, _Traits> __istream_type;
1108 typedef typename __istream_type::int_type __int_type;
1109 typedef typename __istream_type::__streambuf_type __streambuf_type;
1110 typedef typename __istream_type::__ctype_type __ctype_type;
1111 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
1112 typedef typename __string_type::size_type __size_type;
1113 __size_type __extracted = 0;
1115 typename __istream_type::sentry __cerb(__in, false);
1119 streamsize __w = __in.width();
1121 __n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size();
1123 const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc());
1124 const __int_type __eof = _Traits::eof();
1125 __streambuf_type* __sb = __in.rdbuf();
1126 __int_type __c = __sb->sgetc();
1128 while (__extracted < __n
1129 && !_Traits::eq_int_type(__c, __eof)
1130 && !__ctype.is(ctype_base::space, _Traits::to_char_type(__c)))
1132 __str += _Traits::to_char_type(__c);
1134 __c = __sb->snextc();
1136 if (_Traits::eq_int_type(__c, __eof))
1137 __in.setstate(ios_base::eofbit);
1140 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
1141 //211. operator>>(istream&, string&) doesn't set failbit
1143 __in.setstate (ios_base::failbit);
1148 template<typename _CharT, typename _Traits, typename _Alloc>
1149 basic_istream<_CharT, _Traits>&
1150 getline(basic_istream<_CharT, _Traits>& __in,
1151 basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
1153 typedef basic_istream<_CharT, _Traits> __istream_type;
1154 typedef typename __istream_type::int_type __int_type;
1155 typedef typename __istream_type::__streambuf_type __streambuf_type;
1156 typedef typename __istream_type::__ctype_type __ctype_type;
1157 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
1158 typedef typename __string_type::size_type __size_type;
1160 __size_type __extracted = 0;
1161 bool __testdelim = false;
1162 typename __istream_type::sentry __cerb(__in, true);
1166 __size_type __n = __str.max_size();
1168 __int_type __idelim = _Traits::to_int_type(__delim);
1169 __streambuf_type* __sb = __in.rdbuf();
1170 __int_type __c = __sb->sbumpc();
1171 const __int_type __eof = _Traits::eof();
1172 __testdelim = _Traits::eq_int_type(__c, __idelim);
1174 while (__extracted <= __n
1175 && !_Traits::eq_int_type(__c, __eof)
1178 __str += _Traits::to_char_type(__c);
1180 __c = __sb->sbumpc();
1181 __testdelim = _Traits::eq_int_type(__c, __idelim);
1183 if (_Traits::eq_int_type(__c, __eof))
1184 __in.setstate(ios_base::eofbit);
1186 if (!__extracted && !__testdelim)
1187 __in.setstate(ios_base::failbit);
1191 template<class _CharT, class _Traits, class _Alloc>
1192 inline basic_istream<_CharT,_Traits>&
1193 getline(basic_istream<_CharT, _Traits>& __in,
1194 basic_string<_CharT,_Traits,_Alloc>& __str)
1195 { return getline(__in, __str, __in.widen('\n')); }
1197 // Inhibit implicit instantiations for required instantiations,
1198 // which are defined via explicit instantiations elsewhere.
1199 // NB: This syntax is a GNU extension.
1200 #if _GLIBCPP_EXTERN_TEMPLATE
1201 extern template class basic_istream<char>;
1202 extern template istream& ws(istream&);
1203 extern template istream& operator>>(istream&, char&);
1204 extern template istream& operator>>(istream&, char*);
1205 extern template istream& operator>>(istream&, unsigned char&);
1206 extern template istream& operator>>(istream&, signed char&);
1207 extern template istream& operator>>(istream&, unsigned char*);
1208 extern template istream& operator>>(istream&, signed char*);
1210 #ifdef _GLIBCPP_USE_WCHAR_T
1211 extern template class basic_istream<wchar_t>;
1212 extern template wistream& ws(wistream&);
1213 extern template wistream& operator>>(wistream&, wchar_t&);
1214 extern template wistream& operator>>(wistream&, wchar_t*);