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_INTERNAL_STREAMBUF 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_STREAMBUF 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_IOS_BASE_H 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_ios_base.h> // Needed for ios_base bitfield members. 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif // <ios_base> includes <iosfwd>. 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//---------------------------------------------------------------------- 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class basic_streambuf<>, the base class of the streambuf hierarchy. 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A basic_streambuf<> manages an input (get) area and an output (put) 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// area. Each is described by three pointers: a beginning, an end, and a 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// current position. basic_streambuf<> contains some very simple member 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// functions that manipulate those six pointers, but almost all of the real 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// functionality gets delegated to protected virtual member functions. 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// All of the public member functions are inline, and most of the protected 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// member functions are virtual. 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Although basic_streambuf<> is not abstract, it is useful only as a base 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// class. Its virtual member functions have default definitions such that 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// reading from a basic_streambuf<> will always yield EOF, and writing to a 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// basic_streambuf<> will always fail. 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The second template parameter, _Traits, defaults to char_traits<_CharT>. 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The default is declared in header <iosfwd>, and it isn't declared here 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// because C++ language rules do not allow it to be declared twice. 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits> 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass basic_streambuf { 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class basic_istream<_CharT, _Traits>; 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block friend class basic_ostream<_CharT, _Traits>; 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Typedefs. 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _CharT char_type; 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Traits::int_type int_type; 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Traits::pos_type pos_type; 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _Traits::off_type off_type; 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Traits traits_type; 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: // Data members. 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_gbegin; // Beginning of get area 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_gnext; // Current position within the get area 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_gend; // End of get area 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_pbegin; // Beginning of put area 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_pnext; // Current position within the put area 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_pend; // End of put area 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block locale _M_locale; // The streambuf's locale object 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Destructor. 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual ~basic_streambuf(); 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // The default constructor. 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_streambuf() 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MSVC) && (_STLP_MSVC < 1300) && defined (_STLP_USE_STATIC_LIB) 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We make it inline to avoid unresolved symbol. 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : _M_gbegin(0), _M_gnext(0), _M_gend(0), 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pbegin(0), _M_pnext(0), _M_pend(0), 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_locale() 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block {} 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ; 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Protected interface to the get area. 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* eback() const { return _M_gbegin; } // Beginning 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* gptr() const { return _M_gnext; } // Current position 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* egptr() const { return _M_gend; } // End 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void gbump(int __n) { _M_gnext += __n; } 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void setg(char_type* __gbegin, char_type* __gnext, char_type* __gend) { 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_gbegin = __gbegin; 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_gnext = __gnext; 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_gend = __gend; 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // An alternate public interface to the above functions 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // which allows us to avoid using templated friends which 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // are not supported on some compilers. 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_eback() const { return eback(); } 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_gptr() const { return gptr(); } 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* _M_egptr() const { return egptr(); } 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_gbump(int __n) { gbump(__n); } 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void _M_setg(char_type* __gbegin, char_type* __gnext, char_type* __gend) 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { this->setg(__gbegin, __gnext, __gend); } 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Protected interface to the put area 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* pbase() const { return _M_pbegin; } // Beginning 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* pptr() const { return _M_pnext; } // Current position 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block char_type* epptr() const { return _M_pend; } // End 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void pbump(int __n) { _M_pnext += __n; } 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void setp(char_type* __pbegin, char_type* __pend) { 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pbegin = __pbegin; 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pnext = __pbegin; 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_pend = __pend; 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Virtual buffer management functions. 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize); 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Alters the stream position, using an integer offset. In this 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // class seekoff does nothing; subclasses are expected to override it. 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual pos_type seekoff(off_type, ios_base::seekdir, 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ios_base::openmode = ios_base::in | ios_base::out); 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Alters the stream position, using a previously obtained streampos. In 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // this class seekpos does nothing; subclasses are expected to override it. 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual pos_type 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out); 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Synchronizes (i.e. flushes) the buffer. All subclasses are expected to 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // override this virtual member function. 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual int sync(); 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Buffer management. 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n) 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->setbuf(__s, __n); } 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pos_type pubseekoff(off_type __offset, ios_base::seekdir __way, 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ios_base::openmode __mod = ios_base::in | ios_base::out) 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->seekoff(__offset, __way, __mod); } 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pos_type pubseekpos(pos_type __sp, 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ios_base::openmode __mod = ios_base::in | ios_base::out) 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->seekpos(__sp, __mod); } 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int pubsync() { return this->sync(); } 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Virtual get area functions, as defined in 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 17.5.2.4.3 and 17.5.2.4.4 of the standard. 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Returns a lower bound on the number of characters that we can read, 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // with underflow, before reaching end of file. (-1 is a special value: 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // it means that underflow will fail.) Most subclasses should probably 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // override this virtual member function. 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual streamsize showmanyc(); 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Reads up to __n characters. Return value is the number of 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // characters read. 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual streamsize xsgetn(char_type* __s, streamsize __n); 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Called when there is no read position, i.e. when gptr() is null 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // or when gptr() >= egptr(). Subclasses are expected to override 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // this virtual member function. 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual int_type underflow(); 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Similar to underflow(), but used for unbuffered input. Most 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // subclasses should probably override this virtual member function. 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual int_type uflow(); 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Called when there is no putback position, i.e. when gptr() is null 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // or when gptr() == eback(). All subclasses are expected to override 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // this virtual member function. 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual int_type pbackfail(int_type = traits_type::eof()); 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Virtual put area functions, as defined in 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // 27.5.2.4.5 of the standard. 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Writes up to __n characters. Return value is the number of characters 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // written. 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual streamsize xsputn(const char_type* __s, streamsize __n); 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Extension: writes up to __n copies of __c. Return value is the number 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // of characters written. 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual streamsize _M_xsputnc(char_type __c, streamsize __n); 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Called when there is no write position. All subclasses are expected to 1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // override this virtual member function. 1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual int_type overflow(int_type = traits_type::eof()); 1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Public members for writing characters. 1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Write a single character. 1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type sputc(char_type __c) { 1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return ((_M_pnext < _M_pend) ? _Traits::to_int_type(*_M_pnext++ = __c) 2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : this->overflow(_Traits::to_int_type(__c))); 2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Write __n characters. 2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize sputn(const char_type* __s, streamsize __n) 2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->xsputn(__s, __n); } 2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Extension: write __n copies of __c. 2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize _M_sputnc(char_type __c, streamsize __n) 2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->_M_xsputnc(__c, __n); } 2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: // Helper functions. 2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type _M_snextc_aux(); 2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Public members for reading characters. 2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize in_avail() { 2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (_M_gnext < _M_gend) ? (_M_gend - _M_gnext) : this->showmanyc(); 2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Advance to the next character and return it. 2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type snextc() { 2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return ( _M_gend - _M_gnext > 1 ? 2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Traits::to_int_type(*++_M_gnext) : 2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_snextc_aux()); 2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Return the current character and advance to the next. 2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type sbumpc() { 2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext++) 2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : this->uflow(); 2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Return the current character without advancing to the next. 2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type sgetc() { 2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext) 2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : this->underflow(); 2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize sgetn(char_type* __s, streamsize __n) 2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return this->xsgetn(__s, __n); } 2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type sputbackc(char_type __c) { 2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return ((_M_gbegin < _M_gnext) && _Traits::eq(__c, *(_M_gnext - 1))) 2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ? _Traits::to_int_type(*--_M_gnext) 2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : this->pbackfail(_Traits::to_int_type(__c)); 2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int_type sungetc() { 2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (_M_gbegin < _M_gnext) 2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ? _Traits::to_int_type(*--_M_gnext) 2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block : this->pbackfail(); 2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: // Virtual locale functions. 2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // This is a hook, called by pubimbue() just before pubimbue() 2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // sets the streambuf's locale to __loc. Note that imbue should 2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // not (and cannot, since it has no access to streambuf's private 2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // members) set the streambuf's locale itself. 2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual void imbue(const locale&); 2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // Locale-related functions. 2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block locale pubimbue(const locale&); 2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block locale getloc() const { return _M_locale; } 2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_ANACHRONISMS) 2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void stossc() { this->sbumpc(); } 2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPORT) 2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS basic_streambuf<char, char_traits<char> >; 2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !defined (_STLP_NO_WCHAR_T) 2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS basic_streambuf<wchar_t, char_traits<wchar_t> >; 2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif // _STLP_NO_WCHAR_T 2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif // _STLP_USE_TEMPLATE_EXPORT 2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) 2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_streambuf.c> 2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 288