19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_ISTREAM_C
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_ISTREAM_C
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ISTREAM
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_istream.h>
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_LIMITS
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_limits.h>
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NUM_GET_H
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_num_get.h>
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// no wchar_t is supported for this mode
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __BIS_int_type__ int
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __BIS_pos_type__ streampos
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __BIS_off_type__ streamoff
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __BIS_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::int_type
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __BIS_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::pos_type
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __BIS_off_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::off_type
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//----------------------------------------------------------------------
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Function object structs used by some member functions.
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Is_not_wspace {
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type argument_type;
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef bool                        result_type;
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ctype<argument_type>* _M_ctype;
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Is_not_wspace(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator()(argument_type __c) const
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return !_M_ctype->is(ctype_base::space, __c); }
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Is_wspace_null {
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type argument_type;
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef bool                        result_type;
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ctype<argument_type>* _M_ctype;
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Is_wspace_null(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool operator()(argument_type __c) const {
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _Traits::eq(__c, argument_type()) ||
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           _M_ctype->is(ctype_base::space, __c);
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Scan_for_wspace {
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type  char_type;
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   first_argument_type;
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   second_argument_type;
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   result_type;
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ctype<char_type>* _M_ctype;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Scan_for_wspace(const ctype<char_type>* __ctype) : _M_ctype(__ctype) {}
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const char_type*
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator()(const char_type* __first, const char_type* __last) const {
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_ctype->scan_is(ctype_base::space, __first, __last);
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Scan_wspace_null {
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type  char_type;
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   first_argument_type;
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   second_argument_type;
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   result_type;
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ctype<char_type>* _M_ctype;
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Scan_wspace_null(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const char_type*
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator()(const char_type* __first, const char_type* __last) const {
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __last = find_if(__first, __last,
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _Eq_char_bound<_Traits>(char_type()));
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_ctype->scan_is(ctype_base::space, __first, __last);
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Scan_for_not_wspace {
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type  char_type;
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   first_argument_type;
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   second_argument_type;
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                   result_type;
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ctype<char_type>* _M_ctype;
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Scan_for_not_wspace(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const char_type*
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator()(const char_type* __first, const char_type* __last) const {
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_ctype->scan_not(ctype_base::space, __first, __last);
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Scan_for_char_val {
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type char_type;
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                  first_argument_type;
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                  second_argument_type;
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                  result_type;
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type _M_val;
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Scan_for_char_val(char_type __val) : _M_val(__val) {}
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const char_type*
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator()(const char_type* __first, const char_type* __last) const {
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return find_if(__first, __last, _Eq_char_bound<_Traits>(_M_val));
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Scan_for_int_val {
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::char_type char_type;
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::int_type  int_type;
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                  first_argument_type;
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                  second_argument_type;
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef char_type*                  result_type;
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type _M_val;
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Scan_for_int_val(int_type __val) : _M_val(__val) {}
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const char_type*
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  operator()(const char_type* __first, const char_type* __last) const {
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return find_if(__first, __last,
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Eq_int_bound<_Traits>(_M_val));
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Helper function: try to push back a character to a streambuf,
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// return true if the pushback succeeded.  Does not throw.
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _STLP_CALL
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__pushback(basic_streambuf<_CharT, _Traits>* __buf, _CharT __c) {
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool ret;
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const typename _Traits::int_type __eof = _Traits::eof();
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ret = !_Traits::eq_int_type(__buf->sputbackc(__c), __eof);
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ret = false;
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return ret;
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//----------------------------------------------------------------------
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Definitions of basic_istream<>'s noninline member functions.
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Helper function for formatted input of numbers.
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Number>
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockios_base::iostate _STLP_CALL
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val) {
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __err = 0;
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Sentry __sentry( __that );     // Skip whitespace.
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > _Num_get;
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // Do not remove additional parenthesis around use_facet instanciation, some compilers (VC6)
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // require it when building the library.
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      (use_facet<_Num_get>(__that.getloc())).get(istreambuf_iterator<_CharT, _Traits>(__that.rdbuf()),
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                               0, __that, __err, __val);
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that._M_handle_exception(ios_base::badbit);
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__err) __that.setstate(__err);
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __err;
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (short& __val) {
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  long __lval;
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __lval);
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ( this->fail() ) {
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  short __tmp = __STATIC_CAST(short, __lval);
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  unsigned short __uval = __STATIC_CAST(unsigned short, __lval);
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // check if we lose digits
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //    if ((__val != __lval) && ((unsigned short)__val != __lval))
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ((__tmp != __lval) && ((long)__uval != __lval))
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __val = __tmp;
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (int& __val) {
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  long __lval;
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __lval);
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ( this->fail() ) {
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int __tmp = __lval;
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  unsigned int __uval = __lval;
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // check if we lose digits
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //    if ((__val != __lval) && ((unsigned int)__val != __lval))
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ((__tmp != __lval) && ((long)__uval != __lval))
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __val = __tmp;
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned short& __val) {
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned int& __val) {
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (long& __val) {
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned long& __val) {
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_LONG_LONG)
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (_STLP_LONG_LONG& __val) {
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned _STLP_LONG_LONG& __val) {
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (float& __val) {
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (double& __val) {
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_LONG_DOUBLE)
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (long double& __val) {
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_BOOL)
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (bool& __val) {
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (void*& __val) {
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Unformatted input
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__BIS_int_type__
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::peek() {
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename _Traits::int_type __tmp = _Traits::eof();
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sgetc();
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_S_eof(__tmp))
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit);
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __tmp;
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__BIS_int_type__
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::get() {
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename _Traits::int_type __tmp = _Traits::eof();
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sbumpc();
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__tmp))
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = 1;
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (_M_gcount == 0)
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::eofbit | ios_base::failbit);
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __tmp;
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::get(_CharT& __c) {
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename _Traits::int_type __tmp = _Traits::eof();
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sbumpc();
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__tmp)) {
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = 1;
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = _Traits::to_char_type(__tmp);
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::eofbit | ios_base::failbit);
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Read characters and discard them.  The standard specifies a single
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// function with two arguments, each with a default.  We instead use
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// three overloded functions, because it's possible to implement the
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// first two more efficiently than the fully general third version.
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore() {
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    int_type __c;
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = this->rdbuf()->sbumpc();
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return *this;
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__c))
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = 1;
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit);
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Putback
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::putback(_CharT __c) {
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename _Traits::int_type __tmp = _Traits::eof();
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//    if (!__buf || this->_S_eof(__buf->sputbackc(__c)))
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf) {
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __tmp = __buf->sputbackc(__c);
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_CATCH_ALL {
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_handle_exception(ios_base::badbit);
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_S_eof(__tmp))
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::badbit);
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //     if (!__buf || _Traits::eq_int_type(__buf->sungetc(), _Traits::eof()))
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf) {
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (this->_S_eof(__buf->sungetc()))
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->setstate(ios_base::badbit);
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_CATCH_ALL {
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_handle_exception(ios_base::badbit);
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } else
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::badbit);
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Positioning and buffer control.
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockint basic_istream<_CharT, _Traits>::sync() {
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__buf) {
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf->pubsync() == -1) {
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::badbit);
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return -1;
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return 0;
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return -1;
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__BIS_pos_type__
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::tellg() {
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__buf && !this->fail()) ? __buf->pubseekoff(0, ios_base::cur, ios_base::in)
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : pos_type(-1);
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!this->fail() && __buf) {
509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (__buf->pubseekpos(__pos, ios_base::in) == pos_type(-1)) {
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::failbit);
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) {
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!this->fail() && __buf)
523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __buf->pubseekoff(__off, __dir, ios_base::in);
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Formatted input of characters and character arrays.
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT& __c) {
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  typename _Traits::int_type __tmp = _Traits::eof();
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this); // Skip whitespace.
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename _Traits::int_type __tmp;// = _Traits::eof();
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sbumpc();
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return;
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__tmp))
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = _Traits::to_char_type(__tmp);
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit | ios_base::failbit);
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//---------------------------------------------------------------------------
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// istream's helper functions.
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A generic function for unbuffered input.  We stop when we reach EOF,
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// or when we have extracted _Num characters, or when the function object
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __is_delim return true.  In the last case, it extracts the character
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// for which __is_delim is true, if and only if __extract_delim is true.
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// It appends a null character to the end of the string; this means that
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// it may store up to _Num + 1 characters.
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __is_getline governs two corner cases: reading _Num characters without
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// encountering delim or eof (in which case failbit is set if __is_getline
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// is true); and reading _Num characters where the _Num+1'st character is
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// eof (in which case eofbit is set if __is_getline is true).
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// It is assumed that __is_delim never throws.
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Return value is the number of characters extracted, including the
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// delimiter if it is extracted.  Note that the number of characaters
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// extracted isn't necessarily the same as the number stored.
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim>
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__read_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  streamsize _Num, _CharT* __s,
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _Is_Delim __is_delim,
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  bool __extract_delim, bool __append_null,
583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                  bool __is_getline)
584e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The operations that can potentially throw are sbumpc, snextc, and sgetc.
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (;;) {
592e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (__n == _Num) {
593e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (__is_getline) // didn't find delimiter as one of the _Num chars
594e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          __status |= ios_base::failbit;
595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        break;
596e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int_type __c = __buf->sbumpc(); // sschwarz
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__n < _Num || __is_getline)
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::eofbit;
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
603e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else if (__is_delim(_Traits::to_char_type(__c))) {
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim) { // Extract and discard current character.
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          ++__n;
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        } else if ( !__pushback(__buf, _Traits::to_char_type(__c)) ) { // leave delimiter
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
611e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // regular character
612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      *__s++ = _Traits::to_char_type(__c);
613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      ++__n;
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__append_null)
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__status)
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__status);    // This might throw.
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n;
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Much like __read_unbuffered, but with one additional function object:
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __scan_delim(first, last) returns the first pointer p in [first, last)
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// such that __is_delim(p) is true.
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__read_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 streamsize _Num, _CharT* __s,
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 _Is_Delim __is_delim, _Scan_Delim __scan_delim,
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 bool __extract_delim, bool __append_null,
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 bool __is_getline) {
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __done    = false;
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __first = __buf->_M_gptr();
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __last  = __buf->_M_egptr();
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //casting numeric_limits<ptrdiff_t>::max to streamsize only works is ptrdiff_t is signed or streamsize representation
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //is larger than ptrdiff_t one.
650e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STATIC_ASSERT((sizeof(streamsize) > sizeof(ptrdiff_t)) ||
651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                          ((sizeof(streamsize) == sizeof(ptrdiff_t)) && numeric_limits<ptrdiff_t>::is_signed))
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ptrdiff_t __request = __STATIC_CAST(ptrdiff_t, (min) (__STATIC_CAST(streamsize, (numeric_limits<ptrdiff_t>::max)()), _Num - __n));
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __p  = __scan_delim(__first, __last);
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ptrdiff_t __chunk = (min) (ptrdiff_t(__p - __first), __request);
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Traits::copy(__s, __first, __chunk);
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __s += __chunk;
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __n += __chunk;
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __buf->_M_gbump((int)__chunk);
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // We terminated by finding delim.
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__p != __last && __p - __first <= __request) {
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim) {
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __n += 1;
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __buf->_M_gbump(1);
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // We terminated by reading all the characters we were asked for.
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__n == _Num) {
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // Find out if we have reached eof.  This matters for getline.
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__is_getline) {
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__chunk == __last - __first) {
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            if (__that->_S_eof(__buf->sgetc()))
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              __status |= ios_base::eofbit;
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          else
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __status |= ios_base::failbit;
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done   = true;
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // The buffer contained fewer than _Num - __n characters.  Either we're
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // at eof, or we should refill the buffer and try again.
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__that->_S_eof(__buf->sgetc())) {
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::eofbit;
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __done = true;
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } // Close the while loop.
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __done = true;
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__done) {
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__append_null)
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__status != 0)
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that->setstate(__status);   // This might throw.
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If execution has reached this point, then we have an empty buffer but
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we have not reached eof.  What that means is that the streambuf has
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // decided to switch from buffered to unbuffered input.  We switch to
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // to __read_unbuffered.
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n + __read_unbuffered(__that,  __buf, _Num - __n, __s, __is_delim,
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 __extract_delim,__append_null,__is_getline);
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::get(_CharT* __s, streamsize __n,
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    _CharT __delim) {
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > 0) {
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->egptr() != __buf->gptr())
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_gcount =
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __read_buffered(this,  __buf, __n - 1, __s,
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Scan_for_char_val<_Traits>(__delim),
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, true, false);
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_gcount =
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __read_unbuffered(this,  __buf, __n - 1, __s,
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, true, false);
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Getline is essentially identical to get, except that it extracts
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// the delimiter.
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n,
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        _CharT __delim) {
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > 0) {
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = __buf->egptr() != __buf->gptr()
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ? _STLP_PRIV __read_buffered(this,  __buf, __n - 1, __s,
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Scan_for_char_val<_Traits>(__delim),
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     true, true, true)
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        : _STLP_PRIV __read_unbuffered(this,  __buf, __n - 1, __s,
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       true, true, true);
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Read n characters.  We don't look for any delimiter, and we don't
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// put in a terminating null character.
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) {
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry && !this->eof()) {
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>*__buf = this->rdbuf();
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf->gptr() != __buf->egptr())
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_gcount
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        = _STLP_PRIV __read_buffered(this,  __buf, __n, __s,
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, false, false);
7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_gcount
7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        = _STLP_PRIV __read_unbuffered(this,  __buf, __n, __s,
7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false, false);
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->eof())
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::eofbit | ios_base::failbit);
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Read n or fewer characters.  We don't look for any delimiter, and
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// we don't put in a terminating null character.
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __nmax) {
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry && !this->eof() && __nmax >= 0) {
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    streamsize __avail = __buf->in_avail();
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // fbp : isn't full-blown setstate required here ?
8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__avail == -1)
8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_setstate_nothrow(ios_base::eofbit);
8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__avail != 0) {
8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount
8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          = _STLP_PRIV __read_buffered(this,  __buf, (min) (__avail, __nmax), __s,
8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false, false);
8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount
8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          = _STLP_PRIV __read_unbuffered(this,  __buf, (min) (__avail, __nmax), __s,
8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         false, false, false);
8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // fbp : changed so that failbit is set only there, to pass Dietmar's test
8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->eof())
8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit | ios_base::failbit);
8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::failbit);
8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  if (this->eof())
8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //    this->setstate(ios_base::eofbit | ios_base::failbit);
8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _M_gcount;
8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT* __s) {
8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this); // Skip whitespace.
8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    streamsize __nmax = this->width() > 0
8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ? this->width() - 1
8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      : ((numeric_limits<streamsize>::max)() / sizeof(_CharT)) - 1;
8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    streamsize __n = __buf->gptr() != __buf->egptr()
8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ? _STLP_PRIV __read_buffered(this,  __buf, __nmax, __s,
869e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   _STLP_PRIV _Is_wspace_null<_Traits>(this->_M_ctype_facet()),
870e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   _STLP_PRIV _Scan_wspace_null<_Traits>(this->_M_ctype_facet()),
8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   false, true, false)
8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      : _STLP_PRIV __read_unbuffered(this,  __buf, __nmax, __s,
873e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                     _STLP_PRIV _Is_wspace_null<_Traits>(this->_M_ctype_facet()),
8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, true, false);
8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n == 0)
8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::failbit);
8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->width(0);
8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A generic unbuffered function for ignoring characters.  We stop
8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// when we reach EOF, or when the function object __is_delim returns
8839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// true.  In the last case, it extracts the character for which
8849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __is_delim is true, if and only if __extract_delim is true.
8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim>
8879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL
8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     basic_streambuf<_CharT, _Traits>* __buf,
8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _Is_Delim __is_delim,
8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     bool __extract_delim, bool __set_failbit) {
8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __done = false;
8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (!__done) {
8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int_type __c = __buf->sbumpc();
8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : ios_base::eofbit;
9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__is_delim(_Traits::to_char_type(__c))) {
9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (!__extract_delim)
9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __status |= ios_base::failbit;
9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
9159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
9169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __that->setstate(__status);
9199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
9209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A generic buffered function for ignoring characters.  Much like
9229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// _M_ignore_unbuffered, but with one additional function object:
9239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __scan_delim(first, last) returns the first pointer p in [first,
9249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// last) such that __is_delim(p) is true.
9259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
9279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL
9289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
9299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   basic_streambuf<_CharT, _Traits>* __buf,
9309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
9319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   bool __extract_delim, bool __set_failbit) {
9329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __at_eof      = false;
9339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __found_delim = false;
9349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
9369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__buf->_M_egptr() != __buf->_M_gptr() && !__at_eof && !__found_delim) {
9379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
9389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __buf->_M_gbump((int)(__p - __buf->_M_gptr()));
9399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__p != __buf->_M_egptr()) { // We found delim, so we're done.
9419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim)
9429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __buf->_M_gbump(1);
9439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __found_delim = true;
9449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else                         // No delim.  Try to refil the buffer.
9479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __at_eof = __that->_S_eof(__buf->sgetc());
9489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }                              // Close the while loop.
9499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
9519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
9529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
9539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__at_eof) {
9569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
9579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   : ios_base::eofbit);
9589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
9599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__found_delim)
9619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
9629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If execution has reached this point, then we have an empty buffer but
9649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we have not reached eof.  What that means is that the streambuf has
9659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // decided to switch from a buffered to an unbuffered mode.  We switch
9669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // to _M_ignore_unbuffered.
9679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_ignore_unbuffered(__that,  __buf, __is_delim, __extract_delim, __set_failbit);
9689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
9699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Overloaded versions of _M_ignore_unbuffered and _M_ignore_unbuffered
9719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// with an explicit count _Num.  Return value is the number of
9729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// characters extracted.
9739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
9749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The function object __max_chars takes two arguments, _Num and __n
9759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// (the latter being the number of characters we have already read),
9769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// and returns the maximum number of characters to read from the buffer.
9779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// We parameterize _M_ignore_buffered so that we can use it for both
9789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// bounded and unbounded input; for the former the function object should
9799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// be minus<>, and for the latter it should return a constant maximum value.
9809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim>
9829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
9839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
9849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     basic_streambuf<_CharT, _Traits>* __buf,
9859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     streamsize _Num, _Max_Chars __max_chars,
9869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _Is_Delim __is_delim,
9879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     bool __extract_delim, bool __set_failbit) {
9889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
9899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
9909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
9919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
9939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__max_chars(_Num, __n) > 0) {
9949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int_type __c = __buf->sbumpc();
9959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
9979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
9989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : ios_base::eofbit;
9999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
10009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__is_delim(_Traits::to_char_type(__c))) {
10039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim)
10049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          ++__n;
10059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
10069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
10079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
10099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // fbp : added counter increment to pass Dietmar's test
10119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__n;
10129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
10139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
10159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
10169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__status)
10199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__status);   // This might throw.
10209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n;
10219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
10229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim, class _Scan_Delim>
10249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
10259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
10269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   basic_streambuf<_CharT, _Traits>* __buf,
10279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   streamsize _Num,
10289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Max_Chars __max_chars,
10299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
10309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   bool __extract_delim, bool __set_failbit) {
10319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
10329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __at_eof = false;
10339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __done   = false;
10349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
10369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
10379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ptrdiff_t __avail = __buf->_M_egptr() - __buf->_M_gptr();
10389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      streamsize __m = __max_chars(_Num, __n);
10399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__avail >= __m) {       // We have more characters than we need.
10419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _CharT* __last = __buf->_M_gptr() + __STATIC_CAST(ptrdiff_t, __m);
10429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _CharT* __p = __scan_delim(__buf->_M_gptr(), __last);
10439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ptrdiff_t __chunk = __p - __buf->_M_gptr();
10449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __n += __chunk;
10459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __buf->_M_gbump((int)__chunk);
10469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim && __p != __last) {
10489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __n += 1;
10499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __buf->_M_gbump(1);
10509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
10539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
10569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
10579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ptrdiff_t __chunk = __p - __buf->_M_gptr();
10589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __n += __chunk;
10599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __buf->_M_gbump((int)__chunk);
10609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__p != __buf->_M_egptr()) { // We found delim.
10629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__extract_delim) {
10639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __n += 1;
10649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __buf->_M_gbump(1);
10659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
10669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __done = true;
10689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // We didn't find delim.  Try to refill the buffer.
10719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else if (__that->_S_eof(__buf->sgetc())) {
10729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __done   = true;
10739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __at_eof = true;
10749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } // Close the while loop.
10779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
10799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
10809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
10819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__at_eof)
10849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
10859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   : ios_base::eofbit);
10869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__done)
10889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
10899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If execution has reached this point, then we have an empty buffer but
10919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we have not reached eof.  What that means is that the streambuf has
10929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // decided to switch from buffered to unbuffered input.  We switch to
10939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // to _M_ignore_unbuffered.
10949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n + _M_ignore_unbuffered(__that,  __buf, _Num, __max_chars,
10969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    __is_delim, __extract_delim, __set_failbit);
10979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
10989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
11019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
11029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::ignore(streamsize __n) {
11039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
11049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
11059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
11079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
11089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_unary_fun<bool, int_type> _Const_bool;
11099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_binary_fun<streamsize, streamsize, streamsize> _Const_streamsize;
11109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const streamsize __maxss = (numeric_limits<streamsize>::max)();
11119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n == (numeric_limits<int>::max)()) {
11139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __maxss, _Const_streamsize(__maxss),
11169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _Const_bool(false),
11179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
11189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false);
11199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf,
11219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         __maxss, _Const_streamsize(__maxss),
11229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _Const_bool(false), false, false);
11239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
11259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __n, minus<streamsize>(),
11289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _Const_bool(false),
11299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
11309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false);
11319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
11339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _Const_bool(false), false, false);
11349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
11369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
11389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
11399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
11419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
11429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __delim) {
11439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
11449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
11459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
11479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
11489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_unary_fun<bool, int_type> _Const_bool;
11499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_binary_fun<streamsize, streamsize, streamsize>
11509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Const_streamsize;
11519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const streamsize __maxss = (numeric_limits<streamsize>::max)();
11529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n == (numeric_limits<int>::max)()) {
11549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __maxss, _Const_streamsize(__maxss),
11579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Scan_for_int_val<_Traits>(__delim),
11599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       true, false);
11609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf,
11629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         __maxss, _Const_streamsize(__maxss),
11639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         true, false);
11659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
11679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __n, minus<streamsize>(),
11709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Scan_for_int_val<_Traits>(__delim),
11729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       true, false);
11739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
11759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         true, false);
11779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
11799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
11819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
11829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This member function does not construct a sentry object, because
11849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// it is called from sentry's constructor.
11859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
11869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid basic_istream<_CharT, _Traits>::_M_skip_whitespace(bool __set_failbit) {
11879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
11889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!__buf)
11899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::badbit);
11909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (__buf->gptr() != __buf->egptr())
11919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_ignore_buffered(this,  __buf,
1192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                       _STLP_PRIV _Is_not_wspace<_Traits>(this->_M_ctype_facet()),
1193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                       _STLP_PRIV _Scan_for_not_wspace<_Traits>(this->_M_ctype_facet()),
11949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       false, __set_failbit);
11959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
11969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_ignore_unbuffered(this,  __buf,
1197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                         _STLP_PRIV _Is_not_wspace<_Traits>(this->_M_ctype_facet()),
11989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                         false, __set_failbit);
11999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
12009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This is a very simple loop that reads characters from __src and puts
12039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// them into __dest.  It looks complicated because of the (standard-
12049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mandated) exception handling policy.
12059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
12069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// We stop when we get an exception, when we fail to insert into the
12079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// output streambuf, or when __is_delim is true.
12089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
12109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim>
12129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
12139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
12149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  basic_streambuf<_CharT, _Traits>* __dest,
12159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _Is_Delim __is_delim,
12169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  bool __extract_delim, bool __rethrow) {
12179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __extracted = 0;
12189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
12199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
12209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type __c;
12219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
12239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (;;) {
12249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // Get a character. If there's an exception, catch and (maybe) rethrow it.
12259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = __src->sbumpc();
12269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // If we failed to get a character, then quit.
12289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
12299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= ios_base::eofbit;
12309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
12319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
12329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // If it's the delimiter, then quit.
12339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__is_delim(_Traits::to_char_type(__c))) {
12349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (!__extract_delim && !__pushback(__src, _Traits::to_char_type(__c)))
12359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
12369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
12379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
12389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
12399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // Try to put the character in the output streambuf.
12409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        bool __failed = false;
12419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_TRY {
12429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (!__that->_S_eof(__dest->sputc(_Traits::to_char_type(__c))))
12439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            ++__extracted;
12449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          else
12459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __failed = true;
12469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
12479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_CATCH_ALL {
12489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __failed = true;
12499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
12509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // If we failed to put the character in the output streambuf, then
12529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // try to push it back to the input streambuf.
12539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__failed && !__pushback(__src, _Traits::to_char_type(__c)))
12549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
12559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // fbp : avoiding infinite loop in io-27-6-1-2-3.exp
12579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__failed)
12589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          break;
12599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
12609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } /* for (;;) */
12629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
12649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // fbp : this try/catch moved here in reasonable assumption
12659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // __is_delim never throw (__pushback is guaranteed not to)
12669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
12679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // See 27.6.1.2.3, paragraph 13.
12689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__rethrow && __extracted == 0)
12699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that->_M_handle_exception(ios_base::failbit);
12709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
12719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __that->setstate(__status);
12729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __extracted;
12739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
12749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Buffered copying from one streambuf to another.  We copy the characters
12769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// in chunks, rather than one at a time.  We still have to worry about all
12779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// of the error conditions we checked in __copy_unbuffered, plus one more:
12789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// the streambuf might decide to switch from a buffered to an unbuffered mode.
12799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
12819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
12829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
12839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                basic_streambuf<_CharT, _Traits>* __dest,
12849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _Scan_Delim __scan_delim, _Is_Delim __is_delim,
12859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                bool __extract_delim, bool __rethrow) {
12869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __extracted = 0;
12879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
12889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
12899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Borland compiler generates a warning if assignment because value is never used:
12909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type __c /*= _Traits::eof()*/;
12919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CharT* __first = __src->_M_gptr();
12929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ptrdiff_t __avail = __src->_M_egptr() - __first;
12939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // fbp : introduced to move catch/try blocks out of the loop
12949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __do_handle_exceptions = false;
12959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
12979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (;;) {
12989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __last = __scan_delim(__first, __src->_M_egptr());
12999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // Try to copy the entire input buffer to the output buffer.
13019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      streamsize __n = __dest->sputn(__first, __extract_delim && __last != __src->_M_egptr()
13029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     ? (__last - __first) + 1
13039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     : (__last - __first));
13049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __src->_M_gbump((int)__n);
13059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __extracted += __n;
13069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // from this on, catch() will call _M_handle_exceptions()
13089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __do_handle_exceptions = true;
13099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__n < __avail)          // We found the delimiter, or else failed to
13119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;                    // copy some characters.
13129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = __src->sgetc();
13149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // Three possibilities: we succeeded in refilling the buffer, or
13169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // we got EOF, or the streambuf has switched to unbuffered mode.
13179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __first = __src->_M_gptr();
13189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __avail = __src->_M_egptr() - __first;
13199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__avail > 0)
13219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        {}  // dwa 1/16/00 -- suppress a Metrowerks warning
13229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__that->_S_eof(__c)) {
13239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= ios_base::eofbit;
13249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
13259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
13269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
13279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __extracted + __copy_unbuffered(__that,  __src, __dest, __is_delim,
13289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                __extract_delim, __rethrow);
13299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
13309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __do_handle_exceptions = false;
13329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
13339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
13369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // See 27.6.1.2.3, paragraph 13.
13379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__rethrow && __do_handle_exceptions &&  __extracted == 0)
13389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that->_M_handle_exception(ios_base::failbit);
13399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__status)
13429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__status);   // This might throw.
13439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __extracted;
13449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
13459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
13479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
13499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
13509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>
13519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ::get(basic_streambuf<_CharT, _Traits>& __dest, _CharT __delim) {
13529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
13539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
13549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
13569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
13579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__src)
13599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = __src->egptr() != __src->gptr()
13609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ? _STLP_PRIV __copy_buffered(this,  __src, &__dest,
13619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Scan_for_char_val<_Traits>(__delim),
13629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
13639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, false)
13649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        : _STLP_PRIV __copy_unbuffered(this,  __src, &__dest,
13659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
13669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false);
13679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
13709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
13719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
13739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
13749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copying characters into a streambuf.
13769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
13779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
13789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>
13799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ::operator>>(basic_streambuf<_CharT, _Traits>* __dest) {
13809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
13819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
13829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Sentry __sentry(*this);
13839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
13849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
13859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__src && __dest)
13869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __n = __src->egptr() != __src->gptr()
13879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ? _STLP_PRIV __copy_buffered(this,  __src, __dest,
13889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
13899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
13909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, true)
13919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        : _STLP_PRIV __copy_unbuffered(this,  __src, __dest,
13929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
13939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, true);
13949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__n == 0)
13979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
13989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
14009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
14019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ----------------------------------------------------------------
14039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// basic_iostream<> class
14049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ----------------------------------------------------------------
14059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
14079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_iostream<_CharT, _Traits>
14089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ::basic_iostream(basic_streambuf<_CharT, _Traits>* __buf)
14099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : basic_ios<_CharT, _Traits>(),
14109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_istream<_CharT, _Traits>(__buf),
14119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_ostream<_CharT, _Traits>(__buf) {
14129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->init(__buf);
14139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
14149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
14169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_iostream<_CharT, _Traits>::~basic_iostream()
14179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{}
14189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
14209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BIS_int_type__
14229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BIS_pos_type__
14239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BIS_off_type__
14249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_ISTREAM_C */
14269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
14289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
14299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
1430