⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 streamb.cpp

📁 pwlib源码库
💻 CPP
字号:
//// (c) Yuriy Gorvitovskiy// for Openh323, www.Openh323.org//// Windows CE Port//// streambuf implementation//#include <iostream.h>#include <stdlib.h>#ifndef BUFSIZ#define BUFSIZ 512#endif  /* BUFSIZ *//*******************************************************************************/streambuf::streambuf(){    _fAlloc = 0;    _fUnbuf = 0;    x_lastc = EOF;    _base = NULL;    _ebuf = NULL;    _pbase = NULL;    _pptr = NULL;    _epptr = NULL;    _eback = NULL;    _gptr = NULL;    _egptr = NULL;}/*******************************************************************************/streambuf::streambuf( char* pBuf, int cbBuf ){    _fAlloc = 0;    _fUnbuf = 0;    x_lastc = EOF;    _base = pBuf;    _ebuf = pBuf + (unsigned)cbBuf;    _pbase = NULL;    _pptr = NULL;    _epptr = NULL;    _eback = NULL;    _gptr = NULL;    _egptr = NULL;    if( pBuf == NULL || cbBuf == 0 )	{        _fUnbuf = 1;        _base = NULL;        _ebuf = NULL;    }}/*******************************************************************************/streambuf::~streambuf(){    sync();     // make sure buffer empty before possibly destroying it    if( (_fAlloc) && (_base) )        delete _base;}/*******************************************************************************/streambuf * streambuf::setbuf(char * p, int len){    if (!_base)    {        if ((!p) || (!len))            _fUnbuf = 1;        // mark as unbuffered        else        {            _base = p;            _ebuf = p + (unsigned)len;            _fUnbuf = 0;        }        return (this);    }    return((streambuf *)NULL);}/*******************************************************************************/int streambuf::xsputn( const char* pBuf, int cbBuf ){    int cbOut;    for (cbOut = 0; cbBuf--; cbOut++)	{        if ((_fUnbuf) || (_pptr >= _epptr))        {            if (overflow((unsigned char)*pBuf)==EOF)    // 0-extend 0xFF !=EOF                break;        }        else		{            *(_pptr++) = *pBuf;        }        pBuf++;	}    return cbOut;}/*******************************************************************************/int streambuf::xsgetn( char * pBuf, int cbBuf){    int count;    int cbIn = 0;    if (_fUnbuf)    {		if (x_lastc==EOF)			x_lastc=underflow();		while (cbBuf--)        {			if (x_lastc==EOF)				break;			*(pBuf++) = (char)x_lastc;			cbIn++;			x_lastc=underflow();        }    }    else    {	    while (cbBuf)        {			if (underflow()==EOF)       // make sure something to read				break;			count = __min(egptr() - gptr(),cbBuf);			if (count>0)            {				memcpy(pBuf,gptr(),count);				pBuf  += count;				_gptr += count;				cbIn  += count;				cbBuf -= count;            }        }    }    return cbIn;}/*******************************************************************************/int streambuf::sync(){    if ((gptr() <_egptr) || (_pptr > _pbase))	    return EOF;    return 0;}/*******************************************************************************/int streambuf::allocate(){    if ((_fUnbuf) || (_base))        return 0;    	if (doallocate()==EOF) 		return EOF;    return(1);}/*******************************************************************************/int streambuf::doallocate(){    char * tptr;    if (!( tptr = new char[BUFSIZ]))        return(EOF);    setb(tptr, tptr + BUFSIZ, 1);    return(1);}/*******************************************************************************/void streambuf::setb(char * b, char * eb, int a ){    if ((_fAlloc) && (_base))        delete _base;    _base = b;    _fAlloc = a;    _ebuf = eb;}/*******************************************************************************/streampos streambuf::seekoff(streamoff,ios::seek_dir,int){	return EOF;}/*******************************************************************************/streampos streambuf::seekpos(streampos pos,int mode){	return seekoff(streamoff(pos), ios::beg, mode);}/*******************************************************************************/int streambuf::pbackfail(int c){    if (eback()<gptr()) return sputbackc((char)c);    if (seekoff( -1, ios::cur, ios::in)==EOF)  // always EOF for streambufs        return EOF;    if (!unbuffered() && egptr())    {        memmove((gptr()+1),gptr(),(egptr()-(gptr()+1)));        *gptr()=(char)c;    }    return(c);}/*******************************************************************************/int streambuf::sgetc(){    if (_fUnbuf)  // no buffer    {        if (x_lastc==EOF)            x_lastc = underflow();        return x_lastc;    }    else        return underflow();}int streambuf::snextc(){    if (_fUnbuf)	{        if (x_lastc==EOF)            underflow();                // skip 1st character        return x_lastc = underflow();   // return next character, or EOF	}    else	{        if ((!egptr()) || (gptr()>=egptr()))            underflow();                // make sure buffer        if ((++_gptr) < egptr())            return (int)(unsigned char) *gptr();        return underflow();             // returns next character, or EOF   }}int streambuf::sbumpc(){    int c;    if (_fUnbuf) // no buffer    {        if (x_lastc==EOF)        {            c = underflow();        }        else        {            c = x_lastc;            x_lastc = EOF;        }    }    else    {        if( gptr() < egptr() )		{            c = (int)(unsigned char)*(gptr());		}        else		{            c = underflow();		}        _gptr++;	}    return c;}void streambuf::stossc(){	if (_fUnbuf)    {        if (x_lastc==EOF)            underflow();        // throw away current character        else            x_lastc=EOF;        // discard current cached character    }    else    {        if (gptr() >= egptr())            underflow();        if (gptr() < egptr())            _gptr++;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -