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);
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();
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);
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::char_type __char_type;
284 typedef __istream_type::traits_type __traits_type;
285 typedef __istream_type::__streambuf_type __streambuf_type;
286 typedef __istream_type::__ctype_type __ctype_type;
287 typedef basic_string<char> __string_type;
288 typedef __string_type::size_type __size_type;
290 __size_type __extracted = 0;
291 ios_base::iostate __err = ios_base::goodbit;
292 __istream_type::sentry __cerb(__in, false);
298 const streamsize __w = __in.width();
299 const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
301 const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
302 const __int_type __eof = __traits_type::eof();
303 __streambuf_type* __sb = __in.rdbuf();
304 __int_type __c = __sb->sgetc();
306 while (__extracted < __n
307 && !__traits_type::eq_int_type(__c, __eof)
308 && !__ct.is(ctype_base::space,
309 __traits_type::to_char_type(__c)))
311 streamsize __size = std::min(streamsize(__sb->egptr()
313 streamsize(__n - __extracted));
316 __size = (__ct.scan_is(ctype_base::space,
318 __sb->gptr() + __size)
320 __str.append(__sb->gptr(), __size);
322 __extracted += __size;
327 __str += __traits_type::to_char_type(__c);
329 __c = __sb->snextc();
333 if (__traits_type::eq_int_type(__c, __eof))
334 __err |= ios_base::eofbit;
337 __catch(__cxxabiv1::__forced_unwind&)
339 __in._M_setstate(ios_base::badbit);
340 __throw_exception_again;
344 // _GLIBCXX_RESOLVE_LIB_DEFECTS
345 // 91. Description of operator>> and getline() for string<>
346 // might cause endless loop
347 __in._M_setstate(ios_base::badbit);
351 __err |= ios_base::failbit;
353 __in.setstate(__err);
359 getline(basic_istream<char>& __in, basic_string<char>& __str,
362 typedef basic_istream<char> __istream_type;
363 typedef __istream_type::int_type __int_type;
364 typedef __istream_type::char_type __char_type;
365 typedef __istream_type::traits_type __traits_type;
366 typedef __istream_type::__streambuf_type __streambuf_type;
367 typedef __istream_type::__ctype_type __ctype_type;
368 typedef basic_string<char> __string_type;
369 typedef __string_type::size_type __size_type;
371 __size_type __extracted = 0;
372 const __size_type __n = __str.max_size();
373 ios_base::iostate __err = ios_base::goodbit;
374 __istream_type::sentry __cerb(__in, true);
380 const __int_type __idelim = __traits_type::to_int_type(__delim);
381 const __int_type __eof = __traits_type::eof();
382 __streambuf_type* __sb = __in.rdbuf();
383 __int_type __c = __sb->sgetc();
385 while (__extracted < __n
386 && !__traits_type::eq_int_type(__c, __eof)
387 && !__traits_type::eq_int_type(__c, __idelim))
389 streamsize __size = std::min(streamsize(__sb->egptr()
391 streamsize(__n - __extracted));
394 const __char_type* __p = __traits_type::find(__sb->gptr(),
398 __size = __p - __sb->gptr();
399 __str.append(__sb->gptr(), __size);
401 __extracted += __size;
406 __str += __traits_type::to_char_type(__c);
408 __c = __sb->snextc();
412 if (__traits_type::eq_int_type(__c, __eof))
413 __err |= ios_base::eofbit;
414 else if (__traits_type::eq_int_type(__c, __idelim))
420 __err |= ios_base::failbit;
422 __catch(__cxxabiv1::__forced_unwind&)
424 __in._M_setstate(ios_base::badbit);
425 __throw_exception_again;
429 // _GLIBCXX_RESOLVE_LIB_DEFECTS
430 // 91. Description of operator>> and getline() for string<>
431 // might cause endless loop
432 __in._M_setstate(ios_base::badbit);
436 __err |= ios_base::failbit;
438 __in.setstate(__err);
442 #ifdef _GLIBCXX_USE_WCHAR_T
444 basic_istream<wchar_t>&
445 basic_istream<wchar_t>::
446 getline(char_type* __s, streamsize __n, char_type __delim)
449 ios_base::iostate __err = ios_base::goodbit;
450 sentry __cerb(*this, true);
455 const int_type __idelim = traits_type::to_int_type(__delim);
456 const int_type __eof = traits_type::eof();
457 __streambuf_type* __sb = this->rdbuf();
458 int_type __c = __sb->sgetc();
460 while (_M_gcount + 1 < __n
461 && !traits_type::eq_int_type(__c, __eof)
462 && !traits_type::eq_int_type(__c, __idelim))
464 streamsize __size = std::min(streamsize(__sb->egptr()
466 streamsize(__n - _M_gcount
470 const char_type* __p = traits_type::find(__sb->gptr(),
474 __size = __p - __sb->gptr();
475 traits_type::copy(__s, __sb->gptr(), __size);
483 *__s++ = traits_type::to_char_type(__c);
485 __c = __sb->snextc();
489 if (traits_type::eq_int_type(__c, __eof))
490 __err |= ios_base::eofbit;
491 else if (traits_type::eq_int_type(__c, __idelim))
497 __err |= ios_base::failbit;
499 __catch(__cxxabiv1::__forced_unwind&)
501 this->_M_setstate(ios_base::badbit);
502 __throw_exception_again;
505 { this->_M_setstate(ios_base::badbit); }
507 // _GLIBCXX_RESOLVE_LIB_DEFECTS
508 // 243. get and getline when sentry reports failure.
512 __err |= ios_base::failbit;
514 this->setstate(__err);
519 basic_istream<wchar_t>&
520 basic_istream<wchar_t>::
521 ignore(streamsize __n, int_type __delim)
523 if (traits_type::eq_int_type(__delim, traits_type::eof()))
527 sentry __cerb(*this, true);
528 if (__n > 0 && __cerb)
530 ios_base::iostate __err = ios_base::goodbit;
533 const char_type __cdelim = traits_type::to_char_type(__delim);
534 const int_type __eof = traits_type::eof();
535 __streambuf_type* __sb = this->rdbuf();
536 int_type __c = __sb->sgetc();
538 bool __large_ignore = false;
541 while (_M_gcount < __n
542 && !traits_type::eq_int_type(__c, __eof)
543 && !traits_type::eq_int_type(__c, __delim))
545 streamsize __size = std::min(streamsize(__sb->egptr()
547 streamsize(__n - _M_gcount));
550 const char_type* __p = traits_type::find(__sb->gptr(),
554 __size = __p - __sb->gptr();
562 __c = __sb->snextc();
565 if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
566 && !traits_type::eq_int_type(__c, __eof)
567 && !traits_type::eq_int_type(__c, __delim))
570 __gnu_cxx::__numeric_traits<streamsize>::__min;
571 __large_ignore = true;
578 _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;
580 if (traits_type::eq_int_type(__c, __eof))
581 __err |= ios_base::eofbit;
582 else if (traits_type::eq_int_type(__c, __delim))
585 < __gnu_cxx::__numeric_traits<streamsize>::__max)
590 __catch(__cxxabiv1::__forced_unwind&)
592 this->_M_setstate(ios_base::badbit);
593 __throw_exception_again;
596 { this->_M_setstate(ios_base::badbit); }
598 this->setstate(__err);
604 basic_istream<wchar_t>&
605 getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
608 typedef basic_istream<wchar_t> __istream_type;
609 typedef __istream_type::int_type __int_type;
610 typedef __istream_type::char_type __char_type;
611 typedef __istream_type::traits_type __traits_type;
612 typedef __istream_type::__streambuf_type __streambuf_type;
613 typedef __istream_type::__ctype_type __ctype_type;
614 typedef basic_string<wchar_t> __string_type;
615 typedef __string_type::size_type __size_type;
617 __size_type __extracted = 0;
618 const __size_type __n = __str.max_size();
619 ios_base::iostate __err = ios_base::goodbit;
620 __istream_type::sentry __cerb(__in, true);
626 const __int_type __idelim = __traits_type::to_int_type(__delim);
627 const __int_type __eof = __traits_type::eof();
628 __streambuf_type* __sb = __in.rdbuf();
629 __int_type __c = __sb->sgetc();
631 while (__extracted < __n
632 && !__traits_type::eq_int_type(__c, __eof)
633 && !__traits_type::eq_int_type(__c, __idelim))
635 streamsize __size = std::min(streamsize(__sb->egptr()
637 streamsize(__n - __extracted));
640 const __char_type* __p = __traits_type::find(__sb->gptr(),
644 __size = __p - __sb->gptr();
645 __str.append(__sb->gptr(), __size);
647 __extracted += __size;
652 __str += __traits_type::to_char_type(__c);
654 __c = __sb->snextc();
658 if (__traits_type::eq_int_type(__c, __eof))
659 __err |= ios_base::eofbit;
660 else if (__traits_type::eq_int_type(__c, __idelim))
666 __err |= ios_base::failbit;
668 __catch(__cxxabiv1::__forced_unwind&)
670 __in._M_setstate(ios_base::badbit);
671 __throw_exception_again;
675 // _GLIBCXX_RESOLVE_LIB_DEFECTS
676 // 91. Description of operator>> and getline() for string<>
677 // might cause endless loop
678 __in._M_setstate(ios_base::badbit);
682 __err |= ios_base::failbit;
684 __in.setstate(__err);
689 _GLIBCXX_END_NAMESPACE_VERSION