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) {
210ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes#if 0 // This breaks __get_integer for short.
211ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes// BEGIN Android-removed.
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  long __lval;
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __lval);
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ( this->fail() ) {
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  short __tmp = __STATIC_CAST(short, __lval);
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  unsigned short __uval = __STATIC_CAST(unsigned short, __lval);
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // check if we lose digits
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //    if ((__val != __lval) && ((unsigned short)__val != __lval))
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ((__tmp != __lval) && ((long)__uval != __lval))
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __val = __tmp;
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
226ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes// END Android-removed.
227ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes#else
228ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes  _STLP_PRIV __get_num(*this, __val);
229ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes  return *this;
230ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes#endif
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (int& __val) {
235ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes#if 0 // This seems to work, but there doesn't seem to be any reason for it.
236ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes// BEGIN Android-removed.
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  long __lval;
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __lval);
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ( this->fail() ) {
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int __tmp = __lval;
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  unsigned int __uval = __lval;
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // check if we lose digits
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //    if ((__val != __lval) && ((unsigned int)__val != __lval))
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ((__tmp != __lval) && ((long)__uval != __lval))
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __val = __tmp;
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
251ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes// END Android-removed.
252ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes#else
253ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes  _STLP_PRIV __get_num(*this, __val);
254ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes  return *this;
255ee3d0ea50df7a77e11a83ad627d492b105e39207Elliott Hughes#endif
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned short& __val) {
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned int& __val) {
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (long& __val) {
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned long& __val) {
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_LONG_LONG)
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (_STLP_LONG_LONG& __val) {
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (unsigned _STLP_LONG_LONG& __val) {
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (float& __val) {
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (double& __val) {
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_LONG_DOUBLE)
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (long double& __val) {
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_BOOL)
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (bool& __val) {
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>> (void*& __val) {
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_num(*this, __val);
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Unformatted input
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__BIS_int_type__
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::peek() {
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename _Traits::int_type __tmp = _Traits::eof();
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sgetc();
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_S_eof(__tmp))
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit);
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __tmp;
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__BIS_int_type__
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::get() {
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename _Traits::int_type __tmp = _Traits::eof();
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sbumpc();
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__tmp))
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = 1;
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (_M_gcount == 0)
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::eofbit | ios_base::failbit);
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __tmp;
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::get(_CharT& __c) {
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename _Traits::int_type __tmp = _Traits::eof();
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sbumpc();
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__tmp)) {
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = 1;
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = _Traits::to_char_type(__tmp);
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::eofbit | ios_base::failbit);
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Read characters and discard them.  The standard specifies a single
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// function with two arguments, each with a default.  We instead use
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// three overloded functions, because it's possible to implement the
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// first two more efficiently than the fully general third version.
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore() {
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    int_type __c;
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = this->rdbuf()->sbumpc();
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return *this;
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__c))
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = 1;
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit);
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Putback
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::putback(_CharT __c) {
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename _Traits::int_type __tmp = _Traits::eof();
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//    if (!__buf || this->_S_eof(__buf->sputbackc(__c)))
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf) {
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __tmp = __buf->sputbackc(__c);
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_CATCH_ALL {
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_handle_exception(ios_base::badbit);
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_S_eof(__tmp))
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::badbit);
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //     if (!__buf || _Traits::eq_int_type(__buf->sungetc(), _Traits::eof()))
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf) {
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (this->_S_eof(__buf->sungetc()))
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->setstate(ios_base::badbit);
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_CATCH_ALL {
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_handle_exception(ios_base::badbit);
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } else
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::badbit);
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Positioning and buffer control.
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockint basic_istream<_CharT, _Traits>::sync() {
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__buf) {
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf->pubsync() == -1) {
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::badbit);
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return -1;
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return 0;
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return -1;
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__BIS_pos_type__
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::tellg() {
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__buf && !this->fail()) ? __buf->pubseekoff(0, ios_base::cur, ios_base::in)
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : pos_type(-1);
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
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    if (__buf->pubseekpos(__pos, ios_base::in) == pos_type(-1)) {
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::failbit);
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) {
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!this->fail() && __buf)
537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __buf->pubseekoff(__off, __dir, ios_base::in);
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Formatted input of characters and character arrays.
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT& __c) {
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  typename _Traits::int_type __tmp = _Traits::eof();
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this); // Skip whitespace.
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename _Traits::int_type __tmp;// = _Traits::eof();
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __tmp = this->rdbuf()->sbumpc();
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_CATCH_ALL {
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_handle_exception(ios_base::badbit);
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return;
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!this->_S_eof(__tmp))
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = _Traits::to_char_type(__tmp);
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit | ios_base::failbit);
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//---------------------------------------------------------------------------
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// istream's helper functions.
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A generic function for unbuffered input.  We stop when we reach EOF,
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// or when we have extracted _Num characters, or when the function object
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __is_delim return true.  In the last case, it extracts the character
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// for which __is_delim is true, if and only if __extract_delim is true.
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// It appends a null character to the end of the string; this means that
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// it may store up to _Num + 1 characters.
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __is_getline governs two corner cases: reading _Num characters without
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// encountering delim or eof (in which case failbit is set if __is_getline
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// is true); and reading _Num characters where the _Num+1'st character is
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// eof (in which case eofbit is set if __is_getline is true).
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// It is assumed that __is_delim never throws.
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Return value is the number of characters extracted, including the
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// delimiter if it is extracted.  Note that the number of characaters
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// extracted isn't necessarily the same as the number stored.
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim>
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__read_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  streamsize _Num, _CharT* __s,
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _Is_Delim __is_delim,
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  bool __extract_delim, bool __append_null,
597e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                  bool __is_getline)
598e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The operations that can potentially throw are sbumpc, snextc, and sgetc.
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (;;) {
606e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (__n == _Num) {
607e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (__is_getline) // didn't find delimiter as one of the _Num chars
608e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          __status |= ios_base::failbit;
609e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        break;
610e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int_type __c = __buf->sbumpc(); // sschwarz
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__n < _Num || __is_getline)
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::eofbit;
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
617e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else if (__is_delim(_Traits::to_char_type(__c))) {
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim) { // Extract and discard current character.
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          ++__n;
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        } else if ( !__pushback(__buf, _Traits::to_char_type(__c)) ) { // leave delimiter
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
625e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // regular character
626e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      *__s++ = _Traits::to_char_type(__c);
627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      ++__n;
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__append_null)
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__status)
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__status);    // This might throw.
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n;
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Much like __read_unbuffered, but with one additional function object:
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __scan_delim(first, last) returns the first pointer p in [first, last)
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// such that __is_delim(p) is true.
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__read_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 streamsize _Num, _CharT* __s,
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 _Is_Delim __is_delim, _Scan_Delim __scan_delim,
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 bool __extract_delim, bool __append_null,
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 bool __is_getline) {
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __done    = false;
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __first = __buf->_M_gptr();
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __last  = __buf->_M_egptr();
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //casting numeric_limits<ptrdiff_t>::max to streamsize only works is ptrdiff_t is signed or streamsize representation
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //is larger than ptrdiff_t one.
664e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STATIC_ASSERT((sizeof(streamsize) > sizeof(ptrdiff_t)) ||
665e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                          ((sizeof(streamsize) == sizeof(ptrdiff_t)) && numeric_limits<ptrdiff_t>::is_signed))
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ptrdiff_t __request = __STATIC_CAST(ptrdiff_t, (min) (__STATIC_CAST(streamsize, (numeric_limits<ptrdiff_t>::max)()), _Num - __n));
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __p  = __scan_delim(__first, __last);
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ptrdiff_t __chunk = (min) (ptrdiff_t(__p - __first), __request);
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Traits::copy(__s, __first, __chunk);
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __s += __chunk;
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __n += __chunk;
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __buf->_M_gbump((int)__chunk);
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // We terminated by finding delim.
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__p != __last && __p - __first <= __request) {
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim) {
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __n += 1;
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __buf->_M_gbump(1);
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // We terminated by reading all the characters we were asked for.
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__n == _Num) {
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // Find out if we have reached eof.  This matters for getline.
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__is_getline) {
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__chunk == __last - __first) {
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            if (__that->_S_eof(__buf->sgetc()))
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              __status |= ios_base::eofbit;
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          else
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __status |= ios_base::failbit;
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done   = true;
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // The buffer contained fewer than _Num - __n characters.  Either we're
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // at eof, or we should refill the buffer and try again.
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__that->_S_eof(__buf->sgetc())) {
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::eofbit;
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __done = true;
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } // Close the while loop.
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __done = true;
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__done) {
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__append_null)
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__status != 0)
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that->setstate(__status);   // This might throw.
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If execution has reached this point, then we have an empty buffer but
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we have not reached eof.  What that means is that the streambuf has
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // decided to switch from buffered to unbuffered input.  We switch to
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // to __read_unbuffered.
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n + __read_unbuffered(__that,  __buf, _Num - __n, __s, __is_delim,
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 __extract_delim,__append_null,__is_getline);
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::get(_CharT* __s, streamsize __n,
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    _CharT __delim) {
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > 0) {
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->egptr() != __buf->gptr())
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_gcount =
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __read_buffered(this,  __buf, __n - 1, __s,
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Scan_for_char_val<_Traits>(__delim),
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, true, false);
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_gcount =
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __read_unbuffered(this,  __buf, __n - 1, __s,
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, true, false);
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Getline is essentially identical to get, except that it extracts
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// the delimiter.
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n,
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        _CharT __delim) {
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > 0) {
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = __buf->egptr() != __buf->gptr()
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ? _STLP_PRIV __read_buffered(this,  __buf, __n - 1, __s,
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Scan_for_char_val<_Traits>(__delim),
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     true, true, true)
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        : _STLP_PRIV __read_unbuffered(this,  __buf, __n - 1, __s,
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       true, true, true);
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Read n characters.  We don't look for any delimiter, and we don't
7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// put in a terminating null character.
7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) {
7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry && !this->eof()) {
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>*__buf = this->rdbuf();
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__buf->gptr() != __buf->egptr())
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_gcount
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        = _STLP_PRIV __read_buffered(this,  __buf, __n, __s,
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, false, false);
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_gcount
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        = _STLP_PRIV __read_unbuffered(this,  __buf, __n, __s,
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false, false);
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->eof())
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::eofbit | ios_base::failbit);
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Read n or fewer characters.  We don't look for any delimiter, and
8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// we don't put in a terminating null character.
8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize
8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __nmax) {
8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry && !this->eof() && __nmax >= 0) {
8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    streamsize __avail = __buf->in_avail();
8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // fbp : isn't full-blown setstate required here ?
8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__avail == -1)
8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_setstate_nothrow(ios_base::eofbit);
8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__avail != 0) {
8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount
8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          = _STLP_PRIV __read_buffered(this,  __buf, (min) (__avail, __nmax), __s,
8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false, false);
8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount
8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          = _STLP_PRIV __read_unbuffered(this,  __buf, (min) (__avail, __nmax), __s,
8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         false, false, false);
8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // fbp : changed so that failbit is set only there, to pass Dietmar's test
8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->eof())
8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::eofbit | ios_base::failbit);
8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::failbit);
8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  if (this->eof())
8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //    this->setstate(ios_base::eofbit | ios_base::failbit);
8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _M_gcount;
8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT* __s) {
8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this); // Skip whitespace.
8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    streamsize __nmax = this->width() > 0
8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ? this->width() - 1
8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      : ((numeric_limits<streamsize>::max)() / sizeof(_CharT)) - 1;
8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    streamsize __n = __buf->gptr() != __buf->egptr()
8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ? _STLP_PRIV __read_buffered(this,  __buf, __nmax, __s,
883e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   _STLP_PRIV _Is_wspace_null<_Traits>(this->_M_ctype_facet()),
884e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   _STLP_PRIV _Scan_wspace_null<_Traits>(this->_M_ctype_facet()),
8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   false, true, false)
8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      : _STLP_PRIV __read_unbuffered(this,  __buf, __nmax, __s,
887e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                     _STLP_PRIV _Is_wspace_null<_Traits>(this->_M_ctype_facet()),
8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, true, false);
8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n == 0)
8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->setstate(ios_base::failbit);
8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->width(0);
8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A generic unbuffered function for ignoring characters.  We stop
8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// when we reach EOF, or when the function object __is_delim returns
8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// true.  In the last case, it extracts the character for which
8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __is_delim is true, if and only if __extract_delim is true.
8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim>
9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL
9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     basic_streambuf<_CharT, _Traits>* __buf,
9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _Is_Delim __is_delim,
9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     bool __extract_delim, bool __set_failbit) {
9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __done = false;
9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (!__done) {
9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int_type __c = __buf->sbumpc();
9139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
9159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
9169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
9179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : ios_base::eofbit;
9189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__is_delim(_Traits::to_char_type(__c))) {
9219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
9229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (!__extract_delim)
9239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
9249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __status |= ios_base::failbit;
9259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
9299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
9309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __that->setstate(__status);
9339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
9349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A generic buffered function for ignoring characters.  Much like
9369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// _M_ignore_unbuffered, but with one additional function object:
9379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __scan_delim(first, last) returns the first pointer p in [first,
9389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// last) such that __is_delim(p) is true.
9399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
9419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL
9429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
9439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   basic_streambuf<_CharT, _Traits>* __buf,
9449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
9459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   bool __extract_delim, bool __set_failbit) {
9469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __at_eof      = false;
9479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __found_delim = false;
9489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
9509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__buf->_M_egptr() != __buf->_M_gptr() && !__at_eof && !__found_delim) {
9519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
9529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __buf->_M_gbump((int)(__p - __buf->_M_gptr()));
9539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__p != __buf->_M_egptr()) { // We found delim, so we're done.
9559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim)
9569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __buf->_M_gbump(1);
9579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __found_delim = true;
9589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else                         // No delim.  Try to refil the buffer.
9619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __at_eof = __that->_S_eof(__buf->sgetc());
9629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }                              // Close the while loop.
9639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
9659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
9669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
9679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__at_eof) {
9709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
9719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   : ios_base::eofbit);
9729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
9739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__found_delim)
9759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
9769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If execution has reached this point, then we have an empty buffer but
9789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we have not reached eof.  What that means is that the streambuf has
9799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // decided to switch from a buffered to an unbuffered mode.  We switch
9809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // to _M_ignore_unbuffered.
9819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_ignore_unbuffered(__that,  __buf, __is_delim, __extract_delim, __set_failbit);
9829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
9839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Overloaded versions of _M_ignore_unbuffered and _M_ignore_unbuffered
9859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// with an explicit count _Num.  Return value is the number of
9869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// characters extracted.
9879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
9889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The function object __max_chars takes two arguments, _Num and __n
9899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// (the latter being the number of characters we have already read),
9909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// and returns the maximum number of characters to read from the buffer.
9919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// We parameterize _M_ignore_buffered so that we can use it for both
9929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// bounded and unbounded input; for the former the function object should
9939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// be minus<>, and for the latter it should return a constant maximum value.
9949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim>
9969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
9979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
9989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     basic_streambuf<_CharT, _Traits>* __buf,
9999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     streamsize _Num, _Max_Chars __max_chars,
10009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _Is_Delim __is_delim,
10019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     bool __extract_delim, bool __set_failbit) {
10029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
10039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
10049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
10059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
10079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__max_chars(_Num, __n) > 0) {
10089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int_type __c = __buf->sbumpc();
10099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
10119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
10129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : ios_base::eofbit;
10139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
10149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__is_delim(_Traits::to_char_type(__c))) {
10179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__extract_delim)
10189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          ++__n;
10199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
10209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
10219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
10239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // fbp : added counter increment to pass Dietmar's test
10259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__n;
10269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
10279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
10299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
10309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__status)
10339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__status);   // This might throw.
10349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n;
10359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
10369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim, class _Scan_Delim>
10389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
10399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
10409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   basic_streambuf<_CharT, _Traits>* __buf,
10419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   streamsize _Num,
10429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Max_Chars __max_chars,
10439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
10449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   bool __extract_delim, bool __set_failbit) {
10459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
10469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __at_eof = false;
10479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __done   = false;
10489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
10509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
10519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ptrdiff_t __avail = __buf->_M_egptr() - __buf->_M_gptr();
10529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      streamsize __m = __max_chars(_Num, __n);
10539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__avail >= __m) {       // We have more characters than we need.
10559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _CharT* __last = __buf->_M_gptr() + __STATIC_CAST(ptrdiff_t, __m);
10569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _CharT* __p = __scan_delim(__buf->_M_gptr(), __last);
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 (__extract_delim && __p != __last) {
10629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __n += 1;
10639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __buf->_M_gbump(1);
10649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __done = true;
10679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
10709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
10719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ptrdiff_t __chunk = __p - __buf->_M_gptr();
10729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __n += __chunk;
10739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __buf->_M_gbump((int)__chunk);
10749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__p != __buf->_M_egptr()) { // We found delim.
10769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__extract_delim) {
10779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __n += 1;
10789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __buf->_M_gbump(1);
10799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
10809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __done = true;
10829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // We didn't find delim.  Try to refill the buffer.
10859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else if (__that->_S_eof(__buf->sgetc())) {
10869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __done   = true;
10879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __at_eof = true;
10889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } // Close the while loop.
10919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
10939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->_M_handle_exception(ios_base::badbit);
10949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
10959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__at_eof)
10989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
10999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   : ios_base::eofbit);
11009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__done)
11029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __n;
11039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If execution has reached this point, then we have an empty buffer but
11059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we have not reached eof.  What that means is that the streambuf has
11069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // decided to switch from buffered to unbuffered input.  We switch to
11079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // to _M_ignore_unbuffered.
11089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n + _M_ignore_unbuffered(__that,  __buf, _Num, __max_chars,
11109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    __is_delim, __extract_delim, __set_failbit);
11119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
11129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
11159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
11169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::ignore(streamsize __n) {
11179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
11189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
11199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
11219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
11229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_unary_fun<bool, int_type> _Const_bool;
11239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_binary_fun<streamsize, streamsize, streamsize> _Const_streamsize;
11249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const streamsize __maxss = (numeric_limits<streamsize>::max)();
11259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n == (numeric_limits<int>::max)()) {
11279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __maxss, _Const_streamsize(__maxss),
11309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _Const_bool(false),
11319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
11329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false);
11339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf,
11359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         __maxss, _Const_streamsize(__maxss),
11369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _Const_bool(false), false, false);
11379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
11399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __n, minus<streamsize>(),
11429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _Const_bool(false),
11439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
11449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false);
11459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
11479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _Const_bool(false), false, false);
11489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
11509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
11529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
11539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
11559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
11569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __delim) {
11579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
11589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
11599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
11619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
11629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef _STLP_PRIV _Constant_binary_fun<streamsize, streamsize, streamsize>
11639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Const_streamsize;
11649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const streamsize __maxss = (numeric_limits<streamsize>::max)();
11659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n == (numeric_limits<int>::max)()) {
11679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __maxss, _Const_streamsize(__maxss),
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,
11759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         __maxss, _Const_streamsize(__maxss),
11769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         true, false);
11789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
11809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__buf->gptr() != __buf->egptr())
11819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_buffered(this,  __buf,
11829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       __n, minus<streamsize>(),
11839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Scan_for_int_val<_Traits>(__delim),
11859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       true, false);
11869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else
11879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
11889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         _STLP_PRIV _Eq_int_bound<_Traits>(__delim),
11899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         true, false);
11909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
11919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
11929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
11949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
11959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This member function does not construct a sentry object, because
11979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// it is called from sentry's constructor.
11989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
11999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid basic_istream<_CharT, _Traits>::_M_skip_whitespace(bool __set_failbit) {
12009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
12019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!__buf)
12029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::badbit);
12039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (__buf->gptr() != __buf->egptr())
12049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_ignore_buffered(this,  __buf,
1205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                       _STLP_PRIV _Is_not_wspace<_Traits>(this->_M_ctype_facet()),
1206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                       _STLP_PRIV _Scan_for_not_wspace<_Traits>(this->_M_ctype_facet()),
12079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       false, __set_failbit);
12089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
12099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_ignore_unbuffered(this,  __buf,
1210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                         _STLP_PRIV _Is_not_wspace<_Traits>(this->_M_ctype_facet()),
12119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                         false, __set_failbit);
12129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
12139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This is a very simple loop that reads characters from __src and puts
12169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// them into __dest.  It looks complicated because of the (standard-
12179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mandated) exception handling policy.
12189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//
12199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// We stop when we get an exception, when we fail to insert into the
12209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// output streambuf, or when __is_delim is true.
12219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
12239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim>
12259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
12269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
12279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  basic_streambuf<_CharT, _Traits>* __dest,
12289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _Is_Delim __is_delim,
12299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  bool __extract_delim, bool __rethrow) {
12309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __extracted = 0;
12319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
12329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
12339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type __c;
12349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
12369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (;;) {
12379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // Get a character. If there's an exception, catch and (maybe) rethrow it.
12389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = __src->sbumpc();
12399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // If we failed to get a character, then quit.
12419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__that->_S_eof(__c)) {
12429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= ios_base::eofbit;
12439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
12449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
12459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // If it's the delimiter, then quit.
12469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__is_delim(_Traits::to_char_type(__c))) {
12479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (!__extract_delim && !__pushback(__src, _Traits::to_char_type(__c)))
12489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
12499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
12509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
12519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
12529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // Try to put the character in the output streambuf.
12539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        bool __failed = false;
12549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_TRY {
12559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (!__that->_S_eof(__dest->sputc(_Traits::to_char_type(__c))))
12569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            ++__extracted;
12579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          else
12589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __failed = true;
12599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
12609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_CATCH_ALL {
12619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __failed = true;
12629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
12639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // If we failed to put the character in the output streambuf, then
12659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // try to push it back to the input streambuf.
12669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__failed && !__pushback(__src, _Traits::to_char_type(__c)))
12679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __status |= ios_base::failbit;
12689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        // fbp : avoiding infinite loop in io-27-6-1-2-3.exp
12709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__failed)
12719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          break;
12729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
12739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } /* for (;;) */
12759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
12779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // fbp : this try/catch moved here in reasonable assumption
12789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // __is_delim never throw (__pushback is guaranteed not to)
12799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
12809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // See 27.6.1.2.3, paragraph 13.
12819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__rethrow && __extracted == 0)
12829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that->_M_handle_exception(ios_base::failbit);
12839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
12849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __that->setstate(__status);
12859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __extracted;
12869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
12879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Buffered copying from one streambuf to another.  We copy the characters
12899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// in chunks, rather than one at a time.  We still have to worry about all
12909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// of the error conditions we checked in __copy_unbuffered, plus one more:
12919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// the streambuf might decide to switch from a buffered to an unbuffered mode.
12929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
12939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
12949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstreamsize _STLP_CALL
12959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
12969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                basic_streambuf<_CharT, _Traits>* __dest,
12979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _Scan_Delim __scan_delim, _Is_Delim __is_delim,
12989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                bool __extract_delim, bool __rethrow) {
12999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __extracted = 0;
13009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::iostate __status = 0;
13019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
13029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Borland compiler generates a warning if assignment because value is never used:
13039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int_type __c /*= _Traits::eof()*/;
13049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _CharT* __first = __src->_M_gptr();
13059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ptrdiff_t __avail = __src->_M_egptr() - __first;
13069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // fbp : introduced to move catch/try blocks out of the loop
13079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __do_handle_exceptions = false;
13089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
13109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (;;) {
13119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const _CharT* __last = __scan_delim(__first, __src->_M_egptr());
13129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // Try to copy the entire input buffer to the output buffer.
13149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      streamsize __n = __dest->sputn(__first, __extract_delim && __last != __src->_M_egptr()
13159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     ? (__last - __first) + 1
13169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     : (__last - __first));
13179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __src->_M_gbump((int)__n);
13189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __extracted += __n;
13199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // from this on, catch() will call _M_handle_exceptions()
13219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __do_handle_exceptions = true;
13229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__n < __avail)          // We found the delimiter, or else failed to
13249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;                    // copy some characters.
13259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __c = __src->sgetc();
13279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // Three possibilities: we succeeded in refilling the buffer, or
13299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // we got EOF, or the streambuf has switched to unbuffered mode.
13309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __first = __src->_M_gptr();
13319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __avail = __src->_M_egptr() - __first;
13329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__avail > 0)
13349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        {}  // dwa 1/16/00 -- suppress a Metrowerks warning
13359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else if (__that->_S_eof(__c)) {
13369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __status |= ios_base::eofbit;
13379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
13389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
13399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
13409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __extracted + __copy_unbuffered(__that,  __src, __dest, __is_delim,
13419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                __extract_delim, __rethrow);
13429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
13439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __do_handle_exceptions = false;
13459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
13469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_CATCH_ALL {
13499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // See 27.6.1.2.3, paragraph 13.
13509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__rethrow && __do_handle_exceptions &&  __extracted == 0)
13519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __that->_M_handle_exception(ios_base::failbit);
13529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__status)
13559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __that->setstate(__status);   // This might throw.
13569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __extracted;
13579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
13589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
13609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
13629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
13639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>
13649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ::get(basic_streambuf<_CharT, _Traits>& __dest, _CharT __delim) {
13659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  sentry __sentry(*this, _No_Skip_WS());
13669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_gcount = 0;
13679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
13699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
13709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__src)
13729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_gcount = __src->egptr() != __src->gptr()
13739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ? _STLP_PRIV __copy_buffered(this,  __src, &__dest,
13749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Scan_for_char_val<_Traits>(__delim),
13759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
13769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, false)
13779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        : _STLP_PRIV __copy_unbuffered(this,  __src, &__dest,
13789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Eq_char_bound<_Traits>(__delim),
13799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, false);
13809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
13819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_gcount == 0)
13839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
13849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
13869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
13879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
13889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copying characters into a streambuf.
13899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
13909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>&
13919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>
13929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ::operator>>(basic_streambuf<_CharT, _Traits>* __dest) {
13939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __n = 0;
13949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
13959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Sentry __sentry(*this);
13969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sentry) {
13979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
13989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__src && __dest)
13999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __n = __src->egptr() != __src->gptr()
14009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ? _STLP_PRIV __copy_buffered(this,  __src, __dest,
14019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Project2nd<const _CharT*, const _CharT*>(),
14029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
14039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     false, true)
14049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        : _STLP_PRIV __copy_unbuffered(this,  __src, __dest,
14059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_PRIV _Constant_unary_fun<bool, int_type>(false),
14069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       false, true);
14079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
14089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__n == 0)
14109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->setstate(ios_base::failbit);
14119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
14139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
14149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ----------------------------------------------------------------
14169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// basic_iostream<> class
14179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// ----------------------------------------------------------------
14189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
14209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_iostream<_CharT, _Traits>
14219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ::basic_iostream(basic_streambuf<_CharT, _Traits>* __buf)
14229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : basic_ios<_CharT, _Traits>(),
14239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_istream<_CharT, _Traits>(__buf),
14249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      basic_ostream<_CharT, _Traits>(__buf) {
14259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->init(__buf);
14269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
14279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits>
14299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_iostream<_CharT, _Traits>::~basic_iostream()
14309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{}
14319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
14339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BIS_int_type__
14359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BIS_pos_type__
14369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __BIS_off_type__
14379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_ISTREAM_C */
14399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
14409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
14419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
14429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
1443