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