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