100db7afdSDavid E. O'Brien // istream classes -*- C++ -*-
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*f8a1b7d9SAlexander Kabaev // 2006, 2007
500db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
600db7afdSDavid E. O'Brien //
700db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free
800db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
900db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
1000db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1100db7afdSDavid E. O'Brien // any later version.
1200db7afdSDavid E. O'Brien
1300db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1400db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1500db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1600db7afdSDavid E. O'Brien // GNU General Public License for more details.
1700db7afdSDavid E. O'Brien
1800db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1900db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free
20*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2100db7afdSDavid E. O'Brien // USA.
2200db7afdSDavid E. O'Brien
2300db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2400db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate
2500db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2600db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2700db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however
2900db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
3000db7afdSDavid E. O'Brien // the GNU General Public License.
3100db7afdSDavid E. O'Brien
32*f8a1b7d9SAlexander Kabaev /** @file istream.tcc
33*f8a1b7d9SAlexander Kabaev * This is an internal header file, included by other library headers.
34*f8a1b7d9SAlexander Kabaev * You should not attempt to use it directly.
35*f8a1b7d9SAlexander Kabaev */
36*f8a1b7d9SAlexander Kabaev
3700db7afdSDavid E. O'Brien //
38ffeaf689SAlexander Kabaev // ISO C++ 14882: 27.6.1 Input streams
3900db7afdSDavid E. O'Brien //
4000db7afdSDavid E. O'Brien
41ffeaf689SAlexander Kabaev #ifndef _ISTREAM_TCC
42ffeaf689SAlexander Kabaev #define _ISTREAM_TCC 1
43ffeaf689SAlexander Kabaev
4400db7afdSDavid E. O'Brien #pragma GCC system_header
4500db7afdSDavid E. O'Brien
4600db7afdSDavid E. O'Brien #include <locale>
4700db7afdSDavid E. O'Brien #include <ostream> // For flush()
4800db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)49*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
50*f8a1b7d9SAlexander Kabaev
5100db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
5200db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::sentry::
53ffeaf689SAlexander Kabaev sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
5400db7afdSDavid E. O'Brien {
55ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
5600db7afdSDavid E. O'Brien if (__in.good())
5700db7afdSDavid E. O'Brien {
5800db7afdSDavid E. O'Brien if (__in.tie())
5900db7afdSDavid E. O'Brien __in.tie()->flush();
60ffeaf689SAlexander Kabaev if (!__noskip && (__in.flags() & ios_base::skipws))
6100db7afdSDavid E. O'Brien {
6200db7afdSDavid E. O'Brien const __int_type __eof = traits_type::eof();
6300db7afdSDavid E. O'Brien __streambuf_type* __sb = __in.rdbuf();
6400db7afdSDavid E. O'Brien __int_type __c = __sb->sgetc();
6500db7afdSDavid E. O'Brien
66ffeaf689SAlexander Kabaev const __ctype_type& __ct = __check_facet(__in._M_ctype);
67ca6500fcSAlexander Kabaev while (!traits_type::eq_int_type(__c, __eof)
68ffeaf689SAlexander Kabaev && __ct.is(ctype_base::space,
69ca6500fcSAlexander Kabaev traits_type::to_char_type(__c)))
7000db7afdSDavid E. O'Brien __c = __sb->snextc();
7100db7afdSDavid E. O'Brien
72ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
73ffeaf689SAlexander Kabaev // 195. Should basic_istream::sentry's constructor ever
74ffeaf689SAlexander Kabaev // set eofbit?
75ca6500fcSAlexander Kabaev if (traits_type::eq_int_type(__c, __eof))
76ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
7700db7afdSDavid E. O'Brien }
7800db7afdSDavid E. O'Brien }
7900db7afdSDavid E. O'Brien
80ffeaf689SAlexander Kabaev if (__in.good() && __err == ios_base::goodbit)
8100db7afdSDavid E. O'Brien _M_ok = true;
8200db7afdSDavid E. O'Brien else
8300db7afdSDavid E. O'Brien {
84ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
85ffeaf689SAlexander Kabaev __in.setstate(__err);
8600db7afdSDavid E. O'Brien }
8700db7afdSDavid E. O'Brien }
8800db7afdSDavid E. O'Brien
8900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
90*f8a1b7d9SAlexander Kabaev template<typename _ValueT>
9100db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
9200db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
_M_extract(_ValueT & __v)93*f8a1b7d9SAlexander Kabaev _M_extract(_ValueT& __v)
9400db7afdSDavid E. O'Brien {
9500db7afdSDavid E. O'Brien sentry __cerb(*this, false);
9600db7afdSDavid E. O'Brien if (__cerb)
9700db7afdSDavid E. O'Brien {
98ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
9900db7afdSDavid E. O'Brien try
10000db7afdSDavid E. O'Brien {
101ffeaf689SAlexander Kabaev const __num_get_type& __ng = __check_facet(this->_M_num_get);
102*f8a1b7d9SAlexander Kabaev __ng.get(*this, 0, *this, __err, __v);
10300db7afdSDavid E. O'Brien }
1041b86b14eSAlexander Kabaev catch(...)
105ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
106ffeaf689SAlexander Kabaev if (__err)
107ffeaf689SAlexander Kabaev this->setstate(__err);
10800db7afdSDavid E. O'Brien }
10900db7afdSDavid E. O'Brien return *this;
11000db7afdSDavid E. O'Brien }
11100db7afdSDavid E. O'Brien
11200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
11300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
11400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
operator >>(short & __n)11500db7afdSDavid E. O'Brien operator>>(short& __n)
11600db7afdSDavid E. O'Brien {
117ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
11800db7afdSDavid E. O'Brien // 118. basic_istream uses nonexistent num_get member functions.
119*f8a1b7d9SAlexander Kabaev long __l;
120*f8a1b7d9SAlexander Kabaev _M_extract(__l);
121*f8a1b7d9SAlexander Kabaev if (!this->fail())
122*f8a1b7d9SAlexander Kabaev {
123*f8a1b7d9SAlexander Kabaev if (numeric_limits<short>::min() <= __l
124*f8a1b7d9SAlexander Kabaev && __l <= numeric_limits<short>::max())
12500db7afdSDavid E. O'Brien __n = __l;
12600db7afdSDavid E. O'Brien else
127*f8a1b7d9SAlexander Kabaev this->setstate(ios_base::failbit);
12800db7afdSDavid E. O'Brien }
12900db7afdSDavid E. O'Brien return *this;
13000db7afdSDavid E. O'Brien }
13100db7afdSDavid E. O'Brien
13200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
13300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
13400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
operator >>(int & __n)13500db7afdSDavid E. O'Brien operator>>(int& __n)
13600db7afdSDavid E. O'Brien {
137ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
13800db7afdSDavid E. O'Brien // 118. basic_istream uses nonexistent num_get member functions.
139*f8a1b7d9SAlexander Kabaev long __l;
140*f8a1b7d9SAlexander Kabaev _M_extract(__l);
141*f8a1b7d9SAlexander Kabaev if (!this->fail())
142*f8a1b7d9SAlexander Kabaev {
143*f8a1b7d9SAlexander Kabaev if (numeric_limits<int>::min() <= __l
144*f8a1b7d9SAlexander Kabaev && __l <= numeric_limits<int>::max())
14500db7afdSDavid E. O'Brien __n = __l;
14600db7afdSDavid E. O'Brien else
147*f8a1b7d9SAlexander Kabaev this->setstate(ios_base::failbit);
14800db7afdSDavid E. O'Brien }
14900db7afdSDavid E. O'Brien return *this;
15000db7afdSDavid E. O'Brien }
15100db7afdSDavid E. O'Brien
15200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
15300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
15400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
operator >>(__streambuf_type * __sbout)15500db7afdSDavid E. O'Brien operator>>(__streambuf_type* __sbout)
15600db7afdSDavid E. O'Brien {
157ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
15800db7afdSDavid E. O'Brien sentry __cerb(*this, false);
159ffeaf689SAlexander Kabaev if (__cerb && __sbout)
16000db7afdSDavid E. O'Brien {
16100db7afdSDavid E. O'Brien try
16200db7afdSDavid E. O'Brien {
163*f8a1b7d9SAlexander Kabaev bool __ineof;
164*f8a1b7d9SAlexander Kabaev if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
165ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
166*f8a1b7d9SAlexander Kabaev if (__ineof)
167*f8a1b7d9SAlexander Kabaev __err |= ios_base::eofbit;
16800db7afdSDavid E. O'Brien }
1691b86b14eSAlexander Kabaev catch(...)
170ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::failbit); }
17100db7afdSDavid E. O'Brien }
172ffeaf689SAlexander Kabaev else if (!__sbout)
173ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
174ffeaf689SAlexander Kabaev if (__err)
175ffeaf689SAlexander Kabaev this->setstate(__err);
17600db7afdSDavid E. O'Brien return *this;
17700db7afdSDavid E. O'Brien }
17800db7afdSDavid E. O'Brien
17900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
18000db7afdSDavid E. O'Brien typename basic_istream<_CharT, _Traits>::int_type
18100db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
get(void)18200db7afdSDavid E. O'Brien get(void)
18300db7afdSDavid E. O'Brien {
18400db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
18500db7afdSDavid E. O'Brien int_type __c = __eof;
18600db7afdSDavid E. O'Brien _M_gcount = 0;
187ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
18800db7afdSDavid E. O'Brien sentry __cerb(*this, true);
18900db7afdSDavid E. O'Brien if (__cerb)
19000db7afdSDavid E. O'Brien {
19100db7afdSDavid E. O'Brien try
19200db7afdSDavid E. O'Brien {
19300db7afdSDavid E. O'Brien __c = this->rdbuf()->sbumpc();
19400db7afdSDavid E. O'Brien // 27.6.1.1 paragraph 3
195ca6500fcSAlexander Kabaev if (!traits_type::eq_int_type(__c, __eof))
19600db7afdSDavid E. O'Brien _M_gcount = 1;
19700db7afdSDavid E. O'Brien else
198ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
19900db7afdSDavid E. O'Brien }
2001b86b14eSAlexander Kabaev catch(...)
201ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
20200db7afdSDavid E. O'Brien }
203ffeaf689SAlexander Kabaev if (!_M_gcount)
204ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
205ffeaf689SAlexander Kabaev if (__err)
206ffeaf689SAlexander Kabaev this->setstate(__err);
20700db7afdSDavid E. O'Brien return __c;
20800db7afdSDavid E. O'Brien }
20900db7afdSDavid E. O'Brien
21000db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
21100db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
21200db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
get(char_type & __c)21300db7afdSDavid E. O'Brien get(char_type& __c)
21400db7afdSDavid E. O'Brien {
21500db7afdSDavid E. O'Brien _M_gcount = 0;
216ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
21700db7afdSDavid E. O'Brien sentry __cerb(*this, true);
21800db7afdSDavid E. O'Brien if (__cerb)
21900db7afdSDavid E. O'Brien {
22000db7afdSDavid E. O'Brien try
22100db7afdSDavid E. O'Brien {
222ffeaf689SAlexander Kabaev const int_type __cb = this->rdbuf()->sbumpc();
22300db7afdSDavid E. O'Brien // 27.6.1.1 paragraph 3
224ffeaf689SAlexander Kabaev if (!traits_type::eq_int_type(__cb, traits_type::eof()))
22500db7afdSDavid E. O'Brien {
22600db7afdSDavid E. O'Brien _M_gcount = 1;
227ffeaf689SAlexander Kabaev __c = traits_type::to_char_type(__cb);
22800db7afdSDavid E. O'Brien }
22900db7afdSDavid E. O'Brien else
230ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
23100db7afdSDavid E. O'Brien }
2321b86b14eSAlexander Kabaev catch(...)
233ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
23400db7afdSDavid E. O'Brien }
235ffeaf689SAlexander Kabaev if (!_M_gcount)
236ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
237ffeaf689SAlexander Kabaev if (__err)
238ffeaf689SAlexander Kabaev this->setstate(__err);
23900db7afdSDavid E. O'Brien return *this;
24000db7afdSDavid E. O'Brien }
24100db7afdSDavid E. O'Brien
24200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
24300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
24400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
get(char_type * __s,streamsize __n,char_type __delim)24500db7afdSDavid E. O'Brien get(char_type* __s, streamsize __n, char_type __delim)
24600db7afdSDavid E. O'Brien {
24700db7afdSDavid E. O'Brien _M_gcount = 0;
248ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
24900db7afdSDavid E. O'Brien sentry __cerb(*this, true);
25000db7afdSDavid E. O'Brien if (__cerb)
25100db7afdSDavid E. O'Brien {
25200db7afdSDavid E. O'Brien try
25300db7afdSDavid E. O'Brien {
25400db7afdSDavid E. O'Brien const int_type __idelim = traits_type::to_int_type(__delim);
25500db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
25600db7afdSDavid E. O'Brien __streambuf_type* __sb = this->rdbuf();
25700db7afdSDavid E. O'Brien int_type __c = __sb->sgetc();
25800db7afdSDavid E. O'Brien
259ca6500fcSAlexander Kabaev while (_M_gcount + 1 < __n
260ca6500fcSAlexander Kabaev && !traits_type::eq_int_type(__c, __eof)
261ca6500fcSAlexander Kabaev && !traits_type::eq_int_type(__c, __idelim))
26200db7afdSDavid E. O'Brien {
26300db7afdSDavid E. O'Brien *__s++ = traits_type::to_char_type(__c);
26400db7afdSDavid E. O'Brien ++_M_gcount;
265ffeaf689SAlexander Kabaev __c = __sb->snextc();
26600db7afdSDavid E. O'Brien }
267ca6500fcSAlexander Kabaev if (traits_type::eq_int_type(__c, __eof))
268ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
26900db7afdSDavid E. O'Brien }
2701b86b14eSAlexander Kabaev catch(...)
271ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
27200db7afdSDavid E. O'Brien }
273*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
274*f8a1b7d9SAlexander Kabaev // 243. get and getline when sentry reports failure.
275*f8a1b7d9SAlexander Kabaev if (__n > 0)
27600db7afdSDavid E. O'Brien *__s = char_type();
27700db7afdSDavid E. O'Brien if (!_M_gcount)
278ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
279ffeaf689SAlexander Kabaev if (__err)
280ffeaf689SAlexander Kabaev this->setstate(__err);
28100db7afdSDavid E. O'Brien return *this;
28200db7afdSDavid E. O'Brien }
28300db7afdSDavid E. O'Brien
28400db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
28500db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
28600db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
get(__streambuf_type & __sb,char_type __delim)28700db7afdSDavid E. O'Brien get(__streambuf_type& __sb, char_type __delim)
28800db7afdSDavid E. O'Brien {
28900db7afdSDavid E. O'Brien _M_gcount = 0;
290ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
29100db7afdSDavid E. O'Brien sentry __cerb(*this, true);
29200db7afdSDavid E. O'Brien if (__cerb)
29300db7afdSDavid E. O'Brien {
29400db7afdSDavid E. O'Brien try
29500db7afdSDavid E. O'Brien {
29600db7afdSDavid E. O'Brien const int_type __idelim = traits_type::to_int_type(__delim);
29700db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
29800db7afdSDavid E. O'Brien __streambuf_type* __this_sb = this->rdbuf();
29900db7afdSDavid E. O'Brien int_type __c = __this_sb->sgetc();
300ca6500fcSAlexander Kabaev char_type __c2 = traits_type::to_char_type(__c);
30100db7afdSDavid E. O'Brien
302ca6500fcSAlexander Kabaev while (!traits_type::eq_int_type(__c, __eof)
303ca6500fcSAlexander Kabaev && !traits_type::eq_int_type(__c, __idelim)
304ca6500fcSAlexander Kabaev && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
30500db7afdSDavid E. O'Brien {
30600db7afdSDavid E. O'Brien ++_M_gcount;
30700db7afdSDavid E. O'Brien __c = __this_sb->snextc();
308ca6500fcSAlexander Kabaev __c2 = traits_type::to_char_type(__c);
30900db7afdSDavid E. O'Brien }
310ca6500fcSAlexander Kabaev if (traits_type::eq_int_type(__c, __eof))
311ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
31200db7afdSDavid E. O'Brien }
3131b86b14eSAlexander Kabaev catch(...)
314ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
31500db7afdSDavid E. O'Brien }
31600db7afdSDavid E. O'Brien if (!_M_gcount)
317ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
318ffeaf689SAlexander Kabaev if (__err)
319ffeaf689SAlexander Kabaev this->setstate(__err);
32000db7afdSDavid E. O'Brien return *this;
32100db7afdSDavid E. O'Brien }
32200db7afdSDavid E. O'Brien
32300db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
32400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
32500db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
getline(char_type * __s,streamsize __n,char_type __delim)32600db7afdSDavid E. O'Brien getline(char_type* __s, streamsize __n, char_type __delim)
32700db7afdSDavid E. O'Brien {
32800db7afdSDavid E. O'Brien _M_gcount = 0;
329ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
33000db7afdSDavid E. O'Brien sentry __cerb(*this, true);
33100db7afdSDavid E. O'Brien if (__cerb)
33200db7afdSDavid E. O'Brien {
33300db7afdSDavid E. O'Brien try
33400db7afdSDavid E. O'Brien {
33500db7afdSDavid E. O'Brien const int_type __idelim = traits_type::to_int_type(__delim);
33600db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
33700db7afdSDavid E. O'Brien __streambuf_type* __sb = this->rdbuf();
33800db7afdSDavid E. O'Brien int_type __c = __sb->sgetc();
33900db7afdSDavid E. O'Brien
340ca6500fcSAlexander Kabaev while (_M_gcount + 1 < __n
341ca6500fcSAlexander Kabaev && !traits_type::eq_int_type(__c, __eof)
342ca6500fcSAlexander Kabaev && !traits_type::eq_int_type(__c, __idelim))
34300db7afdSDavid E. O'Brien {
34400db7afdSDavid E. O'Brien *__s++ = traits_type::to_char_type(__c);
34500db7afdSDavid E. O'Brien __c = __sb->snextc();
346*f8a1b7d9SAlexander Kabaev ++_M_gcount;
34700db7afdSDavid E. O'Brien }
348ca6500fcSAlexander Kabaev if (traits_type::eq_int_type(__c, __eof))
349ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
350*f8a1b7d9SAlexander Kabaev else
35100db7afdSDavid E. O'Brien {
352*f8a1b7d9SAlexander Kabaev if (traits_type::eq_int_type(__c, __idelim))
353*f8a1b7d9SAlexander Kabaev {
354ffeaf689SAlexander Kabaev __sb->sbumpc();
355*f8a1b7d9SAlexander Kabaev ++_M_gcount;
35600db7afdSDavid E. O'Brien }
35700db7afdSDavid E. O'Brien else
358ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
35900db7afdSDavid E. O'Brien }
360*f8a1b7d9SAlexander Kabaev }
3611b86b14eSAlexander Kabaev catch(...)
362ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
36300db7afdSDavid E. O'Brien }
364*f8a1b7d9SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
365*f8a1b7d9SAlexander Kabaev // 243. get and getline when sentry reports failure.
366*f8a1b7d9SAlexander Kabaev if (__n > 0)
36700db7afdSDavid E. O'Brien *__s = char_type();
36800db7afdSDavid E. O'Brien if (!_M_gcount)
369ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
370ffeaf689SAlexander Kabaev if (__err)
371ffeaf689SAlexander Kabaev this->setstate(__err);
37200db7afdSDavid E. O'Brien return *this;
37300db7afdSDavid E. O'Brien }
37400db7afdSDavid E. O'Brien
375*f8a1b7d9SAlexander Kabaev // We provide three overloads, since the first two are much simpler
376*f8a1b7d9SAlexander Kabaev // than the general case. Also, the latter two can thus adopt the
377*f8a1b7d9SAlexander Kabaev // same "batchy" strategy used by getline above.
378*f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits>
379*f8a1b7d9SAlexander Kabaev basic_istream<_CharT, _Traits>&
380*f8a1b7d9SAlexander Kabaev basic_istream<_CharT, _Traits>::
ignore(void)381*f8a1b7d9SAlexander Kabaev ignore(void)
382*f8a1b7d9SAlexander Kabaev {
383*f8a1b7d9SAlexander Kabaev _M_gcount = 0;
384*f8a1b7d9SAlexander Kabaev sentry __cerb(*this, true);
385*f8a1b7d9SAlexander Kabaev if (__cerb)
386*f8a1b7d9SAlexander Kabaev {
387*f8a1b7d9SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
388*f8a1b7d9SAlexander Kabaev try
389*f8a1b7d9SAlexander Kabaev {
390*f8a1b7d9SAlexander Kabaev const int_type __eof = traits_type::eof();
391*f8a1b7d9SAlexander Kabaev __streambuf_type* __sb = this->rdbuf();
392*f8a1b7d9SAlexander Kabaev
393*f8a1b7d9SAlexander Kabaev if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
394*f8a1b7d9SAlexander Kabaev __err |= ios_base::eofbit;
395*f8a1b7d9SAlexander Kabaev else
396*f8a1b7d9SAlexander Kabaev _M_gcount = 1;
397*f8a1b7d9SAlexander Kabaev }
398*f8a1b7d9SAlexander Kabaev catch(...)
399*f8a1b7d9SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
400*f8a1b7d9SAlexander Kabaev if (__err)
401*f8a1b7d9SAlexander Kabaev this->setstate(__err);
402*f8a1b7d9SAlexander Kabaev }
403*f8a1b7d9SAlexander Kabaev return *this;
404*f8a1b7d9SAlexander Kabaev }
405*f8a1b7d9SAlexander Kabaev
406*f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits>
407*f8a1b7d9SAlexander Kabaev basic_istream<_CharT, _Traits>&
408*f8a1b7d9SAlexander Kabaev basic_istream<_CharT, _Traits>::
ignore(streamsize __n)409*f8a1b7d9SAlexander Kabaev ignore(streamsize __n)
410*f8a1b7d9SAlexander Kabaev {
411*f8a1b7d9SAlexander Kabaev _M_gcount = 0;
412*f8a1b7d9SAlexander Kabaev sentry __cerb(*this, true);
413*f8a1b7d9SAlexander Kabaev if (__cerb && __n > 0)
414*f8a1b7d9SAlexander Kabaev {
415*f8a1b7d9SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
416*f8a1b7d9SAlexander Kabaev try
417*f8a1b7d9SAlexander Kabaev {
418*f8a1b7d9SAlexander Kabaev const int_type __eof = traits_type::eof();
419*f8a1b7d9SAlexander Kabaev __streambuf_type* __sb = this->rdbuf();
420*f8a1b7d9SAlexander Kabaev int_type __c = __sb->sgetc();
421*f8a1b7d9SAlexander Kabaev
422*f8a1b7d9SAlexander Kabaev // N.B. On LFS-enabled platforms streamsize is still 32 bits
423*f8a1b7d9SAlexander Kabaev // wide: if we want to implement the standard mandated behavior
424*f8a1b7d9SAlexander Kabaev // for n == max() (see 27.6.1.3/24) we are at risk of signed
425*f8a1b7d9SAlexander Kabaev // integer overflow: thus these contortions. Also note that,
426*f8a1b7d9SAlexander Kabaev // by definition, when more than 2G chars are actually ignored,
427*f8a1b7d9SAlexander Kabaev // _M_gcount (the return value of gcount, that is) cannot be
428*f8a1b7d9SAlexander Kabaev // really correct, being unavoidably too small.
429*f8a1b7d9SAlexander Kabaev bool __large_ignore = false;
430*f8a1b7d9SAlexander Kabaev while (true)
431*f8a1b7d9SAlexander Kabaev {
432*f8a1b7d9SAlexander Kabaev while (_M_gcount < __n
433*f8a1b7d9SAlexander Kabaev && !traits_type::eq_int_type(__c, __eof))
434*f8a1b7d9SAlexander Kabaev {
435*f8a1b7d9SAlexander Kabaev ++_M_gcount;
436*f8a1b7d9SAlexander Kabaev __c = __sb->snextc();
437*f8a1b7d9SAlexander Kabaev }
438*f8a1b7d9SAlexander Kabaev if (__n == numeric_limits<streamsize>::max()
439*f8a1b7d9SAlexander Kabaev && !traits_type::eq_int_type(__c, __eof))
440*f8a1b7d9SAlexander Kabaev {
441*f8a1b7d9SAlexander Kabaev _M_gcount = numeric_limits<streamsize>::min();
442*f8a1b7d9SAlexander Kabaev __large_ignore = true;
443*f8a1b7d9SAlexander Kabaev }
444*f8a1b7d9SAlexander Kabaev else
445*f8a1b7d9SAlexander Kabaev break;
446*f8a1b7d9SAlexander Kabaev }
447*f8a1b7d9SAlexander Kabaev
448*f8a1b7d9SAlexander Kabaev if (__large_ignore)
449*f8a1b7d9SAlexander Kabaev _M_gcount = numeric_limits<streamsize>::max();
450*f8a1b7d9SAlexander Kabaev
451*f8a1b7d9SAlexander Kabaev if (traits_type::eq_int_type(__c, __eof))
452*f8a1b7d9SAlexander Kabaev __err |= ios_base::eofbit;
453*f8a1b7d9SAlexander Kabaev }
454*f8a1b7d9SAlexander Kabaev catch(...)
455*f8a1b7d9SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
456*f8a1b7d9SAlexander Kabaev if (__err)
457*f8a1b7d9SAlexander Kabaev this->setstate(__err);
458*f8a1b7d9SAlexander Kabaev }
459*f8a1b7d9SAlexander Kabaev return *this;
460*f8a1b7d9SAlexander Kabaev }
461*f8a1b7d9SAlexander Kabaev
46200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
46300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
46400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
ignore(streamsize __n,int_type __delim)46500db7afdSDavid E. O'Brien ignore(streamsize __n, int_type __delim)
46600db7afdSDavid E. O'Brien {
46700db7afdSDavid E. O'Brien _M_gcount = 0;
46800db7afdSDavid E. O'Brien sentry __cerb(*this, true);
469ca6500fcSAlexander Kabaev if (__cerb && __n > 0)
47000db7afdSDavid E. O'Brien {
471ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
47200db7afdSDavid E. O'Brien try
47300db7afdSDavid E. O'Brien {
47400db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
47500db7afdSDavid E. O'Brien __streambuf_type* __sb = this->rdbuf();
476*f8a1b7d9SAlexander Kabaev int_type __c = __sb->sgetc();
47700db7afdSDavid E. O'Brien
478*f8a1b7d9SAlexander Kabaev // See comment above.
479*f8a1b7d9SAlexander Kabaev bool __large_ignore = false;
480*f8a1b7d9SAlexander Kabaev while (true)
481*f8a1b7d9SAlexander Kabaev {
482*f8a1b7d9SAlexander Kabaev while (_M_gcount < __n
483*f8a1b7d9SAlexander Kabaev && !traits_type::eq_int_type(__c, __eof)
484*f8a1b7d9SAlexander Kabaev && !traits_type::eq_int_type(__c, __delim))
48500db7afdSDavid E. O'Brien {
48600db7afdSDavid E. O'Brien ++_M_gcount;
487*f8a1b7d9SAlexander Kabaev __c = __sb->snextc();
488*f8a1b7d9SAlexander Kabaev }
489*f8a1b7d9SAlexander Kabaev if (__n == numeric_limits<streamsize>::max()
490*f8a1b7d9SAlexander Kabaev && !traits_type::eq_int_type(__c, __eof)
491*f8a1b7d9SAlexander Kabaev && !traits_type::eq_int_type(__c, __delim))
492*f8a1b7d9SAlexander Kabaev {
493*f8a1b7d9SAlexander Kabaev _M_gcount = numeric_limits<streamsize>::min();
494*f8a1b7d9SAlexander Kabaev __large_ignore = true;
495*f8a1b7d9SAlexander Kabaev }
496*f8a1b7d9SAlexander Kabaev else
497ca6500fcSAlexander Kabaev break;
49800db7afdSDavid E. O'Brien }
499*f8a1b7d9SAlexander Kabaev
500*f8a1b7d9SAlexander Kabaev if (__large_ignore)
501*f8a1b7d9SAlexander Kabaev _M_gcount = numeric_limits<streamsize>::max();
502*f8a1b7d9SAlexander Kabaev
503ca6500fcSAlexander Kabaev if (traits_type::eq_int_type(__c, __eof))
504ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
505*f8a1b7d9SAlexander Kabaev else if (traits_type::eq_int_type(__c, __delim))
506*f8a1b7d9SAlexander Kabaev {
507*f8a1b7d9SAlexander Kabaev if (_M_gcount < numeric_limits<streamsize>::max())
508*f8a1b7d9SAlexander Kabaev ++_M_gcount;
509*f8a1b7d9SAlexander Kabaev __sb->sbumpc();
510*f8a1b7d9SAlexander Kabaev }
51100db7afdSDavid E. O'Brien }
5121b86b14eSAlexander Kabaev catch(...)
513ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
514ffeaf689SAlexander Kabaev if (__err)
515ffeaf689SAlexander Kabaev this->setstate(__err);
51600db7afdSDavid E. O'Brien }
51700db7afdSDavid E. O'Brien return *this;
51800db7afdSDavid E. O'Brien }
51900db7afdSDavid E. O'Brien
52000db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
52100db7afdSDavid E. O'Brien typename basic_istream<_CharT, _Traits>::int_type
52200db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
peek(void)52300db7afdSDavid E. O'Brien peek(void)
52400db7afdSDavid E. O'Brien {
52500db7afdSDavid E. O'Brien int_type __c = traits_type::eof();
52600db7afdSDavid E. O'Brien _M_gcount = 0;
52700db7afdSDavid E. O'Brien sentry __cerb(*this, true);
52800db7afdSDavid E. O'Brien if (__cerb)
52900db7afdSDavid E. O'Brien {
530ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
53100db7afdSDavid E. O'Brien try
532bbe4dd5dSAlexander Kabaev {
533bbe4dd5dSAlexander Kabaev __c = this->rdbuf()->sgetc();
534bbe4dd5dSAlexander Kabaev if (traits_type::eq_int_type(__c, traits_type::eof()))
535ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
536bbe4dd5dSAlexander Kabaev }
5371b86b14eSAlexander Kabaev catch(...)
538ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
539ffeaf689SAlexander Kabaev if (__err)
540ffeaf689SAlexander Kabaev this->setstate(__err);
54100db7afdSDavid E. O'Brien }
54200db7afdSDavid E. O'Brien return __c;
54300db7afdSDavid E. O'Brien }
54400db7afdSDavid E. O'Brien
54500db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
54600db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
54700db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
read(char_type * __s,streamsize __n)54800db7afdSDavid E. O'Brien read(char_type* __s, streamsize __n)
54900db7afdSDavid E. O'Brien {
55000db7afdSDavid E. O'Brien _M_gcount = 0;
55100db7afdSDavid E. O'Brien sentry __cerb(*this, true);
55200db7afdSDavid E. O'Brien if (__cerb)
55300db7afdSDavid E. O'Brien {
554ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
55500db7afdSDavid E. O'Brien try
55600db7afdSDavid E. O'Brien {
55700db7afdSDavid E. O'Brien _M_gcount = this->rdbuf()->sgetn(__s, __n);
55800db7afdSDavid E. O'Brien if (_M_gcount != __n)
559ffeaf689SAlexander Kabaev __err |= (ios_base::eofbit | ios_base::failbit);
56000db7afdSDavid E. O'Brien }
5611b86b14eSAlexander Kabaev catch(...)
562ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
563ffeaf689SAlexander Kabaev if (__err)
564ffeaf689SAlexander Kabaev this->setstate(__err);
56500db7afdSDavid E. O'Brien }
56600db7afdSDavid E. O'Brien return *this;
56700db7afdSDavid E. O'Brien }
56800db7afdSDavid E. O'Brien
56900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
57000db7afdSDavid E. O'Brien streamsize
57100db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
readsome(char_type * __s,streamsize __n)57200db7afdSDavid E. O'Brien readsome(char_type* __s, streamsize __n)
57300db7afdSDavid E. O'Brien {
57400db7afdSDavid E. O'Brien _M_gcount = 0;
57500db7afdSDavid E. O'Brien sentry __cerb(*this, true);
57600db7afdSDavid E. O'Brien if (__cerb)
57700db7afdSDavid E. O'Brien {
578ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
57900db7afdSDavid E. O'Brien try
58000db7afdSDavid E. O'Brien {
5818f1134fbSDavid E. O'Brien // Cannot compare int_type with streamsize generically.
582ffeaf689SAlexander Kabaev const streamsize __num = this->rdbuf()->in_avail();
583ffeaf689SAlexander Kabaev if (__num > 0)
584ffeaf689SAlexander Kabaev _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
585ffeaf689SAlexander Kabaev else if (__num == -1)
586ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
58700db7afdSDavid E. O'Brien }
5881b86b14eSAlexander Kabaev catch(...)
589ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
590ffeaf689SAlexander Kabaev if (__err)
591ffeaf689SAlexander Kabaev this->setstate(__err);
59200db7afdSDavid E. O'Brien }
59300db7afdSDavid E. O'Brien return _M_gcount;
59400db7afdSDavid E. O'Brien }
59500db7afdSDavid E. O'Brien
59600db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
59700db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
59800db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
putback(char_type __c)59900db7afdSDavid E. O'Brien putback(char_type __c)
60000db7afdSDavid E. O'Brien {
601ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
6021b86b14eSAlexander Kabaev // 60. What is a formatted input function?
6031b86b14eSAlexander Kabaev _M_gcount = 0;
60400db7afdSDavid E. O'Brien sentry __cerb(*this, true);
60500db7afdSDavid E. O'Brien if (__cerb)
60600db7afdSDavid E. O'Brien {
607ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
60800db7afdSDavid E. O'Brien try
60900db7afdSDavid E. O'Brien {
61000db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
61100db7afdSDavid E. O'Brien __streambuf_type* __sb = this->rdbuf();
612ca6500fcSAlexander Kabaev if (!__sb
613ca6500fcSAlexander Kabaev || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
614ffeaf689SAlexander Kabaev __err |= ios_base::badbit;
61500db7afdSDavid E. O'Brien }
6161b86b14eSAlexander Kabaev catch(...)
617ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
618ffeaf689SAlexander Kabaev if (__err)
619ffeaf689SAlexander Kabaev this->setstate(__err);
62000db7afdSDavid E. O'Brien }
62100db7afdSDavid E. O'Brien return *this;
62200db7afdSDavid E. O'Brien }
62300db7afdSDavid E. O'Brien
62400db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
62500db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
62600db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
unget(void)62700db7afdSDavid E. O'Brien unget(void)
62800db7afdSDavid E. O'Brien {
629ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
6301b86b14eSAlexander Kabaev // 60. What is a formatted input function?
63100db7afdSDavid E. O'Brien _M_gcount = 0;
63200db7afdSDavid E. O'Brien sentry __cerb(*this, true);
63300db7afdSDavid E. O'Brien if (__cerb)
63400db7afdSDavid E. O'Brien {
635ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
63600db7afdSDavid E. O'Brien try
63700db7afdSDavid E. O'Brien {
63800db7afdSDavid E. O'Brien const int_type __eof = traits_type::eof();
63900db7afdSDavid E. O'Brien __streambuf_type* __sb = this->rdbuf();
640ca6500fcSAlexander Kabaev if (!__sb
641ca6500fcSAlexander Kabaev || traits_type::eq_int_type(__sb->sungetc(), __eof))
642ffeaf689SAlexander Kabaev __err |= ios_base::badbit;
64300db7afdSDavid E. O'Brien }
6441b86b14eSAlexander Kabaev catch(...)
645ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
646ffeaf689SAlexander Kabaev if (__err)
647ffeaf689SAlexander Kabaev this->setstate(__err);
64800db7afdSDavid E. O'Brien }
64900db7afdSDavid E. O'Brien return *this;
65000db7afdSDavid E. O'Brien }
65100db7afdSDavid E. O'Brien
65200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
65300db7afdSDavid E. O'Brien int
65400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
sync(void)65500db7afdSDavid E. O'Brien sync(void)
65600db7afdSDavid E. O'Brien {
657ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
6581b86b14eSAlexander Kabaev // DR60. Do not change _M_gcount.
659ca6500fcSAlexander Kabaev int __ret = -1;
66000db7afdSDavid E. O'Brien sentry __cerb(*this, true);
66100db7afdSDavid E. O'Brien if (__cerb)
66200db7afdSDavid E. O'Brien {
663ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
66400db7afdSDavid E. O'Brien try
66500db7afdSDavid E. O'Brien {
66600db7afdSDavid E. O'Brien __streambuf_type* __sb = this->rdbuf();
667ca6500fcSAlexander Kabaev if (__sb)
668ca6500fcSAlexander Kabaev {
669ca6500fcSAlexander Kabaev if (__sb->pubsync() == -1)
670ffeaf689SAlexander Kabaev __err |= ios_base::badbit;
67100db7afdSDavid E. O'Brien else
67200db7afdSDavid E. O'Brien __ret = 0;
67300db7afdSDavid E. O'Brien }
674ca6500fcSAlexander Kabaev }
6751b86b14eSAlexander Kabaev catch(...)
676ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
677ffeaf689SAlexander Kabaev if (__err)
678ffeaf689SAlexander Kabaev this->setstate(__err);
67900db7afdSDavid E. O'Brien }
68000db7afdSDavid E. O'Brien return __ret;
68100db7afdSDavid E. O'Brien }
68200db7afdSDavid E. O'Brien
68300db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
68400db7afdSDavid E. O'Brien typename basic_istream<_CharT, _Traits>::pos_type
68500db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
tellg(void)68600db7afdSDavid E. O'Brien tellg(void)
68700db7afdSDavid E. O'Brien {
688ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
6891b86b14eSAlexander Kabaev // DR60. Do not change _M_gcount.
69000db7afdSDavid E. O'Brien pos_type __ret = pos_type(-1);
691ffeaf689SAlexander Kabaev try
692ffeaf689SAlexander Kabaev {
6938f1134fbSDavid E. O'Brien if (!this->fail())
694*f8a1b7d9SAlexander Kabaev __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
695*f8a1b7d9SAlexander Kabaev ios_base::in);
696ffeaf689SAlexander Kabaev }
697ffeaf689SAlexander Kabaev catch(...)
698ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
69900db7afdSDavid E. O'Brien return __ret;
70000db7afdSDavid E. O'Brien }
70100db7afdSDavid E. O'Brien
70200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
70300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
70400db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
seekg(pos_type __pos)70500db7afdSDavid E. O'Brien seekg(pos_type __pos)
70600db7afdSDavid E. O'Brien {
707ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
7081b86b14eSAlexander Kabaev // DR60. Do not change _M_gcount.
709ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
710ffeaf689SAlexander Kabaev try
711ffeaf689SAlexander Kabaev {
7128f1134fbSDavid E. O'Brien if (!this->fail())
71300db7afdSDavid E. O'Brien {
71400db7afdSDavid E. O'Brien // 136. seekp, seekg setting wrong streams?
715ffeaf689SAlexander Kabaev const pos_type __p = this->rdbuf()->pubseekpos(__pos,
716ffeaf689SAlexander Kabaev ios_base::in);
71700db7afdSDavid E. O'Brien
71800db7afdSDavid E. O'Brien // 129. Need error indication from seekp() and seekg()
719ffeaf689SAlexander Kabaev if (__p == pos_type(off_type(-1)))
720ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
72100db7afdSDavid E. O'Brien }
722ffeaf689SAlexander Kabaev }
723ffeaf689SAlexander Kabaev catch(...)
724ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
725ffeaf689SAlexander Kabaev if (__err)
726ffeaf689SAlexander Kabaev this->setstate(__err);
72700db7afdSDavid E. O'Brien return *this;
72800db7afdSDavid E. O'Brien }
72900db7afdSDavid E. O'Brien
73000db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
73100db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
73200db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>::
seekg(off_type __off,ios_base::seekdir __dir)73300db7afdSDavid E. O'Brien seekg(off_type __off, ios_base::seekdir __dir)
73400db7afdSDavid E. O'Brien {
735ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
7361b86b14eSAlexander Kabaev // DR60. Do not change _M_gcount.
737ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
738ffeaf689SAlexander Kabaev try
739ffeaf689SAlexander Kabaev {
7408f1134fbSDavid E. O'Brien if (!this->fail())
74100db7afdSDavid E. O'Brien {
74200db7afdSDavid E. O'Brien // 136. seekp, seekg setting wrong streams?
743ffeaf689SAlexander Kabaev const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
74400db7afdSDavid E. O'Brien ios_base::in);
74500db7afdSDavid E. O'Brien
74600db7afdSDavid E. O'Brien // 129. Need error indication from seekp() and seekg()
747ffeaf689SAlexander Kabaev if (__p == pos_type(off_type(-1)))
748ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
74900db7afdSDavid E. O'Brien }
750ffeaf689SAlexander Kabaev }
751ffeaf689SAlexander Kabaev catch(...)
752ffeaf689SAlexander Kabaev { this->_M_setstate(ios_base::badbit); }
753ffeaf689SAlexander Kabaev if (__err)
754ffeaf689SAlexander Kabaev this->setstate(__err);
75500db7afdSDavid E. O'Brien return *this;
75600db7afdSDavid E. O'Brien }
75700db7afdSDavid E. O'Brien
75800db7afdSDavid E. O'Brien // 27.6.1.2.3 Character extraction templates
75900db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
76000db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT & __c)76100db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
76200db7afdSDavid E. O'Brien {
76300db7afdSDavid E. O'Brien typedef basic_istream<_CharT, _Traits> __istream_type;
764ffeaf689SAlexander Kabaev typedef typename __istream_type::int_type __int_type;
765ffeaf689SAlexander Kabaev
76600db7afdSDavid E. O'Brien typename __istream_type::sentry __cerb(__in, false);
76700db7afdSDavid E. O'Brien if (__cerb)
76800db7afdSDavid E. O'Brien {
769ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
77000db7afdSDavid E. O'Brien try
77100db7afdSDavid E. O'Brien {
772ffeaf689SAlexander Kabaev const __int_type __cb = __in.rdbuf()->sbumpc();
773ffeaf689SAlexander Kabaev if (!_Traits::eq_int_type(__cb, _Traits::eof()))
774ffeaf689SAlexander Kabaev __c = _Traits::to_char_type(__cb);
77500db7afdSDavid E. O'Brien else
776ffeaf689SAlexander Kabaev __err |= (ios_base::eofbit | ios_base::failbit);
777ffeaf689SAlexander Kabaev }
778ffeaf689SAlexander Kabaev catch(...)
779ffeaf689SAlexander Kabaev { __in._M_setstate(ios_base::badbit); }
780ffeaf689SAlexander Kabaev if (__err)
781ffeaf689SAlexander Kabaev __in.setstate(__err);
782ffeaf689SAlexander Kabaev }
78300db7afdSDavid E. O'Brien return __in;
78400db7afdSDavid E. O'Brien }
78500db7afdSDavid E. O'Brien
78600db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
78700db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,_CharT * __s)78800db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
78900db7afdSDavid E. O'Brien {
79000db7afdSDavid E. O'Brien typedef basic_istream<_CharT, _Traits> __istream_type;
79100db7afdSDavid E. O'Brien typedef typename __istream_type::__streambuf_type __streambuf_type;
79200db7afdSDavid E. O'Brien typedef typename _Traits::int_type int_type;
79300db7afdSDavid E. O'Brien typedef _CharT char_type;
79400db7afdSDavid E. O'Brien typedef ctype<_CharT> __ctype_type;
79500db7afdSDavid E. O'Brien
796ffeaf689SAlexander Kabaev streamsize __extracted = 0;
797ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
79800db7afdSDavid E. O'Brien typename __istream_type::sentry __cerb(__in, false);
79900db7afdSDavid E. O'Brien if (__cerb)
80000db7afdSDavid E. O'Brien {
80100db7afdSDavid E. O'Brien try
80200db7afdSDavid E. O'Brien {
80300db7afdSDavid E. O'Brien // Figure out how many characters to extract.
80400db7afdSDavid E. O'Brien streamsize __num = __in.width();
8051b86b14eSAlexander Kabaev if (__num <= 0)
80600db7afdSDavid E. O'Brien __num = numeric_limits<streamsize>::max();
80700db7afdSDavid E. O'Brien
808ffeaf689SAlexander Kabaev const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
809ffeaf689SAlexander Kabaev
81000db7afdSDavid E. O'Brien const int_type __eof = _Traits::eof();
81100db7afdSDavid E. O'Brien __streambuf_type* __sb = __in.rdbuf();
81200db7afdSDavid E. O'Brien int_type __c = __sb->sgetc();
81300db7afdSDavid E. O'Brien
81400db7afdSDavid E. O'Brien while (__extracted < __num - 1
8158f1134fbSDavid E. O'Brien && !_Traits::eq_int_type(__c, __eof)
816ffeaf689SAlexander Kabaev && !__ct.is(ctype_base::space,
817ffeaf689SAlexander Kabaev _Traits::to_char_type(__c)))
81800db7afdSDavid E. O'Brien {
8191b86b14eSAlexander Kabaev *__s++ = _Traits::to_char_type(__c);
82000db7afdSDavid E. O'Brien ++__extracted;
82100db7afdSDavid E. O'Brien __c = __sb->snextc();
82200db7afdSDavid E. O'Brien }
8238f1134fbSDavid E. O'Brien if (_Traits::eq_int_type(__c, __eof))
824ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
82500db7afdSDavid E. O'Brien
826ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
82700db7afdSDavid E. O'Brien // 68. Extractors for char* should store null at end
82800db7afdSDavid E. O'Brien *__s = char_type();
82900db7afdSDavid E. O'Brien __in.width(0);
83000db7afdSDavid E. O'Brien }
8311b86b14eSAlexander Kabaev catch(...)
832ffeaf689SAlexander Kabaev { __in._M_setstate(ios_base::badbit); }
83300db7afdSDavid E. O'Brien }
83400db7afdSDavid E. O'Brien if (!__extracted)
835ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
836ffeaf689SAlexander Kabaev if (__err)
837ffeaf689SAlexander Kabaev __in.setstate(__err);
83800db7afdSDavid E. O'Brien return __in;
83900db7afdSDavid E. O'Brien }
84000db7afdSDavid E. O'Brien
84100db7afdSDavid E. O'Brien // 27.6.1.4 Standard basic_istream manipulators
84200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits>
84300db7afdSDavid E. O'Brien basic_istream<_CharT,_Traits>&
ws(basic_istream<_CharT,_Traits> & __in)84400db7afdSDavid E. O'Brien ws(basic_istream<_CharT,_Traits>& __in)
84500db7afdSDavid E. O'Brien {
84600db7afdSDavid E. O'Brien typedef basic_istream<_CharT, _Traits> __istream_type;
84700db7afdSDavid E. O'Brien typedef typename __istream_type::__streambuf_type __streambuf_type;
84800db7afdSDavid E. O'Brien typedef typename __istream_type::__ctype_type __ctype_type;
84900db7afdSDavid E. O'Brien typedef typename __istream_type::int_type __int_type;
85000db7afdSDavid E. O'Brien
851ffeaf689SAlexander Kabaev const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
85200db7afdSDavid E. O'Brien const __int_type __eof = _Traits::eof();
85300db7afdSDavid E. O'Brien __streambuf_type* __sb = __in.rdbuf();
85400db7afdSDavid E. O'Brien __int_type __c = __sb->sgetc();
85500db7afdSDavid E. O'Brien
8568f1134fbSDavid E. O'Brien while (!_Traits::eq_int_type(__c, __eof)
857ffeaf689SAlexander Kabaev && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
85800db7afdSDavid E. O'Brien __c = __sb->snextc();
8598f1134fbSDavid E. O'Brien
8608f1134fbSDavid E. O'Brien if (_Traits::eq_int_type(__c, __eof))
86100db7afdSDavid E. O'Brien __in.setstate(ios_base::eofbit);
86200db7afdSDavid E. O'Brien return __in;
86300db7afdSDavid E. O'Brien }
86400db7afdSDavid E. O'Brien
86500db7afdSDavid E. O'Brien // 21.3.7.9 basic_string::getline and operators
86600db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits, typename _Alloc>
86700db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,basic_string<_CharT,_Traits,_Alloc> & __str)86800db7afdSDavid E. O'Brien operator>>(basic_istream<_CharT, _Traits>& __in,
86900db7afdSDavid E. O'Brien basic_string<_CharT, _Traits, _Alloc>& __str)
87000db7afdSDavid E. O'Brien {
87100db7afdSDavid E. O'Brien typedef basic_istream<_CharT, _Traits> __istream_type;
87200db7afdSDavid E. O'Brien typedef typename __istream_type::int_type __int_type;
87300db7afdSDavid E. O'Brien typedef typename __istream_type::__streambuf_type __streambuf_type;
87400db7afdSDavid E. O'Brien typedef typename __istream_type::__ctype_type __ctype_type;
87500db7afdSDavid E. O'Brien typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
87600db7afdSDavid E. O'Brien typedef typename __string_type::size_type __size_type;
87700db7afdSDavid E. O'Brien
878ffeaf689SAlexander Kabaev __size_type __extracted = 0;
879ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
88000db7afdSDavid E. O'Brien typename __istream_type::sentry __cerb(__in, false);
88100db7afdSDavid E. O'Brien if (__cerb)
88200db7afdSDavid E. O'Brien {
883ffeaf689SAlexander Kabaev try
884ffeaf689SAlexander Kabaev {
885ffeaf689SAlexander Kabaev // Avoid reallocation for common case.
88600db7afdSDavid E. O'Brien __str.erase();
887ffeaf689SAlexander Kabaev _CharT __buf[128];
888ffeaf689SAlexander Kabaev __size_type __len = 0;
889ffeaf689SAlexander Kabaev const streamsize __w = __in.width();
890ffeaf689SAlexander Kabaev const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
891ffeaf689SAlexander Kabaev : __str.max_size();
892ffeaf689SAlexander Kabaev const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
89300db7afdSDavid E. O'Brien const __int_type __eof = _Traits::eof();
89400db7afdSDavid E. O'Brien __streambuf_type* __sb = __in.rdbuf();
89500db7afdSDavid E. O'Brien __int_type __c = __sb->sgetc();
89600db7afdSDavid E. O'Brien
89700db7afdSDavid E. O'Brien while (__extracted < __n
8988f1134fbSDavid E. O'Brien && !_Traits::eq_int_type(__c, __eof)
899ffeaf689SAlexander Kabaev && !__ct.is(ctype_base::space, _Traits::to_char_type(__c)))
90000db7afdSDavid E. O'Brien {
901ffeaf689SAlexander Kabaev if (__len == sizeof(__buf) / sizeof(_CharT))
902ffeaf689SAlexander Kabaev {
903ffeaf689SAlexander Kabaev __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
904ffeaf689SAlexander Kabaev __len = 0;
905ffeaf689SAlexander Kabaev }
906ffeaf689SAlexander Kabaev __buf[__len++] = _Traits::to_char_type(__c);
90700db7afdSDavid E. O'Brien ++__extracted;
90800db7afdSDavid E. O'Brien __c = __sb->snextc();
90900db7afdSDavid E. O'Brien }
910ffeaf689SAlexander Kabaev __str.append(__buf, __len);
911ffeaf689SAlexander Kabaev
9128f1134fbSDavid E. O'Brien if (_Traits::eq_int_type(__c, __eof))
913ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
91400db7afdSDavid E. O'Brien __in.width(0);
91500db7afdSDavid E. O'Brien }
916ffeaf689SAlexander Kabaev catch(...)
917ffeaf689SAlexander Kabaev {
918ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
919ffeaf689SAlexander Kabaev // 91. Description of operator>> and getline() for string<>
920ffeaf689SAlexander Kabaev // might cause endless loop
921ffeaf689SAlexander Kabaev __in._M_setstate(ios_base::badbit);
922ffeaf689SAlexander Kabaev }
923ffeaf689SAlexander Kabaev }
92400db7afdSDavid E. O'Brien // 211. operator>>(istream&, string&) doesn't set failbit
92500db7afdSDavid E. O'Brien if (!__extracted)
926ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
927ffeaf689SAlexander Kabaev if (__err)
928ffeaf689SAlexander Kabaev __in.setstate(__err);
92900db7afdSDavid E. O'Brien return __in;
93000db7afdSDavid E. O'Brien }
93100db7afdSDavid E. O'Brien
93200db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits, typename _Alloc>
93300db7afdSDavid E. O'Brien basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT,_Traits> & __in,basic_string<_CharT,_Traits,_Alloc> & __str,_CharT __delim)93400db7afdSDavid E. O'Brien getline(basic_istream<_CharT, _Traits>& __in,
93500db7afdSDavid E. O'Brien basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
93600db7afdSDavid E. O'Brien {
93700db7afdSDavid E. O'Brien typedef basic_istream<_CharT, _Traits> __istream_type;
93800db7afdSDavid E. O'Brien typedef typename __istream_type::int_type __int_type;
93900db7afdSDavid E. O'Brien typedef typename __istream_type::__streambuf_type __streambuf_type;
94000db7afdSDavid E. O'Brien typedef typename __istream_type::__ctype_type __ctype_type;
94100db7afdSDavid E. O'Brien typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
94200db7afdSDavid E. O'Brien typedef typename __string_type::size_type __size_type;
94300db7afdSDavid E. O'Brien
94400db7afdSDavid E. O'Brien __size_type __extracted = 0;
945ffeaf689SAlexander Kabaev const __size_type __n = __str.max_size();
946ffeaf689SAlexander Kabaev ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
94700db7afdSDavid E. O'Brien typename __istream_type::sentry __cerb(__in, true);
94800db7afdSDavid E. O'Brien if (__cerb)
94900db7afdSDavid E. O'Brien {
950ffeaf689SAlexander Kabaev try
95100db7afdSDavid E. O'Brien {
952ffeaf689SAlexander Kabaev __str.erase();
953ffeaf689SAlexander Kabaev const __int_type __idelim = _Traits::to_int_type(__delim);
954ffeaf689SAlexander Kabaev const __int_type __eof = _Traits::eof();
955ffeaf689SAlexander Kabaev __streambuf_type* __sb = __in.rdbuf();
956ffeaf689SAlexander Kabaev __int_type __c = __sb->sgetc();
957ffeaf689SAlexander Kabaev
958ffeaf689SAlexander Kabaev while (__extracted < __n
959ffeaf689SAlexander Kabaev && !_Traits::eq_int_type(__c, __eof)
960ffeaf689SAlexander Kabaev && !_Traits::eq_int_type(__c, __idelim))
961ffeaf689SAlexander Kabaev {
962*f8a1b7d9SAlexander Kabaev __str += _Traits::to_char_type(__c);
96300db7afdSDavid E. O'Brien ++__extracted;
964ffeaf689SAlexander Kabaev __c = __sb->snextc();
96500db7afdSDavid E. O'Brien }
966ffeaf689SAlexander Kabaev
967ca6500fcSAlexander Kabaev if (_Traits::eq_int_type(__c, __eof))
968ffeaf689SAlexander Kabaev __err |= ios_base::eofbit;
969ffeaf689SAlexander Kabaev else if (_Traits::eq_int_type(__c, __idelim))
970ffeaf689SAlexander Kabaev {
971ffeaf689SAlexander Kabaev ++__extracted;
972ffeaf689SAlexander Kabaev __sb->sbumpc();
97300db7afdSDavid E. O'Brien }
974ffeaf689SAlexander Kabaev else
975ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
976ffeaf689SAlexander Kabaev }
977ffeaf689SAlexander Kabaev catch(...)
978ffeaf689SAlexander Kabaev {
979ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
980ffeaf689SAlexander Kabaev // 91. Description of operator>> and getline() for string<>
981ffeaf689SAlexander Kabaev // might cause endless loop
982ffeaf689SAlexander Kabaev __in._M_setstate(ios_base::badbit);
983ffeaf689SAlexander Kabaev }
984ffeaf689SAlexander Kabaev }
985ffeaf689SAlexander Kabaev if (!__extracted)
986ffeaf689SAlexander Kabaev __err |= ios_base::failbit;
987ffeaf689SAlexander Kabaev if (__err)
988ffeaf689SAlexander Kabaev __in.setstate(__err);
98900db7afdSDavid E. O'Brien return __in;
99000db7afdSDavid E. O'Brien }
99100db7afdSDavid E. O'Brien
99200db7afdSDavid E. O'Brien // Inhibit implicit instantiations for required instantiations,
99300db7afdSDavid E. O'Brien // which are defined via explicit instantiations elsewhere.
99400db7afdSDavid E. O'Brien // NB: This syntax is a GNU extension.
995ffeaf689SAlexander Kabaev #if _GLIBCXX_EXTERN_TEMPLATE
99600db7afdSDavid E. O'Brien extern template class basic_istream<char>;
99700db7afdSDavid E. O'Brien extern template istream& ws(istream&);
99800db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, char&);
99900db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, char*);
100000db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, unsigned char&);
100100db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, signed char&);
100200db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, unsigned char*);
100300db7afdSDavid E. O'Brien extern template istream& operator>>(istream&, signed char*);
100400db7afdSDavid E. O'Brien
1005*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(unsigned short&);
1006*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(unsigned int&);
1007*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(long&);
1008*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(unsigned long&);
1009*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(bool&);
1010*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
1011*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(long long&);
1012*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(unsigned long long&);
1013*f8a1b7d9SAlexander Kabaev #endif
1014*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(float&);
1015*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(double&);
1016*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(long double&);
1017*f8a1b7d9SAlexander Kabaev extern template istream& istream::_M_extract(void*&);
1018*f8a1b7d9SAlexander Kabaev
1019f260e61bSAlexander Kabaev extern template class basic_iostream<char>;
1020f260e61bSAlexander Kabaev
1021ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
102200db7afdSDavid E. O'Brien extern template class basic_istream<wchar_t>;
102300db7afdSDavid E. O'Brien extern template wistream& ws(wistream&);
102400db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, wchar_t&);
102500db7afdSDavid E. O'Brien extern template wistream& operator>>(wistream&, wchar_t*);
1026f260e61bSAlexander Kabaev
1027*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(unsigned short&);
1028*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(unsigned int&);
1029*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(long&);
1030*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(unsigned long&);
1031*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(bool&);
1032*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_LONG_LONG
1033*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(long long&);
1034*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(unsigned long long&);
1035*f8a1b7d9SAlexander Kabaev #endif
1036*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(float&);
1037*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(double&);
1038*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(long double&);
1039*f8a1b7d9SAlexander Kabaev extern template wistream& wistream::_M_extract(void*&);
1040*f8a1b7d9SAlexander Kabaev
1041f260e61bSAlexander Kabaev extern template class basic_iostream<wchar_t>;
1042ca6500fcSAlexander Kabaev #endif
10431b86b14eSAlexander Kabaev #endif
1044*f8a1b7d9SAlexander Kabaev
1045*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
1046ffeaf689SAlexander Kabaev
1047ffeaf689SAlexander Kabaev #endif
1048