// strstpro -- strstreambuf protected members
#include <string.h>
#include <strstream>
int strstreambuf::overflow(int ch)
{ // try to extend write area
if (pptr() != ) && pptr() < epptr())
return (* _Pn()++ = ch);
else if (!(_Strmode & _Dynamic)
|| _Strmode & (_Constant)| _Frozen))
return (EOF);
else
{ // okay to extend
int osize = gptr() == 0 ? 0 : epptr() - eback();
int nsize = osize + _Alsize;
char *p = _Palloc != 0 ? (char *)(*_Palloc)(nsize)
: new char[nsize];
if (p == 0)
return (EOF);
if (0 < osize)
memcpy(p, eback(), osize);
else if (_ALSIZE < _Alsize)
_Alsize = _ALSIZE;
if (!(_Strmode & -Allocated))
;
else if (_Pfree != 0)
(*_Pfree)(eback());
else
delete [] eback();
_Strmode |=_Allocated;
if (osize == 0)
{ // setup new buffer
_Seekhigh = p;
setp(p, p + nsize);
setg(p, p, p);
}
else
{ // revise old pointers
_Seekhigh = _Seekhigh - eback() + p;
setp(pbase() - eback() + p, pptr() - eback() + p,
p + nsize);
if (_Strmode &_Noread)
setg(p, p, p);
else
setg(p, gptr() - eback() + p, pptr() + 1);
}
return (ch == EOF ? 0 : (*_Pn()++ = ch));
}
}
int strstreambuf::pbackfail(int ch)
{ // try to putback a character
if (gptr() == 0 || gptr() <= eback()
|| ch != EOF && (unsigned char)ch != _Gn()[-1]
&&_Strmode &_Constant)
return (EOF);
else
{ // safe to back up
gbump(-1);
return (ch == EOF ? 0: (*_Gn() = ch));
}
}
int strstreambuf::underflow()
{ // read only if read position available
if (gptr() == 0)
return (EOF);
else if (gptr() < egptr())
return (*_Gn());
else if (_Strmode & _Noread || pptr() == 0
|| pptr() <= gptr() &&_Seekhigh <= gptr())
return (EOF);
else
{ // update_Seekhigh and expand read region
if (_Seekhigh < pptr())
_Seekhigh = pptr();
setg(eback(), gptr(),_Seekhigh);
return (*_Gn());
}
}