// streambuf standard header #ifndef _STREAMBUF_ #define _STREAMBUF_ #include #ifdef _MSC_VER #pragma pack(push,8) #endif /* _MSC_VER */ _STD_BEGIN // TEMPLATE CLASS basic_streambuf template > class basic_streambuf { protected: basic_streambuf() : _Loc() {_Init(); } basic_streambuf(_Uninitialized) : _Loc(_Noinit) {} public: typedef basic_streambuf<_E, _Tr> _Myt; typedef _E char_type; typedef _Tr traits_type; virtual ~basic_streambuf() {} typedef _Tr::int_type int_type; typedef _Tr::pos_type pos_type; typedef _Tr::off_type off_type; pos_type pubseekoff(off_type _O, ios_base::seekdir _W, ios_base::openmode _M = ios_base::in | ios_base::out) {return (seekoff(_O, _W, _M)); } pos_type pubseekoff(off_type _O, ios_base::seek_dir _W, ios_base::open_mode _M) {return (pubseekoff(_O, (ios_base::seekdir)_W, (ios_base::openmode)_M)); } pos_type pubseekpos(pos_type _P, ios_base::openmode _M = ios_base::in | ios_base::out) {return (seekpos(_P, _M)); } pos_type pubseekpos(pos_type _P, ios_base::open_mode _M) {return (seekpos(_P, (ios_base::openmode)_M)); } _Myt *pubsetbuf(_E *_S, streamsize _N) {return (setbuf(_S, _N)); } locale pubimbue(const locale &_Ln) {locale _Lo = _Loc; imbue(_Ln); _Loc = _Ln; return (_Lo); } locale getloc() {return (_Loc); } streamsize in_avail() {return (gptr() != 0 && gptr() < egptr() ? egptr() - gptr() : showmanyc()); } int pubsync() {return (sync()); } int_type sbumpc() {return (gptr() != 0 && gptr() < egptr() ? _Tr::to_int_type(*_Gninc()) : uflow()); } int_type sgetc() {return (gptr() != 0 && gptr() < egptr() ? _Tr::to_int_type(*gptr()) : underflow()); } streamsize sgetn(_E *_S, streamsize _N) {return (xsgetn(_S, _N)); } int_type snextc() {return (_Tr::eq_int_type(_Tr::eof(), sbumpc()) ? _Tr::eof() : sgetc()); } int_type sputbackc(_E _C) {return (gptr() != 0 && eback() < gptr() && _Tr::eq(_C, gptr()[-1]) ? _Tr::to_int_type(*_Gndec()) : pbackfail(_Tr::to_int_type(_C))); } void stossc() {if (gptr() != 0 && gptr() < egptr()) _Gninc(); else uflow(); } int_type sungetc() {return (gptr() != 0 && eback() < gptr() ? _Tr::to_int_type(*_Gndec()) : pbackfail()); } int_type sputc(_E _C) {return (pptr() != 0 && pptr() < epptr() ? _Tr::to_int_type(*_Pninc() = _C) : overflow(_Tr::to_int_type(_C))); } streamsize sputn(const _E *_S, streamsize _N) {return (xsputn(_S, _N)); } protected: _E *eback() const {return (*_IGbeg); } _E *gptr() const {return (*_IGnext); } _E *pbase() const {return (*_IPbeg); } _E *pptr() const {return (*_IPnext); } _E *egptr() const {return (*_IGnext + *_IGcnt); } void gbump(int _N) {*_IGcnt -= _N; *_IGnext += _N; } void setg(_E *_B, _E *_N, _E *_L) {*_IGbeg = _B, *_IGnext = _N, *_IGcnt = (int) (_L - _N); } _E *epptr() const {return (*_IPnext + *_IPcnt); } _E *_Gndec() {++*_IGcnt; return (--*_IGnext); } _E *_Gninc() {--*_IGcnt; return ((*_IGnext)++); } void pbump(int _N) {*_IPcnt -= _N; *_IPnext += _N; } void setp(_E *_B, _E *_L) {*_IPbeg = _B, *_IPnext = _B, *_IPcnt = (int) (_L - _B); } void setp(_E *_B, _E *_N, _E *_L) {*_IPbeg = _B, *_IPnext = _N, *_IPcnt = (int) (_L - _N); } _E *_Pninc() {--*_IPcnt; return ((*_IPnext)++); } void _Init() {_IGbeg = &_Gbeg, _IPbeg = &_Pbeg; _IGnext = &_Gnext, _IPnext = &_Pnext; _IGcnt = &_Gcnt, _IPcnt = &_Pcnt; setp(0, 0), setg(0, 0, 0); } void _Init(_E **_Gb, _E **_Gn, int *_Gc, _E **_Pb, _E **_Pn, int *_Pc) {_IGbeg = _Gb, _IPbeg = _Pb; _IGnext = _Gn, _IPnext = _Pn; _IGcnt = _Gc, _IPcnt = _Pc; } virtual int_type overflow(int_type = _Tr::eof()) {return (_Tr::eof()); } virtual int_type pbackfail(int_type = _Tr::eof()) {return (_Tr::eof()); } virtual int showmanyc() {return (0); } virtual int_type underflow() {return (_Tr::eof()); } virtual int_type uflow() {return (_Tr::eq_int_type(_Tr::eof(), underflow()) ? _Tr::eof() : _Tr::to_int_type(*_Gninc())); } virtual streamsize xsgetn(_E * _S, streamsize _N) {int_type _C; streamsize _M, _Ns; for (_Ns = 0; 0 < _N; ) if (gptr() != 0 && 0 < (_M = (streamsize) (egptr() - gptr()))) {if (_N < _M) _M = _N; _Tr::copy(_S, gptr(), _M); _S += _M, _Ns += _M, _N -= _M, gbump((int)_M); } else if (_Tr::eq_int_type(_Tr::eof(), _C = uflow())) break; else *_S++ = _Tr::to_char_type(_C), ++_Ns, --_N; return (_Ns); } virtual streamsize xsputn(const _E *_S, streamsize _N) {streamsize _M, _Ns; for (_Ns = 0; 0 < _N; ) if (pptr() != 0 && 0 < (_M = (streamsize) (epptr() - pptr()))) {if (_N < _M) _M = _N; _Tr::copy(pptr(), _S, _M); _S += _M, _Ns += _M, _N -= _M, pbump((int)_M); } else if (_Tr::eq_int_type(_Tr::eof(), overflow(_Tr::to_int_type(*_S)))) break; else ++_S, ++_Ns, --_N; return (_Ns); } virtual pos_type seekoff(off_type, ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out) {return (streampos(_BADOFF)); } virtual pos_type seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out) {return (streampos(_BADOFF)); } virtual _Myt *setbuf(_E *, streamsize) {return (this); } virtual int sync() {return (0); } virtual void imbue(const locale& _Loc) {} private: _E *_Gbeg, *_Pbeg; _E **_IGbeg, **_IPbeg; _E *_Gnext, *_Pnext; _E **_IGnext, **_IPnext; int _Gcnt, _Pcnt; int *_IGcnt, *_IPcnt; locale _Loc; }; #ifdef _DLL #pragma warning(disable:4231) /* the extern before template is a non-standard extension */ extern template class _CRTIMP basic_streambuf >; extern template class _CRTIMP basic_streambuf >; #pragma warning(default:4231) /* restore previous warning */ #endif // _DLL _STD_END #ifdef _MSC_VER #pragma pack(pop) #endif /* _MSC_VER */ #endif /* _STREAMBUF_ */ /* * Copyright (c) 1994 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. */