istream.tcc revision 117397
1139823Simp// istream classes -*- C++ -*-
2133920Sandre
3133920Sandre// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
4133920Sandre// Free Software Foundation, Inc.
5133920Sandre//
6133920Sandre// This file is part of the GNU ISO C++ Library.  This library is free
7133920Sandre// software; you can redistribute it and/or modify it under the
8133920Sandre// terms of the GNU General Public License as published by the
9133920Sandre// Free Software Foundation; either version 2, or (at your option)
10133920Sandre// any later version.
11133920Sandre
12133920Sandre// This library is distributed in the hope that it will be useful,
13133920Sandre// but WITHOUT ANY WARRANTY; without even the implied warranty of
14133920Sandre// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15133920Sandre// GNU General Public License for more details.
16133920Sandre
17133920Sandre// You should have received a copy of the GNU General Public License along
18133920Sandre// with this library; see the file COPYING.  If not, write to the Free
19133920Sandre// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20133920Sandre// USA.
21133920Sandre
22133920Sandre// As a special exception, you may use this file as part of a free software
23133920Sandre// library without restriction.  Specifically, if other files instantiate
24133920Sandre// templates or use macros or inline functions from this file, or you compile
25133920Sandre// this file and link it with other files to produce an executable, this
26133920Sandre// file does not by itself cause the resulting executable to be covered by
27172467Ssilby// the GNU General Public License.  This exception does not however
28172467Ssilby// invalidate any other reasons why the executable file might be covered by
29172467Ssilby// the GNU General Public License.
30225518Sjhb
31133920Sandre//
32225793Sbz// ISO C++ 14882: 27.6.2  Output streams
33133920Sandre//
34133920Sandre
35133920Sandre#pragma GCC system_header
36133920Sandre
37133920Sandre#include <locale>
38133920Sandre#include <ostream> // For flush()
39133920Sandre
40133920Sandrenamespace std 
41133920Sandre{
42133920Sandre  template<typename _CharT, typename _Traits>
43185895Szec    basic_istream<_CharT, _Traits>::sentry::
44185895Szec    sentry(basic_istream<_CharT, _Traits>& __in, bool __noskipws)
45133920Sandre    {
46133920Sandre      if (__in.good()) 
47133920Sandre	{
48133920Sandre	  if (__in.tie())
49133920Sandre	    __in.tie()->flush();
50240099Smelifaro	  if (!__noskipws && (__in.flags() & ios_base::skipws))
51133920Sandre	    {	  
52196423Sjulian	      const __int_type __eof = traits_type::eof();
53133920Sandre	      __streambuf_type* __sb = __in.rdbuf();
54133920Sandre	      __int_type __c = __sb->sgetc();
55133920Sandre
56133920Sandre	      if (__in._M_check_facet(__in._M_fctype))
57133920Sandre		while (!traits_type::eq_int_type(__c, __eof)
58133920Sandre		       && __in._M_fctype->is(ctype_base::space, 
59223593Sglebius					     traits_type::to_char_type(__c)))
60223593Sglebius		  __c = __sb->snextc();
61223593Sglebius
62223593Sglebius#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
63240494Sglebius//195.  Should basic_istream::sentry's constructor ever set eofbit? 
64201124Sluigi	      if (traits_type::eq_int_type(__c, __eof))
65133920Sandre		__in.setstate(ios_base::eofbit);
66240494Sglebius#endif
67240494Sglebius	    }
68133920Sandre	}
69133920Sandre
70215701Sdim      if (__in.good())
71200601Sluigi	_M_ok = true;
72200601Sluigi      else
73158470Smlaier	{
74215701Sdim	  _M_ok = false;
75200601Sluigi	  __in.setstate(ios_base::failbit);
76158470Smlaier	}
77133920Sandre    }
78240099Smelifaro
79240099Smelifaro  template<typename _CharT, typename _Traits>
80240099Smelifaro    basic_istream<_CharT, _Traits>& 
81158470Smlaier    basic_istream<_CharT, _Traits>::
82158470Smlaier    operator>>(__istream_type& (*__pf)(__istream_type&))
83136714Sandre    {
84201527Sluigi      __pf(*this);
85240099Smelifaro      return *this;
86240099Smelifaro    }
87240099Smelifaro
88240099Smelifaro  template<typename _CharT, typename _Traits>
89133920Sandre    basic_istream<_CharT, _Traits>& 
90200601Sluigi    basic_istream<_CharT, _Traits>::
91204591Sluigi    operator>>(__ios_type& (*__pf)(__ios_type&))
92204591Sluigi    {
93204591Sluigi      __pf(*this);
94200601Sluigi      return *this;
95200601Sluigi    }
96200601Sluigi  
97200601Sluigi  template<typename _CharT, typename _Traits>
98200601Sluigi    basic_istream<_CharT, _Traits>& 
99200601Sluigi    basic_istream<_CharT, _Traits>::
100200601Sluigi    operator>>(ios_base& (*__pf)(ios_base&))
101200601Sluigi    {
102200601Sluigi      __pf(*this);
103200601Sluigi      return *this;
104204591Sluigi    }
105240099Smelifaro  
106240099Smelifaro  template<typename _CharT, typename _Traits>
107240099Smelifaro    basic_istream<_CharT, _Traits>& 
108240099Smelifaro    basic_istream<_CharT, _Traits>::
109240099Smelifaro    operator>>(bool& __n)
110204591Sluigi    {
111204591Sluigi      sentry __cerb(*this, false);
112200601Sluigi      if (__cerb) 
113200601Sluigi	{
114201122Sluigi	  try 
115201122Sluigi	    {
116201122Sluigi	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
117201122Sluigi	      if (_M_check_facet(_M_fnumget))
118201122Sluigi		_M_fnumget->get(*this, 0, *this, __err, __n);
119240099Smelifaro	      this->setstate(__err);
120240099Smelifaro	    }
121135920Smlaier	  catch(...)
122133920Sandre	    {
123133920Sandre	      // 27.6.1.2.1 Common requirements.
124201527Sluigi	      // Turn this on without causing an ios::failure to be thrown.
125201122Sluigi	      this->_M_setstate(ios_base::badbit);
126201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
127133920Sandre		__throw_exception_again;
128201122Sluigi	    }
129201122Sluigi	}
130133920Sandre      return *this;
131133920Sandre    }
132173399Soleg
133201527Sluigi  template<typename _CharT, typename _Traits>
134201527Sluigi    basic_istream<_CharT, _Traits>& 
135201527Sluigi    basic_istream<_CharT, _Traits>::
136201527Sluigi    operator>>(short& __n)
137201527Sluigi    {
138201527Sluigi      sentry __cerb(*this, false);
139201527Sluigi      if (__cerb) 
140201527Sluigi	{
141241359Sglebius	  try 
142223358Sae	    {
143133920Sandre	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
144133920Sandre	      long __l;
145133920Sandre	      if (_M_check_facet(_M_fnumget))
146201122Sluigi		_M_fnumget->get(*this, 0, *this, __err, __l);
147135920Smlaier#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
148133920Sandre	      // 118. basic_istream uses nonexistent num_get member functions.
149201527Sluigi	      if (!(__err & ios_base::failbit)
150201527Sluigi		  && (numeric_limits<short>::min() <= __l 
151191570Soleg		      && __l <= numeric_limits<short>::max()))
152140224Sglebius		__n = __l;
153140224Sglebius	      else
154133920Sandre                __err |= ios_base::failbit;
155201122Sluigi#endif
156201122Sluigi	      this->setstate(__err);
157140224Sglebius	    }
158140224Sglebius	  catch(...)
159201122Sluigi	    {
160225044Sbz	      // 27.6.1.2.1 Common requirements.
161206845Sluigi	      // Turn this on without causing an ios::failure to be thrown.
162242079Sae	      this->_M_setstate(ios_base::badbit);
163201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
164201122Sluigi		__throw_exception_again;
165201527Sluigi	    }
166201527Sluigi	}
167225044Sbz      return *this;
168201527Sluigi    }
169225044Sbz
170225044Sbz  template<typename _CharT, typename _Traits>
171225044Sbz    basic_istream<_CharT, _Traits>& 
172225044Sbz    basic_istream<_CharT, _Traits>::
173225044Sbz    operator>>(unsigned short& __n)
174225044Sbz    {
175225044Sbz      sentry __cerb(*this, false);
176225044Sbz      if (__cerb) 
177225044Sbz	{
178225044Sbz	  try 
179225044Sbz	    {
180225044Sbz	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
181201122Sluigi	      if (_M_check_facet(_M_fnumget))
182201122Sluigi		_M_fnumget->get(*this, 0, *this, __err, __n);
183201122Sluigi	      this->setstate(__err);
184201122Sluigi	    }
185201122Sluigi	  catch(...)
186201122Sluigi	    {
187201122Sluigi	      // 27.6.1.2.1 Common requirements.
188201122Sluigi	      // Turn this on without causing an ios::failure to be thrown.
189201122Sluigi	      this->_M_setstate(ios_base::badbit);
190225044Sbz	      if ((this->exceptions() & ios_base::badbit) != 0)
191225044Sbz		__throw_exception_again;
192201122Sluigi	    }
193201122Sluigi	}
194201122Sluigi      return *this;
195201122Sluigi    }
196201122Sluigi
197225044Sbz  template<typename _CharT, typename _Traits>
198225044Sbz    basic_istream<_CharT, _Traits>& 
199225044Sbz    basic_istream<_CharT, _Traits>::
200225044Sbz    operator>>(int& __n)
201225044Sbz    {
202242463Sae      sentry __cerb(*this, false);
203225044Sbz      if (__cerb) 
204225044Sbz	{
205225044Sbz	  try 
206225044Sbz	    {
207225044Sbz	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
208225044Sbz	      long __l;
209225044Sbz	      if (_M_check_facet(_M_fnumget))
210242463Sae		_M_fnumget->get(*this, 0, *this, __err, __l);
211225044Sbz#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
212225044Sbz	      // 118. basic_istream uses nonexistent num_get member functions.
213133920Sandre	      if (!(__err & ios_base::failbit)
214201527Sluigi		  && (numeric_limits<int>::min() <= __l 
215242079Sae		      && __l <= numeric_limits<int>::max()))
216201122Sluigi		__n = __l;
217133920Sandre	      else
218140224Sglebius                __err |= ios_base::failbit;
219201122Sluigi#endif
220201122Sluigi	      this->setstate(__err);
221140224Sglebius	    }
222140224Sglebius	  catch(...)
223201122Sluigi	    {
224193502Sluigi	      // 27.6.1.2.1 Common requirements.
225201122Sluigi	      // Turn this on without causing an ios::failure to be thrown.
226145246Sbrooks	      this->_M_setstate(ios_base::badbit);
227201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
228145246Sbrooks		__throw_exception_again;
229201122Sluigi	    }
230201122Sluigi	}
231201122Sluigi      return *this;
232201122Sluigi    }
233201122Sluigi
234201122Sluigi  template<typename _CharT, typename _Traits>
235201122Sluigi    basic_istream<_CharT, _Traits>& 
236201122Sluigi    basic_istream<_CharT, _Traits>::
237201122Sluigi    operator>>(unsigned int& __n)
238201122Sluigi    {
239173399Soleg      sentry __cerb(*this, false);
240173399Soleg      if (__cerb) 
241140224Sglebius	{
242140224Sglebius	  try 
243140224Sglebius	    {
244140224Sglebius	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
245201122Sluigi	      if (_M_check_facet(_M_fnumget))
246201122Sluigi		_M_fnumget->get(*this, 0, *this, __err, __n);
247201122Sluigi	      this->setstate(__err);
248201122Sluigi	    }
249201527Sluigi	  catch(...)
250201527Sluigi	    {
251201527Sluigi	      // 27.6.1.2.1 Common requirements.
252201527Sluigi	      // Turn this on without causing an ios::failure to be thrown.
253201527Sluigi	      this->_M_setstate(ios_base::badbit);
254201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
255140224Sglebius		__throw_exception_again;
256141351Sglebius	    }
257141351Sglebius	}
258201732Sluigi      return *this;
259201122Sluigi    }
260201122Sluigi
261201122Sluigi  template<typename _CharT, typename _Traits>
262201122Sluigi    basic_istream<_CharT, _Traits>& 
263201122Sluigi    basic_istream<_CharT, _Traits>::
264201122Sluigi    operator>>(long& __n)
265201122Sluigi    {
266201122Sluigi      sentry __cerb(*this, false);
267141351Sglebius      if (__cerb) 
268165648Spiso	{
269213254Sluigi	  try 
270213254Sluigi	    {
271213254Sluigi	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
272213254Sluigi	      if (_M_check_facet(_M_fnumget))
273213254Sluigi		_M_fnumget->get(*this, 0, *this, __err, __n);
274201122Sluigi	      this->setstate(__err);
275165648Spiso	    }
276190633Spiso	  catch(...)
277140224Sglebius	    {
278140224Sglebius	      // 27.6.1.2.1 Common requirements.
279140224Sglebius	      // Turn this on without causing an ios::failure to be thrown.
280140224Sglebius	      this->_M_setstate(ios_base::badbit);
281201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
282201122Sluigi		__throw_exception_again;
283201527Sluigi	    }
284201122Sluigi	}
285201122Sluigi      return *this;
286241245Sglebius    }
287201122Sluigi
288133920Sandre  template<typename _CharT, typename _Traits>
289133920Sandre    basic_istream<_CharT, _Traits>& 
290240099Smelifaro    basic_istream<_CharT, _Traits>::
291240099Smelifaro    operator>>(unsigned long& __n)
292240099Smelifaro    {
293240099Smelifaro      sentry __cerb(*this, false);
294240099Smelifaro      if (__cerb) 
295240099Smelifaro	{
296240099Smelifaro	  try 
297240099Smelifaro	    {
298240099Smelifaro	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
299240099Smelifaro	      if (_M_check_facet(_M_fnumget))
300240099Smelifaro		_M_fnumget->get(*this, 0, *this, __err, __n);
301240099Smelifaro	      this->setstate(__err);
302240099Smelifaro	    }
303240099Smelifaro	  catch(...)
304240099Smelifaro	    {
305240099Smelifaro	      // 27.6.1.2.1 Common requirements.
306240099Smelifaro	      // Turn this on without causing an ios::failure to be thrown.
307240099Smelifaro	      this->_M_setstate(ios_base::badbit);
308240099Smelifaro	      if ((this->exceptions() & ios_base::badbit) != 0)
309240099Smelifaro		__throw_exception_again;
310240099Smelifaro	    }
311240099Smelifaro	}
312240099Smelifaro      return *this;
313240099Smelifaro    }
314240099Smelifaro
315240099Smelifaro#ifdef _GLIBCPP_USE_LONG_LONG
316240099Smelifaro  template<typename _CharT, typename _Traits>
317240099Smelifaro    basic_istream<_CharT, _Traits>& 
318240099Smelifaro    basic_istream<_CharT, _Traits>::
319240099Smelifaro    operator>>(long long& __n)
320240099Smelifaro    {
321240099Smelifaro      sentry __cerb(*this, false);
322240099Smelifaro      if (__cerb) 
323240099Smelifaro	{
324240099Smelifaro	  try 
325240099Smelifaro	    {
326240099Smelifaro	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
327240099Smelifaro	      if (_M_check_facet(_M_fnumget))
328240099Smelifaro		_M_fnumget->get(*this, 0, *this, __err, __n);
329240099Smelifaro	      this->setstate(__err);
330240099Smelifaro	    }
331240099Smelifaro	  catch(...)
332240099Smelifaro	    {
333240099Smelifaro	      // 27.6.1.2.1 Common requirements.
334240099Smelifaro	      // Turn this on without causing an ios::failure to be thrown.
335240099Smelifaro	      this->_M_setstate(ios_base::badbit);
336240099Smelifaro	      if ((this->exceptions() & ios_base::badbit) != 0)
337240099Smelifaro	      __throw_exception_again;
338240099Smelifaro	    }
339240099Smelifaro	}
340240099Smelifaro      return *this;
341240099Smelifaro    }
342240099Smelifaro
343240099Smelifaro  template<typename _CharT, typename _Traits>
344240099Smelifaro    basic_istream<_CharT, _Traits>& 
345240099Smelifaro    basic_istream<_CharT, _Traits>::
346240099Smelifaro    operator>>(unsigned long long& __n)
347240099Smelifaro    {
348240099Smelifaro      sentry __cerb(*this, false);
349243882Sglebius      if (__cerb) 
350240099Smelifaro	{
351240099Smelifaro	  try 
352240099Smelifaro	    {
353240099Smelifaro	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
354240099Smelifaro	      if (_M_check_facet(_M_fnumget))
355240099Smelifaro		_M_fnumget->get(*this, 0, *this, __err, __n);
356240099Smelifaro	      this->setstate(__err);
357240099Smelifaro	    }
358240099Smelifaro	  catch(...)
359240099Smelifaro	    {
360240099Smelifaro	      // 27.6.1.2.1 Common requirements.
361240099Smelifaro	      // Turn this on without causing an ios::failure to be thrown.
362240099Smelifaro	      this->_M_setstate(ios_base::badbit);
363240099Smelifaro	      if ((this->exceptions() & ios_base::badbit) != 0)
364240099Smelifaro		__throw_exception_again;
365240099Smelifaro	    }
366240099Smelifaro	}
367240099Smelifaro      return *this;
368240099Smelifaro    }
369240099Smelifaro#endif
370240099Smelifaro
371240099Smelifaro  template<typename _CharT, typename _Traits>
372240099Smelifaro    basic_istream<_CharT, _Traits>& 
373240099Smelifaro    basic_istream<_CharT, _Traits>::
374240099Smelifaro    operator>>(float& __n)
375240099Smelifaro    {
376240099Smelifaro      sentry __cerb(*this, false);
377240099Smelifaro      if (__cerb) 
378240099Smelifaro	{
379240099Smelifaro	  try 
380240099Smelifaro	    {
381240099Smelifaro	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
382240099Smelifaro	      if (_M_check_facet(_M_fnumget))
383240099Smelifaro		_M_fnumget->get(*this, 0, *this, __err, __n);
384240099Smelifaro	      this->setstate(__err);
385240099Smelifaro	    }
386240099Smelifaro	  catch(...)
387240099Smelifaro	    {
388240099Smelifaro	      // 27.6.1.2.1 Common requirements.
389240099Smelifaro	      // Turn this on without causing an ios::failure to be thrown.
390240099Smelifaro	      this->_M_setstate(ios_base::badbit);
391240099Smelifaro	      if ((this->exceptions() & ios_base::badbit) != 0)
392240099Smelifaro		__throw_exception_again;
393240099Smelifaro	    }
394240099Smelifaro	}
395201527Sluigi      return *this;
396201527Sluigi    }
397201527Sluigi
398201527Sluigi  template<typename _CharT, typename _Traits>
399133920Sandre    basic_istream<_CharT, _Traits>& 
400133920Sandre    basic_istream<_CharT, _Traits>::
401135154Sandre    operator>>(double& __n)
402133920Sandre    {
403133920Sandre      sentry __cerb(*this, false);
404133920Sandre      if (__cerb) 
405201122Sluigi	{
406223593Sglebius	  try 
407201527Sluigi	    {
408133920Sandre	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
409133920Sandre	      if (_M_check_facet(_M_fnumget))
410201122Sluigi		_M_fnumget->get(*this, 0, *this, __err, __n);
411201122Sluigi	      this->setstate(__err);
412201122Sluigi	    }
413201122Sluigi	  catch(...)
414243882Sglebius	    {
415201122Sluigi	      // 27.6.1.2.1 Common requirements.
416201122Sluigi	      // Turn this on without causing an ios::failure to be thrown.
417201122Sluigi	      this->_M_setstate(ios_base::badbit);
418201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
419201527Sluigi		__throw_exception_again;
420201122Sluigi	    }
421133920Sandre	}
422133920Sandre      return *this;
423201122Sluigi    }
424201122Sluigi
425201122Sluigi  template<typename _CharT, typename _Traits>
426201122Sluigi    basic_istream<_CharT, _Traits>& 
427201122Sluigi    basic_istream<_CharT, _Traits>::
428201122Sluigi    operator>>(long double& __n)
429133920Sandre    {
430223593Sglebius      sentry __cerb(*this, false);
431223593Sglebius      if (__cerb) 
432223593Sglebius	{
433201122Sluigi	  try 
434201122Sluigi	    {
435133920Sandre	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
436201122Sluigi	      if (_M_check_facet(_M_fnumget))
437201122Sluigi		_M_fnumget->get(*this, 0, *this, __err, __n);
438201527Sluigi	      this->setstate(__err);
439201122Sluigi	    }
440133920Sandre	  catch(...)
441133920Sandre	    {
442133920Sandre	      // 27.6.1.2.1 Common requirements.
443133920Sandre	      // Turn this on without causing an ios::failure to be thrown.
444201122Sluigi	      this->_M_setstate(ios_base::badbit);
445201122Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
446201122Sluigi		__throw_exception_again;
447201122Sluigi	    }
448201122Sluigi	}
449201122Sluigi      return *this;
450201122Sluigi    }
451201122Sluigi
452223593Sglebius  template<typename _CharT, typename _Traits>
453223593Sglebius    basic_istream<_CharT, _Traits>& 
454223593Sglebius    basic_istream<_CharT, _Traits>::
455223593Sglebius    operator>>(void*& __n)
456223593Sglebius    {
457223593Sglebius      sentry __cerb(*this, false);
458223593Sglebius      if (__cerb) 
459223593Sglebius	{
460223593Sglebius	  try 
461223593Sglebius	    {
462223593Sglebius	      ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
463223593Sglebius	      if (_M_check_facet(_M_fnumget))
464223593Sglebius		_M_fnumget->get(*this, 0, *this, __err, __n);
465223593Sglebius	      this->setstate(__err);
466223593Sglebius	    }
467223593Sglebius	  catch(...)
468223593Sglebius	    {
469223593Sglebius	      // 27.6.1.2.1 Common requirements.
470133920Sandre	      // Turn this on without causing an ios::failure to be thrown.
471223593Sglebius	      this->_M_setstate(ios_base::badbit);
472201527Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
473201527Sluigi		__throw_exception_again;
474201527Sluigi	    }
475201527Sluigi	}
476201527Sluigi      return *this;
477201527Sluigi    }
478201527Sluigi
479201527Sluigi  template<typename _CharT, typename _Traits>
480201527Sluigi    basic_istream<_CharT, _Traits>& 
481133920Sandre    basic_istream<_CharT, _Traits>::
482133920Sandre    operator>>(__streambuf_type* __sbout)
483201122Sluigi    {
484201527Sluigi       sentry __cerb(*this, false);
485133920Sandre       if (__cerb)
486133920Sandre	 {
487201122Sluigi	   try
488201122Sluigi	     {
489201122Sluigi	       streamsize __xtrct = 0;
490200601Sluigi	       if (__sbout)
491201122Sluigi		 {
492133920Sandre		   __streambuf_type* __sbin = this->rdbuf();
493201122Sluigi		   __xtrct = __copy_streambufs(*this, __sbin, __sbout);
494240099Smelifaro		 }
495133920Sandre	       if (!__sbout || !__xtrct)
496201122Sluigi		 this->setstate(ios_base::failbit);
497201122Sluigi	     }
498133920Sandre	   catch(...)
499133920Sandre	     {
500240099Smelifaro	       // 27.6.2.5.1 Common requirements.
501240099Smelifaro	       // Turn this on without causing an ios::failure to be thrown.
502201527Sluigi	       this->_M_setstate(ios_base::badbit);
503240099Smelifaro	       if ((this->exceptions() & ios_base::badbit) != 0)
504133920Sandre		 __throw_exception_again;
505133920Sandre	     }
506133920Sandre	 }
507133920Sandre       return *this;
508196423Sjulian    }
509201122Sluigi
510133920Sandre  template<typename _CharT, typename _Traits>
511200601Sluigi    typename basic_istream<_CharT, _Traits>::int_type
512200601Sluigi    basic_istream<_CharT, _Traits>::
513201122Sluigi    get(void)
514201122Sluigi    {
515206845Sluigi      const int_type __eof = traits_type::eof();
516200601Sluigi      int_type __c = __eof;
517200601Sluigi      _M_gcount = 0;
518200601Sluigi      sentry __cerb(*this, true);
519200601Sluigi      if (__cerb) 
520201122Sluigi	{
521201122Sluigi	  try 
522206845Sluigi	    {
523200601Sluigi	      __c = this->rdbuf()->sbumpc();
524200601Sluigi	      // 27.6.1.1 paragraph 3
525200601Sluigi	      if (!traits_type::eq_int_type(__c, __eof))
526200601Sluigi		_M_gcount = 1;
527240099Smelifaro	      else
528240099Smelifaro		this->setstate(ios_base::eofbit | ios_base::failbit);
529240099Smelifaro	    }
530240099Smelifaro	  catch(...)
531240099Smelifaro	    {
532240099Smelifaro	      // 27.6.1.3 paragraph 1
533200601Sluigi	      // Turn this on without causing an ios::failure to be thrown.
534200601Sluigi	      this->_M_setstate(ios_base::badbit);
535200601Sluigi	      if ((this->exceptions() & ios_base::badbit) != 0)
536200601Sluigi		__throw_exception_again;
537158470Smlaier	    }
538158470Smlaier	}
539240099Smelifaro      return __c;
540240099Smelifaro    }
541158470Smlaier
542201122Sluigi  template<typename _CharT, typename _Traits>
543158470Smlaier    basic_istream<_CharT, _Traits>&
544197952Sjulian    basic_istream<_CharT, _Traits>::
545240099Smelifaro    get(char_type& __c)
546201122Sluigi    {
547197952Sjulian      _M_gcount = 0;
548197952Sjulian      sentry __cerb(*this, true);
549197952Sjulian      if (__cerb) 
550240099Smelifaro	{
551201122Sluigi 	  try 
552197952Sjulian	    {
553196423Sjulian	      const int_type __eof = traits_type::eof();
554240099Smelifaro	      int_type __bufval = this->rdbuf()->sbumpc();
555240099Smelifaro	      // 27.6.1.1 paragraph 3
556240099Smelifaro	      if (!traits_type::eq_int_type(__bufval, __eof))
557240099Smelifaro		{
558197952Sjulian		  _M_gcount = 1;
559197952Sjulian		  __c = traits_type::to_char_type(__bufval);
560197952Sjulian		}
561240099Smelifaro	      else
562197952Sjulian		this->setstate(ios_base::eofbit | ios_base::failbit);
563240099Smelifaro	    }
564240099Smelifaro	  catch(...)
565197952Sjulian	    {
566158470Smlaier	      // 27.6.1.3 paragraph 1
567158470Smlaier	      // Turn this on without causing an ios::failure to be thrown.
568158470Smlaier	      this->_M_setstate(ios_base::badbit);
569240099Smelifaro	      if ((this->exceptions() & ios_base::badbit) != 0)
570240099Smelifaro		__throw_exception_again;
571158470Smlaier	    }
572240099Smelifaro	}
573158470Smlaier      return *this;
574158470Smlaier    }
575240099Smelifaro
576201122Sluigi  template<typename _CharT, typename _Traits>
577201122Sluigi    basic_istream<_CharT, _Traits>&
578240099Smelifaro    basic_istream<_CharT, _Traits>::
579158470Smlaier    get(char_type* __s, streamsize __n, char_type __delim)
580158470Smlaier    {
581158470Smlaier      _M_gcount = 0;
582200601Sluigi      sentry __cerb(*this, true);
583      if (__cerb) 
584	{
585	  try 
586	    {
587	      const int_type __idelim = traits_type::to_int_type(__delim);
588	      const int_type __eof = traits_type::eof();
589	      __streambuf_type* __sb = this->rdbuf();
590	      int_type __c = __sb->sgetc();	
591	      
592	      while (_M_gcount + 1 < __n 
593		     && !traits_type::eq_int_type(__c, __eof)
594		     && !traits_type::eq_int_type(__c, __idelim))
595		{
596		  *__s++ = traits_type::to_char_type(__c);
597		  __c = __sb->snextc();
598		  ++_M_gcount;
599		}
600	      if (traits_type::eq_int_type(__c, __eof))
601		this->setstate(ios_base::eofbit);
602	    }
603	  catch(...)
604	    {
605	      // 27.6.1.3 paragraph 1
606	      // Turn this on without causing an ios::failure to be thrown.
607	      this->_M_setstate(ios_base::badbit);
608	      if ((this->exceptions() & ios_base::badbit) != 0)
609		__throw_exception_again;
610	    }
611	}
612      *__s = char_type();
613      if (!_M_gcount)
614	this->setstate(ios_base::failbit);
615      return *this;
616    }
617
618  template<typename _CharT, typename _Traits>
619    basic_istream<_CharT, _Traits>&
620    basic_istream<_CharT, _Traits>::
621    get(__streambuf_type& __sb, char_type __delim)
622    {
623      _M_gcount = 0;
624      sentry __cerb(*this, true);
625      if (__cerb) 
626	{
627	  try 
628	    {
629	      const int_type __idelim = traits_type::to_int_type(__delim);
630	      const int_type __eof = traits_type::eof();	      
631	      __streambuf_type* __this_sb = this->rdbuf();
632	      int_type __c = __this_sb->sgetc();
633	      char_type __c2 = traits_type::to_char_type(__c);
634	      
635	      while (!traits_type::eq_int_type(__c, __eof) 
636		     && !traits_type::eq_int_type(__c, __idelim) 
637		     && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
638		{
639		  ++_M_gcount;
640		  __c = __this_sb->snextc();
641		  __c2 = traits_type::to_char_type(__c);
642		}
643	      if (traits_type::eq_int_type(__c, __eof))
644		this->setstate(ios_base::eofbit);
645	    }
646	  catch(...)
647	    {
648	      // 27.6.1.3 paragraph 1
649	      // Turn this on without causing an ios::failure to be thrown.
650	      this->_M_setstate(ios_base::badbit);
651	      if ((this->exceptions() & ios_base::badbit) != 0)
652		__throw_exception_again;
653	    }
654	}
655      if (!_M_gcount)
656	this->setstate(ios_base::failbit);
657      return *this;
658    }
659
660  template<typename _CharT, typename _Traits>
661    basic_istream<_CharT, _Traits>&
662    basic_istream<_CharT, _Traits>::
663    getline(char_type* __s, streamsize __n, char_type __delim)
664    {
665      _M_gcount = 0;
666      sentry __cerb(*this, true);
667      if (__cerb) 
668	{
669          try 
670	    {
671	      const int_type __idelim = traits_type::to_int_type(__delim);
672	      const int_type __eof = traits_type::eof();
673	      __streambuf_type* __sb = this->rdbuf();
674	      int_type __c = __sb->sgetc();
675	    
676	      while (_M_gcount + 1 < __n 
677		     && !traits_type::eq_int_type(__c, __eof)
678		     && !traits_type::eq_int_type(__c, __idelim))
679		{
680		  *__s++ = traits_type::to_char_type(__c);
681		  __c = __sb->snextc();
682		  ++_M_gcount;
683		}
684	      if (traits_type::eq_int_type(__c, __eof))
685		this->setstate(ios_base::eofbit);
686	      else
687		{
688		  if (traits_type::eq_int_type(__c, __idelim))
689		    {
690		      __sb->sbumpc();
691		      ++_M_gcount;
692		    }
693		  else
694		    this->setstate(ios_base::failbit);
695		}
696	    }
697	  catch(...)
698	    {
699	      // 27.6.1.3 paragraph 1
700	      // Turn this on without causing an ios::failure to be thrown.
701	      this->_M_setstate(ios_base::badbit);
702	      if ((this->exceptions() & ios_base::badbit) != 0)
703		__throw_exception_again;
704	    }
705	}
706      *__s = char_type();
707      if (!_M_gcount)
708	this->setstate(ios_base::failbit);
709      return *this;
710    }
711  
712  template<typename _CharT, typename _Traits>
713    basic_istream<_CharT, _Traits>&
714    basic_istream<_CharT, _Traits>::
715    ignore(streamsize __n, int_type __delim)
716    {
717      _M_gcount = 0;
718      sentry __cerb(*this, true);
719      if (__cerb && __n > 0) 
720	{
721	  try 
722	    {
723	      const int_type __eof = traits_type::eof();
724	      __streambuf_type* __sb = this->rdbuf();
725	      int_type __c;
726	      
727	      __n = min(__n, numeric_limits<streamsize>::max());
728	      while (_M_gcount < __n  
729		     && !traits_type::eq_int_type(__c = __sb->sbumpc(), __eof))
730		{
731		  ++_M_gcount;
732		  if (traits_type::eq_int_type(__c, __delim))
733		    break;
734		}
735	      if (traits_type::eq_int_type(__c, __eof))
736		this->setstate(ios_base::eofbit);
737	    }
738	  catch(...)
739	    {
740	      // 27.6.1.3 paragraph 1
741	      // Turn this on without causing an ios::failure to be thrown.
742	      this->_M_setstate(ios_base::badbit);
743	      if ((this->exceptions() & ios_base::badbit) != 0)
744		__throw_exception_again;
745	    }
746	}
747      return *this;
748    }
749  
750  template<typename _CharT, typename _Traits>
751    typename basic_istream<_CharT, _Traits>::int_type
752    basic_istream<_CharT, _Traits>::
753    peek(void)
754    {
755      int_type __c = traits_type::eof();
756      _M_gcount = 0;
757      sentry __cerb(*this, true);
758      if (__cerb)
759	{
760	  try 
761	    { __c = this->rdbuf()->sgetc(); }
762	  catch(...)
763	    {
764	      // 27.6.1.3 paragraph 1
765	      // Turn this on without causing an ios::failure to be thrown.
766	      this->_M_setstate(ios_base::badbit);
767	      if ((this->exceptions() & ios_base::badbit) != 0)
768		__throw_exception_again;
769	    }
770	} 
771      return __c;
772    }
773
774  template<typename _CharT, typename _Traits>
775    basic_istream<_CharT, _Traits>&
776    basic_istream<_CharT, _Traits>::
777    read(char_type* __s, streamsize __n)
778    {
779      _M_gcount = 0;
780      sentry __cerb(*this, true);
781      if (__cerb) 
782	{
783	  try 
784	    {
785	      _M_gcount = this->rdbuf()->sgetn(__s, __n);
786	      if (_M_gcount != __n)
787		this->setstate(ios_base::eofbit | ios_base::failbit);
788	    }	    
789	  catch(...)
790	    {
791	      // 27.6.1.3 paragraph 1
792	      // Turn this on without causing an ios::failure to be thrown.
793	      this->_M_setstate(ios_base::badbit);
794	      if ((this->exceptions() & ios_base::badbit) != 0)
795		__throw_exception_again;
796	    }
797	}
798      else
799	this->setstate(ios_base::failbit);
800      return *this;
801    }
802  
803  template<typename _CharT, typename _Traits>
804    streamsize 
805    basic_istream<_CharT, _Traits>::
806    readsome(char_type* __s, streamsize __n)
807    {
808      _M_gcount = 0;
809      sentry __cerb(*this, true);
810      if (__cerb) 
811	{
812	  try 
813	    {
814	      // Cannot compare int_type with streamsize generically.
815	      streamsize __num = this->rdbuf()->in_avail();
816	      if (__num >= 0)
817		{
818		  __num = min(__num, __n);
819		  if (__num)
820		    _M_gcount = this->rdbuf()->sgetn(__s, __num);
821		}
822	      else
823		this->setstate(ios_base::eofbit);		    
824	    }
825	  catch(...)
826	    {
827	      // 27.6.1.3 paragraph 1
828	      // Turn this on without causing an ios::failure to be thrown.
829	      this->_M_setstate(ios_base::badbit);
830	      if ((this->exceptions() & ios_base::badbit) != 0)
831		__throw_exception_again;
832	    }
833	}
834      else
835	this->setstate(ios_base::failbit);
836      return _M_gcount;
837    }
838      
839  template<typename _CharT, typename _Traits>
840    basic_istream<_CharT, _Traits>&
841    basic_istream<_CharT, _Traits>::
842    putback(char_type __c)
843    {
844#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
845// 60. What is a formatted input function?
846      _M_gcount = 0;
847#endif
848      sentry __cerb(*this, true);
849      if (__cerb) 
850	{
851	  try 
852	    {
853	      const int_type __eof = traits_type::eof();
854	      __streambuf_type* __sb = this->rdbuf();
855	      if (!__sb 
856		  || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
857		this->setstate(ios_base::badbit);		    
858	    }
859	  catch(...)
860	    {
861	      // 27.6.1.3 paragraph 1
862	      // Turn this on without causing an ios::failure to be thrown.
863	      this->_M_setstate(ios_base::badbit);
864	      if ((this->exceptions() & ios_base::badbit) != 0)
865		__throw_exception_again;
866	    }
867	}
868      else
869	this->setstate(ios_base::failbit);
870      return *this;
871    }
872  
873  template<typename _CharT, typename _Traits>
874    basic_istream<_CharT, _Traits>&
875    basic_istream<_CharT, _Traits>::
876    unget(void)
877    {
878#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
879// 60. What is a formatted input function?
880      _M_gcount = 0;
881#endif
882      sentry __cerb(*this, true);
883      if (__cerb) 
884	{
885	  try 
886	    {
887	      const int_type __eof = traits_type::eof();
888	      __streambuf_type* __sb = this->rdbuf();
889	      if (!__sb 
890		  || traits_type::eq_int_type(__sb->sungetc(), __eof))
891		this->setstate(ios_base::badbit);		    
892	    }
893	  catch(...)
894	    {
895	      // 27.6.1.3 paragraph 1
896	      // Turn this on without causing an ios::failure to be thrown.
897	      this->_M_setstate(ios_base::badbit);
898	      if ((this->exceptions() & ios_base::badbit) != 0)
899		__throw_exception_again;
900	    }
901	}
902      else
903	this->setstate(ios_base::failbit);
904      return *this;
905    }
906  
907  template<typename _CharT, typename _Traits>
908    int
909    basic_istream<_CharT, _Traits>::
910    sync(void)
911    {
912      // DR60.  Do not change _M_gcount.
913      int __ret = -1;
914      sentry __cerb(*this, true);
915      if (__cerb) 
916	{
917	  try 
918	    {
919	      __streambuf_type* __sb = this->rdbuf();
920	      if (__sb)
921		{
922		  if (__sb->pubsync() == -1)
923		    this->setstate(ios_base::badbit);		    
924		  else 
925		    __ret = 0;
926		}
927	    }
928	  catch(...)
929	    {
930	      // 27.6.1.3 paragraph 1
931	      // Turn this on without causing an ios::failure to be thrown.
932	      this->_M_setstate(ios_base::badbit);
933	      if ((this->exceptions() & ios_base::badbit) != 0)
934		__throw_exception_again;
935	    }
936	}
937      return __ret;
938    }
939  
940  template<typename _CharT, typename _Traits>
941    typename basic_istream<_CharT, _Traits>::pos_type
942    basic_istream<_CharT, _Traits>::
943    tellg(void)
944    {
945      // DR60.  Do not change _M_gcount.
946      pos_type __ret = pos_type(-1);
947      if (!this->fail())
948	__ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
949      return __ret;
950    }
951
952
953  template<typename _CharT, typename _Traits>
954    basic_istream<_CharT, _Traits>&
955    basic_istream<_CharT, _Traits>::
956    seekg(pos_type __pos)
957    {
958      // DR60.  Do not change _M_gcount.
959      if (!this->fail())
960	{
961#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
962// 136.  seekp, seekg setting wrong streams?
963	  pos_type __err = this->rdbuf()->pubseekpos(__pos, ios_base::in);
964
965// 129. Need error indication from seekp() and seekg()
966	  if (__err == pos_type(off_type(-1)))
967	    this->setstate(ios_base::failbit);
968#endif
969	}
970      return *this;
971    }
972
973  template<typename _CharT, typename _Traits>
974    basic_istream<_CharT, _Traits>&
975    basic_istream<_CharT, _Traits>::
976    seekg(off_type __off, ios_base::seekdir __dir)
977    {
978      // DR60.  Do not change _M_gcount.
979      if (!this->fail())
980	{
981#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
982// 136.  seekp, seekg setting wrong streams?
983	  pos_type __err = this->rdbuf()->pubseekoff(__off, __dir, 
984						     ios_base::in);
985
986// 129. Need error indication from seekp() and seekg()
987	  if (__err == pos_type(off_type(-1)))
988	    this->setstate(ios_base::failbit);
989#endif
990	}
991      return *this;
992    }
993
994  // 27.6.1.2.3 Character extraction templates
995  template<typename _CharT, typename _Traits>
996    basic_istream<_CharT, _Traits>&
997    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
998    {
999      typedef basic_istream<_CharT, _Traits> 		__istream_type;
1000      typename __istream_type::sentry __cerb(__in, false);
1001      if (__cerb)
1002	{
1003	  try 
1004	    { __in.get(__c); }
1005	  catch(...)
1006	    {
1007	      // 27.6.1.2.1 Common requirements.
1008	      // Turn this on without causing an ios::failure to be thrown.
1009	      __in._M_setstate(ios_base::badbit);
1010	      if ((__in.exceptions() & ios_base::badbit) != 0)
1011		__throw_exception_again;
1012	    }
1013	}
1014      else
1015	__in.setstate(ios_base::failbit);
1016      return __in;
1017    }
1018
1019  template<typename _CharT, typename _Traits>
1020    basic_istream<_CharT, _Traits>&
1021    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
1022    {
1023      typedef basic_istream<_CharT, _Traits> 		__istream_type;
1024      typedef typename __istream_type::__streambuf_type __streambuf_type;
1025      typedef typename _Traits::int_type 		int_type;
1026      typedef _CharT                     		char_type;
1027      typedef ctype<_CharT>     			__ctype_type;
1028      streamsize __extracted = 0;
1029
1030      typename __istream_type::sentry __cerb(__in, false);
1031      if (__cerb)
1032	{
1033	  try 
1034	    {
1035	      // Figure out how many characters to extract.
1036	      streamsize __num = __in.width();
1037	      if (__num <= 0)
1038		__num = numeric_limits<streamsize>::max();
1039	      
1040	      const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc());
1041	      const int_type __eof = _Traits::eof();
1042	      __streambuf_type* __sb = __in.rdbuf();
1043	      int_type __c = __sb->sgetc();
1044	      
1045	      while (__extracted < __num - 1 
1046		     && !_Traits::eq_int_type(__c, __eof)
1047		     && !__ctype.is(ctype_base::space, _Traits::to_char_type(__c)))
1048		{
1049		  *__s++ = _Traits::to_char_type(__c);
1050		  ++__extracted;
1051		  __c = __sb->snextc();
1052		}
1053	      if (_Traits::eq_int_type(__c, __eof))
1054		__in.setstate(ios_base::eofbit);
1055
1056#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
1057//68.  Extractors for char* should store null at end
1058	      *__s = char_type();
1059#endif
1060	      __in.width(0);
1061	    }
1062	  catch(...)
1063	    {
1064	      // 27.6.1.2.1 Common requirements.
1065	      // Turn this on without causing an ios::failure to be thrown.
1066	      __in._M_setstate(ios_base::badbit);
1067	      if ((__in.exceptions() & ios_base::badbit) != 0)
1068		__throw_exception_again;
1069	    }
1070	}
1071      if (!__extracted)
1072	__in.setstate(ios_base::failbit);
1073      return __in;
1074    }
1075
1076  // 27.6.1.4 Standard basic_istream manipulators
1077  template<typename _CharT, typename _Traits>
1078    basic_istream<_CharT,_Traits>& 
1079    ws(basic_istream<_CharT,_Traits>& __in)
1080    {
1081      typedef basic_istream<_CharT, _Traits> 		__istream_type;
1082      typedef typename __istream_type::__streambuf_type __streambuf_type;
1083      typedef typename __istream_type::__ctype_type 	__ctype_type;
1084      typedef typename __istream_type::int_type 	__int_type;
1085
1086      const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc());
1087      const __int_type __eof = _Traits::eof();	      
1088      __streambuf_type* __sb = __in.rdbuf();
1089      __int_type __c = __sb->sgetc();
1090
1091      while (!_Traits::eq_int_type(__c, __eof) 
1092	     && __ctype.is(ctype_base::space, _Traits::to_char_type(__c)))
1093	__c = __sb->snextc();
1094
1095       if (_Traits::eq_int_type(__c, __eof))
1096	__in.setstate(ios_base::eofbit);
1097
1098      return __in;
1099    }
1100
1101  // 21.3.7.9 basic_string::getline and operators
1102  template<typename _CharT, typename _Traits, typename _Alloc>
1103    basic_istream<_CharT, _Traits>&
1104    operator>>(basic_istream<_CharT, _Traits>& __in,
1105	       basic_string<_CharT, _Traits, _Alloc>& __str)
1106    {
1107      typedef basic_istream<_CharT, _Traits> 		__istream_type;
1108      typedef typename __istream_type::int_type 	__int_type;
1109      typedef typename __istream_type::__streambuf_type __streambuf_type;
1110      typedef typename __istream_type::__ctype_type 	__ctype_type;
1111      typedef basic_string<_CharT, _Traits, _Alloc> 	__string_type;
1112      typedef typename __string_type::size_type		__size_type;
1113      __size_type __extracted = 0;
1114
1115      typename __istream_type::sentry __cerb(__in, false);
1116      if (__cerb) 
1117	{
1118	  __str.erase();
1119	  streamsize __w = __in.width();
1120	  __size_type __n;
1121	  __n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size();
1122
1123	  const __ctype_type& __ctype = use_facet<__ctype_type>(__in.getloc());
1124	  const __int_type __eof = _Traits::eof();
1125	  __streambuf_type* __sb = __in.rdbuf();
1126	  __int_type __c = __sb->sgetc();
1127	  
1128	  while (__extracted < __n 
1129		 && !_Traits::eq_int_type(__c, __eof)
1130		 && !__ctype.is(ctype_base::space, _Traits::to_char_type(__c)))
1131	    {
1132	      __str += _Traits::to_char_type(__c);
1133	      ++__extracted;
1134	      __c = __sb->snextc();
1135	    }
1136	  if (_Traits::eq_int_type(__c, __eof))
1137	    __in.setstate(ios_base::eofbit);
1138	  __in.width(0);
1139	}
1140#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
1141//211.  operator>>(istream&, string&) doesn't set failbit
1142      if (!__extracted)
1143	__in.setstate (ios_base::failbit);
1144#endif
1145      return __in;
1146    }
1147
1148  template<typename _CharT, typename _Traits, typename _Alloc>
1149    basic_istream<_CharT, _Traits>&
1150    getline(basic_istream<_CharT, _Traits>& __in,
1151	    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
1152    {
1153      typedef basic_istream<_CharT, _Traits> 		__istream_type;
1154      typedef typename __istream_type::int_type 	__int_type;
1155      typedef typename __istream_type::__streambuf_type __streambuf_type;
1156      typedef typename __istream_type::__ctype_type 	__ctype_type;
1157      typedef basic_string<_CharT, _Traits, _Alloc> 	__string_type;
1158      typedef typename __string_type::size_type		__size_type;
1159
1160      __size_type __extracted = 0;
1161      bool __testdelim = false;
1162      typename __istream_type::sentry __cerb(__in, true);
1163      if (__cerb) 
1164	{
1165	  __str.erase();
1166	  __size_type __n = __str.max_size();
1167
1168	  __int_type __idelim = _Traits::to_int_type(__delim);
1169	  __streambuf_type* __sb = __in.rdbuf();
1170	  __int_type __c = __sb->sbumpc();
1171	  const __int_type __eof = _Traits::eof();
1172	  __testdelim = _Traits::eq_int_type(__c, __idelim);
1173
1174	  while (__extracted <= __n 
1175		 && !_Traits::eq_int_type(__c, __eof)
1176		 && !__testdelim)
1177	    {
1178	      __str += _Traits::to_char_type(__c);
1179	      ++__extracted;
1180	      __c = __sb->sbumpc();
1181	      __testdelim = _Traits::eq_int_type(__c, __idelim);
1182	    }
1183	  if (_Traits::eq_int_type(__c, __eof))
1184	    __in.setstate(ios_base::eofbit);
1185	}
1186      if (!__extracted && !__testdelim)
1187	__in.setstate(ios_base::failbit);
1188      return __in;
1189    }
1190
1191  template<class _CharT, class _Traits, class _Alloc>
1192    inline basic_istream<_CharT,_Traits>&
1193    getline(basic_istream<_CharT, _Traits>& __in, 
1194	    basic_string<_CharT,_Traits,_Alloc>& __str)
1195    { return getline(__in, __str, __in.widen('\n')); }
1196
1197  // Inhibit implicit instantiations for required instantiations,
1198  // which are defined via explicit instantiations elsewhere.  
1199  // NB:  This syntax is a GNU extension.
1200#if _GLIBCPP_EXTERN_TEMPLATE
1201  extern template class basic_istream<char>;
1202  extern template istream& ws(istream&);
1203  extern template istream& operator>>(istream&, char&);
1204  extern template istream& operator>>(istream&, char*);
1205  extern template istream& operator>>(istream&, unsigned char&);
1206  extern template istream& operator>>(istream&, signed char&);
1207  extern template istream& operator>>(istream&, unsigned char*);
1208  extern template istream& operator>>(istream&, signed char*);
1209
1210#ifdef _GLIBCPP_USE_WCHAR_T
1211  extern template class basic_istream<wchar_t>;
1212  extern template wistream& ws(wistream&);
1213  extern template wistream& operator>>(wistream&, wchar_t&);
1214  extern template wistream& operator>>(wistream&, wchar_t*);
1215#endif
1216#endif
1217} // namespace std
1218