You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.1 KiB
205 lines
6.1 KiB
// streambuf standard header
|
|
#ifndef _STREAMBUF_
|
|
#define _STREAMBUF_
|
|
#include <xlocnum>
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma pack(push,8)
|
|
#endif /* _MSC_VER */
|
|
_STD_BEGIN
|
|
// TEMPLATE CLASS basic_streambuf
|
|
template<class _E, class _Tr /* = char_traits<_E> */ >
|
|
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 typename _Tr::int_type int_type;
|
|
typedef typename _Tr::pos_type pos_type;
|
|
typedef typename _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)
|
|
{(void)_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<char, char_traits<char> >;
|
|
extern template class _CRTIMP basic_streambuf<wchar_t, char_traits<wchar_t> >;
|
|
#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.
|
|
*/
|