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