1 // Input streams -*- C++ -*-
3 // Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
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 3, 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 // Under Section 7 of GPL version 3, you are granted additional
18 // permissions described in the GCC Runtime Library Exception, version
19 // 3.1, as published by the Free Software Foundation.
21 // You should have received a copy of the GNU General Public License and
22 // a copy of the GCC Runtime Library Exception along with this program;
23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 // <http://www.gnu.org/licenses/>.
27 // ISO C++ 14882: 27.6.1 Input streams
32 namespace std
_GLIBCXX_VISIBILITY(default)
34 _GLIBCXX_BEGIN_NAMESPACE_VERSION
39 getline(char_type
* __s
, streamsize __n
, char_type __delim
)
42 ios_base::iostate __err
= ios_base::goodbit
;
43 sentry
__cerb(*this, true);
48 const int_type __idelim
= traits_type::to_int_type(__delim
);
49 const int_type __eof
= traits_type::eof();
50 __streambuf_type
* __sb
= this->rdbuf();
51 int_type __c
= __sb
->sgetc();
53 while (_M_gcount
+ 1 < __n
54 && !traits_type::eq_int_type(__c
, __eof
)
55 && !traits_type::eq_int_type(__c
, __idelim
))
57 streamsize __size
= std::min(streamsize(__sb
->egptr()
59 streamsize(__n
- _M_gcount
63 const char_type
* __p
= traits_type::find(__sb
->gptr(),
67 __size
= __p
- __sb
->gptr();
68 traits_type::copy(__s
, __sb
->gptr(), __size
);
70 __sb
->__safe_gbump(__size
);
76 *__s
++ = traits_type::to_char_type(__c
);
82 if (traits_type::eq_int_type(__c
, __eof
))
83 __err
|= ios_base::eofbit
;
84 else if (traits_type::eq_int_type(__c
, __idelim
))
90 __err
|= ios_base::failbit
;
92 __catch(__cxxabiv1::__forced_unwind
&)
94 this->_M_setstate(ios_base::badbit
);
95 __throw_exception_again
;
98 { this->_M_setstate(ios_base::badbit
); }
100 // _GLIBCXX_RESOLVE_LIB_DEFECTS
101 // 243. get and getline when sentry reports failure.
105 __err
|= ios_base::failbit
;
107 this->setstate(__err
);
113 basic_istream
<char>::
114 ignore(streamsize __n
, int_type __delim
)
116 if (traits_type::eq_int_type(__delim
, traits_type::eof()))
120 sentry
__cerb(*this, true);
121 if (__n
> 0 && __cerb
)
123 ios_base::iostate __err
= ios_base::goodbit
;
126 const char_type __cdelim
= traits_type::to_char_type(__delim
);
127 const int_type __eof
= traits_type::eof();
128 __streambuf_type
* __sb
= this->rdbuf();
129 int_type __c
= __sb
->sgetc();
131 bool __large_ignore
= false;
134 while (_M_gcount
< __n
135 && !traits_type::eq_int_type(__c
, __eof
)
136 && !traits_type::eq_int_type(__c
, __delim
))
138 streamsize __size
= std::min(streamsize(__sb
->egptr()
140 streamsize(__n
- _M_gcount
));
143 const char_type
* __p
= traits_type::find(__sb
->gptr(),
147 __size
= __p
- __sb
->gptr();
148 __sb
->__safe_gbump(__size
);
155 __c
= __sb
->snextc();
158 if (__n
== __gnu_cxx::__numeric_traits
<streamsize
>::__max
159 && !traits_type::eq_int_type(__c
, __eof
)
160 && !traits_type::eq_int_type(__c
, __delim
))
163 __gnu_cxx::__numeric_traits
<streamsize
>::__min
;
164 __large_ignore
= true;
171 _M_gcount
= __gnu_cxx::__numeric_traits
<streamsize
>::__max
;
173 if (traits_type::eq_int_type(__c
, __eof
))
174 __err
|= ios_base::eofbit
;
175 else if (traits_type::eq_int_type(__c
, __delim
))
178 < __gnu_cxx::__numeric_traits
<streamsize
>::__max
)
183 __catch(__cxxabiv1::__forced_unwind
&)
185 this->_M_setstate(ios_base::badbit
);
186 __throw_exception_again
;
189 { this->_M_setstate(ios_base::badbit
); }
191 this->setstate(__err
);
198 operator>>(basic_istream
<char>& __in
, char* __s
)
200 typedef basic_istream
<char> __istream_type
;
201 typedef __istream_type::int_type __int_type
;
202 typedef __istream_type::char_type __char_type
;
203 typedef __istream_type::traits_type __traits_type
;
204 typedef __istream_type::__streambuf_type __streambuf_type
;
205 typedef __istream_type::__ctype_type __ctype_type
;
207 streamsize __extracted
= 0;
208 ios_base::iostate __err
= ios_base::goodbit
;
209 __istream_type::sentry
__cerb(__in
, false);
214 // Figure out how many characters to extract.
215 streamsize __num
= __in
.width();
217 __num
= __gnu_cxx::__numeric_traits
<streamsize
>::__max
;
219 const __ctype_type
& __ct
= use_facet
<__ctype_type
>(__in
.getloc());
221 const __int_type __eof
= __traits_type::eof();
222 __streambuf_type
* __sb
= __in
.rdbuf();
223 __int_type __c
= __sb
->sgetc();
225 while (__extracted
< __num
- 1
226 && !__traits_type::eq_int_type(__c
, __eof
)
227 && !__ct
.is(ctype_base::space
,
228 __traits_type::to_char_type(__c
)))
230 streamsize __size
= std::min(streamsize(__sb
->egptr()
232 streamsize(__num
- __extracted
236 __size
= (__ct
.scan_is(ctype_base::space
,
238 __sb
->gptr() + __size
)
240 __traits_type::copy(__s
, __sb
->gptr(), __size
);
242 __sb
->__safe_gbump(__size
);
243 __extracted
+= __size
;
248 *__s
++ = __traits_type::to_char_type(__c
);
250 __c
= __sb
->snextc();
254 if (__traits_type::eq_int_type(__c
, __eof
))
255 __err
|= ios_base::eofbit
;
257 // _GLIBCXX_RESOLVE_LIB_DEFECTS
258 // 68. Extractors for char* should store null at end
259 *__s
= __char_type();
262 __catch(__cxxabiv1::__forced_unwind
&)
264 __in
._M_setstate(ios_base::badbit
);
265 __throw_exception_again
;
268 { __in
._M_setstate(ios_base::badbit
); }
271 __err
|= ios_base::failbit
;
273 __in
.setstate(__err
);
279 operator>>(basic_istream
<char>& __in
, basic_string
<char>& __str
)
281 typedef basic_istream
<char> __istream_type
;
282 typedef __istream_type::int_type __int_type
;
283 typedef __istream_type::traits_type __traits_type
;
284 typedef __istream_type::__streambuf_type __streambuf_type
;
285 typedef __istream_type::__ctype_type __ctype_type
;
286 typedef basic_string
<char> __string_type
;
287 typedef __string_type::size_type __size_type
;
289 __size_type __extracted
= 0;
290 ios_base::iostate __err
= ios_base::goodbit
;
291 __istream_type::sentry
__cerb(__in
, false);
297 const streamsize __w
= __in
.width();
298 const __size_type __n
= __w
> 0 ? static_cast<__size_type
>(__w
)
300 const __ctype_type
& __ct
= use_facet
<__ctype_type
>(__in
.getloc());
301 const __int_type __eof
= __traits_type::eof();
302 __streambuf_type
* __sb
= __in
.rdbuf();
303 __int_type __c
= __sb
->sgetc();
305 while (__extracted
< __n
306 && !__traits_type::eq_int_type(__c
, __eof
)
307 && !__ct
.is(ctype_base::space
,
308 __traits_type::to_char_type(__c
)))
310 streamsize __size
= std::min(streamsize(__sb
->egptr()
312 streamsize(__n
- __extracted
));
315 __size
= (__ct
.scan_is(ctype_base::space
,
317 __sb
->gptr() + __size
)
319 __str
.append(__sb
->gptr(), __size
);
320 __sb
->__safe_gbump(__size
);
321 __extracted
+= __size
;
326 __str
+= __traits_type::to_char_type(__c
);
328 __c
= __sb
->snextc();
332 if (__traits_type::eq_int_type(__c
, __eof
))
333 __err
|= ios_base::eofbit
;
336 __catch(__cxxabiv1::__forced_unwind
&)
338 __in
._M_setstate(ios_base::badbit
);
339 __throw_exception_again
;
343 // _GLIBCXX_RESOLVE_LIB_DEFECTS
344 // 91. Description of operator>> and getline() for string<>
345 // might cause endless loop
346 __in
._M_setstate(ios_base::badbit
);
350 __err
|= ios_base::failbit
;
352 __in
.setstate(__err
);
358 getline(basic_istream
<char>& __in
, basic_string
<char>& __str
,
361 typedef basic_istream
<char> __istream_type
;
362 typedef __istream_type::int_type __int_type
;
363 typedef __istream_type::char_type __char_type
;
364 typedef __istream_type::traits_type __traits_type
;
365 typedef __istream_type::__streambuf_type __streambuf_type
;
366 typedef basic_string
<char> __string_type
;
367 typedef __string_type::size_type __size_type
;
369 __size_type __extracted
= 0;
370 const __size_type __n
= __str
.max_size();
371 ios_base::iostate __err
= ios_base::goodbit
;
372 __istream_type::sentry
__cerb(__in
, true);
378 const __int_type __idelim
= __traits_type::to_int_type(__delim
);
379 const __int_type __eof
= __traits_type::eof();
380 __streambuf_type
* __sb
= __in
.rdbuf();
381 __int_type __c
= __sb
->sgetc();
383 while (__extracted
< __n
384 && !__traits_type::eq_int_type(__c
, __eof
)
385 && !__traits_type::eq_int_type(__c
, __idelim
))
387 streamsize __size
= std::min(streamsize(__sb
->egptr()
389 streamsize(__n
- __extracted
));
392 const __char_type
* __p
= __traits_type::find(__sb
->gptr(),
396 __size
= __p
- __sb
->gptr();
397 __str
.append(__sb
->gptr(), __size
);
398 __sb
->__safe_gbump(__size
);
399 __extracted
+= __size
;
404 __str
+= __traits_type::to_char_type(__c
);
406 __c
= __sb
->snextc();
410 if (__traits_type::eq_int_type(__c
, __eof
))
411 __err
|= ios_base::eofbit
;
412 else if (__traits_type::eq_int_type(__c
, __idelim
))
418 __err
|= ios_base::failbit
;
420 __catch(__cxxabiv1::__forced_unwind
&)
422 __in
._M_setstate(ios_base::badbit
);
423 __throw_exception_again
;
427 // _GLIBCXX_RESOLVE_LIB_DEFECTS
428 // 91. Description of operator>> and getline() for string<>
429 // might cause endless loop
430 __in
._M_setstate(ios_base::badbit
);
434 __err
|= ios_base::failbit
;
436 __in
.setstate(__err
);
440 #ifdef _GLIBCXX_USE_WCHAR_T
442 basic_istream
<wchar_t>&
443 basic_istream
<wchar_t>::
444 getline(char_type
* __s
, streamsize __n
, char_type __delim
)
447 ios_base::iostate __err
= ios_base::goodbit
;
448 sentry
__cerb(*this, true);
453 const int_type __idelim
= traits_type::to_int_type(__delim
);
454 const int_type __eof
= traits_type::eof();
455 __streambuf_type
* __sb
= this->rdbuf();
456 int_type __c
= __sb
->sgetc();
458 while (_M_gcount
+ 1 < __n
459 && !traits_type::eq_int_type(__c
, __eof
)
460 && !traits_type::eq_int_type(__c
, __idelim
))
462 streamsize __size
= std::min(streamsize(__sb
->egptr()
464 streamsize(__n
- _M_gcount
468 const char_type
* __p
= traits_type::find(__sb
->gptr(),
472 __size
= __p
- __sb
->gptr();
473 traits_type::copy(__s
, __sb
->gptr(), __size
);
475 __sb
->__safe_gbump(__size
);
481 *__s
++ = traits_type::to_char_type(__c
);
483 __c
= __sb
->snextc();
487 if (traits_type::eq_int_type(__c
, __eof
))
488 __err
|= ios_base::eofbit
;
489 else if (traits_type::eq_int_type(__c
, __idelim
))
495 __err
|= ios_base::failbit
;
497 __catch(__cxxabiv1::__forced_unwind
&)
499 this->_M_setstate(ios_base::badbit
);
500 __throw_exception_again
;
503 { this->_M_setstate(ios_base::badbit
); }
505 // _GLIBCXX_RESOLVE_LIB_DEFECTS
506 // 243. get and getline when sentry reports failure.
510 __err
|= ios_base::failbit
;
512 this->setstate(__err
);
517 basic_istream
<wchar_t>&
518 basic_istream
<wchar_t>::
519 ignore(streamsize __n
, int_type __delim
)
521 if (traits_type::eq_int_type(__delim
, traits_type::eof()))
525 sentry
__cerb(*this, true);
526 if (__n
> 0 && __cerb
)
528 ios_base::iostate __err
= ios_base::goodbit
;
531 const char_type __cdelim
= traits_type::to_char_type(__delim
);
532 const int_type __eof
= traits_type::eof();
533 __streambuf_type
* __sb
= this->rdbuf();
534 int_type __c
= __sb
->sgetc();
536 bool __large_ignore
= false;
539 while (_M_gcount
< __n
540 && !traits_type::eq_int_type(__c
, __eof
)
541 && !traits_type::eq_int_type(__c
, __delim
))
543 streamsize __size
= std::min(streamsize(__sb
->egptr()
545 streamsize(__n
- _M_gcount
));
548 const char_type
* __p
= traits_type::find(__sb
->gptr(),
552 __size
= __p
- __sb
->gptr();
553 __sb
->__safe_gbump(__size
);
560 __c
= __sb
->snextc();
563 if (__n
== __gnu_cxx::__numeric_traits
<streamsize
>::__max
564 && !traits_type::eq_int_type(__c
, __eof
)
565 && !traits_type::eq_int_type(__c
, __delim
))
568 __gnu_cxx::__numeric_traits
<streamsize
>::__min
;
569 __large_ignore
= true;
576 _M_gcount
= __gnu_cxx::__numeric_traits
<streamsize
>::__max
;
578 if (traits_type::eq_int_type(__c
, __eof
))
579 __err
|= ios_base::eofbit
;
580 else if (traits_type::eq_int_type(__c
, __delim
))
583 < __gnu_cxx::__numeric_traits
<streamsize
>::__max
)
588 __catch(__cxxabiv1::__forced_unwind
&)
590 this->_M_setstate(ios_base::badbit
);
591 __throw_exception_again
;
594 { this->_M_setstate(ios_base::badbit
); }
596 this->setstate(__err
);
602 basic_istream
<wchar_t>&
603 getline(basic_istream
<wchar_t>& __in
, basic_string
<wchar_t>& __str
,
606 typedef basic_istream
<wchar_t> __istream_type
;
607 typedef __istream_type::int_type __int_type
;
608 typedef __istream_type::char_type __char_type
;
609 typedef __istream_type::traits_type __traits_type
;
610 typedef __istream_type::__streambuf_type __streambuf_type
;
611 typedef basic_string
<wchar_t> __string_type
;
612 typedef __string_type::size_type __size_type
;
614 __size_type __extracted
= 0;
615 const __size_type __n
= __str
.max_size();
616 ios_base::iostate __err
= ios_base::goodbit
;
617 __istream_type::sentry
__cerb(__in
, true);
623 const __int_type __idelim
= __traits_type::to_int_type(__delim
);
624 const __int_type __eof
= __traits_type::eof();
625 __streambuf_type
* __sb
= __in
.rdbuf();
626 __int_type __c
= __sb
->sgetc();
628 while (__extracted
< __n
629 && !__traits_type::eq_int_type(__c
, __eof
)
630 && !__traits_type::eq_int_type(__c
, __idelim
))
632 streamsize __size
= std::min(streamsize(__sb
->egptr()
634 streamsize(__n
- __extracted
));
637 const __char_type
* __p
= __traits_type::find(__sb
->gptr(),
641 __size
= __p
- __sb
->gptr();
642 __str
.append(__sb
->gptr(), __size
);
643 __sb
->__safe_gbump(__size
);
644 __extracted
+= __size
;
649 __str
+= __traits_type::to_char_type(__c
);
651 __c
= __sb
->snextc();
655 if (__traits_type::eq_int_type(__c
, __eof
))
656 __err
|= ios_base::eofbit
;
657 else if (__traits_type::eq_int_type(__c
, __idelim
))
663 __err
|= ios_base::failbit
;
665 __catch(__cxxabiv1::__forced_unwind
&)
667 __in
._M_setstate(ios_base::badbit
);
668 __throw_exception_again
;
672 // _GLIBCXX_RESOLVE_LIB_DEFECTS
673 // 91. Description of operator>> and getline() for string<>
674 // might cause endless loop
675 __in
._M_setstate(ios_base::badbit
);
679 __err
|= ios_base::failbit
;
681 __in
.setstate(__err
);
686 _GLIBCXX_END_NAMESPACE_VERSION