📄 ostream.cpp
字号:
//// (c) 2000 Yuri Kiryanov, openh323@kiryanov.com// and Yuriy Gorvitovskiy//// Windows CE port of OpenH323 Open Source Project, www.openh323.org// PWLib extras#include <iostream.h>#include <ptlib.h>#ifdef WCE_NO_EXTERNAL_STREAMSostream_withassign cerr;ostream_withassign cout;ostream_withassign clog;static Iostream_init __InitCerr(cerr,1);static Iostream_init __InitCout(cout,-1);PStringStream cerr;PStringStream cout;PStringStream clog;#endif // WCE_NO_EXTERNAL_STREAMS/*******************************************************************************/ostream::ostream(){ x_floatused = 0;}/*******************************************************************************/ostream::ostream(streambuf* _inistbf){ init(_inistbf); x_floatused = 0;}/*******************************************************************************/ostream::ostream(const ostream& _ostrm){ init(_ostrm.rdbuf()); x_floatused = 0;}/*******************************************************************************/ostream::~ostream(){}/*******************************************************************************/int ostream::opfx(){ lock(); if (state) { state |= ios::failbit; unlock(); return 0; } if (x_tie) { x_tie->flush(); } lockbuf(); return(1); // return non-zero}/*******************************************************************************/void ostream::osfx(){ x_width = 0; if (x_flags & unitbuf) { if (bp->sync()==EOF) state = failbit | badbit; } if (x_flags & ios::stdio) { if (fflush(stdout)==EOF) state |= failbit; if (fflush(stderr)==EOF) state |= failbit; } unlockbuf(); unlock();}/*******************************************************************************/ostream& ostream::operator<<(const char * s){ if (opfx()) { writepad("",s); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::flush(){ lock(); lockbuf(); if (bp && bp->sync()==EOF) state |= ios::failbit; unlockbuf(); unlock(); return(*this);}/*******************************************************************************/ostream& ostream::operator=(streambuf * _sbuf){ if (delbuf() && rdbuf()) delete rdbuf(); bp = 0; this->ios::operator=(ios()); // initialize ios members delbuf(0); // important! init(_sbuf); return *this;}/*******************************************************************************/ostream& ostream::writepad(const char * leader, const char * value){ unsigned int len, leadlen; long padlen; leadlen = strlen(leader); len = strlen(value); padlen = (((unsigned)x_width) > (len+leadlen)) ? ((unsigned)x_width) - (len + leadlen) : 0; if (!(x_flags & (left|internal))) // default is right-adjustment { while (padlen-- >0) { if (bp->sputc((unsigned char)x_fill)==EOF) state |= (ios::failbit|ios::badbit); } } if (leadlen) { if ((unsigned)bp->sputn(leader,leadlen)!=leadlen) state |= (failbit|badbit); } if (x_flags & internal) { while (padlen-- >0) { if (bp->sputc((unsigned char)x_fill)==EOF) state |= (ios::failbit|ios::badbit); } } if ((unsigned)bp->sputn(value,len)!=len) state |= (failbit|badbit); if (x_flags & left) { while ((padlen--)>0) // left-adjust if necessary { if (bp->sputc((unsigned char)x_fill)==EOF) state |= (ios::failbit|ios::badbit); } } return (*this);}/*******************************************************************************/ostream& ostream::seekp(streampos _strmp){ lockbuf(); if (bp->seekpos(_strmp, ios::out)==EOF) clear(state | failbit); unlockbuf(); return(*this);}/*******************************************************************************/ostream& ostream::seekp(streamoff _strmf, seek_dir _sd){ lockbuf(); if (bp->seekoff(_strmf, _sd, ios::out)==EOF) clear(state | failbit); unlockbuf(); return(*this);}/*******************************************************************************/streampos ostream::tellp(){ streampos retval; lockbuf(); if ((retval=bp->seekoff(streamoff(0), ios::cur, ios::out))==EOF) clear(state | failbit); unlockbuf(); return(retval);}/*******************************************************************************/ostream& ostream::put(unsigned char c){ if (opfx()) { if (bp->sputc((int)c)==EOF) state |= (failbit|badbit); osfx(); } return(*this);}/*******************************************************************************/ostream& ostream::write(const char * s, int n){ if (opfx()) {// Note: 'n' treated as unsigned if (bp->sputn(s,n)!=n) state |= (failbit|badbit); osfx(); } return(*this);}/*******************************************************************************/ostream& ostream::operator<<(streambuf * instm){ int c; if (opfx()) { while ((c=instm->sbumpc())!=EOF) if (bp->sputc(c) == EOF) { state |= failbit; break; } osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(unsigned char c){ if (opfx()) { if (x_width) { char outc[2]; outc[0] = c; outc[1] = '\0'; writepad("",outc); } else if (bp->sputc(c)==EOF) { if (bp->overflow(c)==EOF) state |= (badbit|failbit); // fatal error? } osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(short n){ char obuffer[8]; // assumes max int is 65535 char fmt[4] = "%hd"; char leader[4] = "\0\0"; if (opfx()) { if (n) { if (x_flags & (hex|oct)) { if (x_flags & hex) { if (x_flags & uppercase) fmt[2] = 'X'; else fmt[2] = 'x'; leader[1] = fmt[2]; // 0x or 0X (or \0X) } else fmt[2] = 'o'; if (x_flags & showbase) leader[0] = '0'; } else if ((n>0) && (x_flags & showpos)) { leader[0] = '+'; } } sprintf(obuffer,fmt,n); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(unsigned short n){ char obuffer[8]; char fmt[4] = "%hu"; char leader[4] = "\0\0"; if (opfx()) { if (n) { if (x_flags & (hex|oct)) { if (x_flags & hex) { if (x_flags & uppercase) fmt[2] = 'X'; else fmt[2] = 'x'; leader[1] = fmt[2]; // 0x or 0X (or \0X) } else fmt[2] = 'o'; if (x_flags & showbase) leader[0] = '0'; } else if (x_flags & showpos) { leader[0] = '+'; } } sprintf(obuffer,fmt,n); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(long n){ char obuffer[12]; char fmt[4] = "%ld"; char leader[4] = "\0\0"; if (opfx()) { if (n) { if (x_flags & (hex|oct)) { if (x_flags & hex) { if (x_flags & uppercase) fmt[2] = 'X'; else fmt[2] = 'x'; leader[1] = fmt[2]; // 0x or 0X (or \0X) } else fmt[2] = 'o'; if (x_flags & showbase) leader[0] = '0'; } else if ((n>0) && (x_flags & showpos)) { leader[0] = '+'; } } sprintf(obuffer,fmt,n); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(unsigned long n){ char obuffer[12]; char fmt[4] = "%lu"; char leader[4] = "\0\0"; if (opfx()) { if (n) { if (x_flags & (hex|oct)) { if (x_flags & hex) { if (x_flags & uppercase) fmt[2] = 'X'; else fmt[2] = 'x'; leader[1] = fmt[2]; // 0x or 0X (or \0X) } else fmt[2] = 'o'; if (x_flags & showbase) leader[0] = '0'; } else if (x_flags & showpos) { leader[0] = '+'; } } sprintf(obuffer,fmt,n); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(int n){ char obuffer[12]; char fmt[4] = "%d"; char leader[4] = "\0\0"; if (opfx()) { if (n) { if (x_flags & (hex|oct)) { if (x_flags & hex) { if (x_flags & uppercase) fmt[1] = 'X'; else fmt[1] = 'x'; leader[1] = fmt[1]; // 0x or 0X (or \0X) } else fmt[1] = 'o'; if (x_flags & showbase) leader[0] = '0'; } else if ((n>0) && (x_flags & showpos)) { leader[0] = '+'; } } sprintf(obuffer,fmt,n); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(unsigned int n){ char obuffer[12]; char fmt[4] = "%u"; char leader[4] = "\0\0"; if (opfx()) { if (n) { if (x_flags & (hex|oct)) { if (x_flags & hex) { if (x_flags & uppercase) fmt[1] = 'X'; else fmt[1] = 'x'; leader[1] = fmt[1]; // 0x or 0X (or \0X) } else fmt[1] = 'o'; if (x_flags & showbase) leader[0] = '0'; } else if (x_flags & showpos) { leader[0] = '+'; } } sprintf(obuffer,fmt,n); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(double f){ char obuffer[24]; char fmt[8]; char leader[4]; char * optr = obuffer; int x = 0; // x_floatused nonzero indicates called for float, not double unsigned int curprecision = (x_floatused) ? FLT_DIG : DBL_DIG; x_floatused = 0; // reset for next call curprecision = __min((unsigned)x_precision,curprecision); if (opfx()) { if (x_flags & ios::showpos) leader[x++] = '+'; if (x_flags & ios::showpoint) leader[x++] = '#'; // show decimal and trailing zeros leader[x] = '\0'; x = sprintf(fmt,"%%%s.%.0ug",leader,curprecision) - 1; if ((x_flags & ios::floatfield)==ios::fixed) fmt[x] = 'f'; else { if ((x_flags & ios::floatfield)==ios::scientific) fmt[x] = 'e'; if (x_flags & uppercase) fmt[x] = (char)toupper(fmt[x]); } sprintf(optr,fmt,f); x = 0; if (*optr=='+' || *optr=='-') leader[x++] = *(optr++); leader[x] = '\0'; writepad(leader,optr); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(long double f){ char obuffer[28]; char fmt[12]; char leader[4]; char * optr = obuffer; int x = 0; unsigned int curprecision = __min((unsigned)x_precision,LDBL_DIG); if (opfx()) { if (x_flags & ios::showpos) leader[x++] = '+'; if (x_flags & ios::showpoint) leader[x++] = '#'; // show decimal and trailing zeros leader[x] = '\0'; x = sprintf(fmt,"%%%s.%.0uLg",leader,curprecision) - 1; if ((x_flags & ios::floatfield)==ios::fixed) fmt[x] = 'f'; else { if ((x_flags & ios::floatfield)==ios::scientific) fmt[x] = 'e'; if (x_flags & uppercase) fmt[x] = (char)toupper(fmt[x]); } sprintf(optr,fmt,f); x = 0; if (*optr=='+' || *optr=='-') leader[x++] = *(optr++); leader[x] = '\0'; writepad(leader,optr); osfx(); } return *this;}/*******************************************************************************/ostream& ostream::operator<<(const void * ptr){ char obuffer[12]; char fmt[4] = "%p"; char leader[4] = "0x"; if (opfx()) { if (ptr) { if (x_flags & uppercase) leader[1] = 'X'; } sprintf(obuffer,fmt,ptr); writepad(leader,obuffer); osfx(); } return *this;}/*******************************************************************************/ostream_withassign::ostream_withassign() : ostream(){}/*******************************************************************************/ostream_withassign::ostream_withassign(streambuf* _os) : ostream(_os){}/*******************************************************************************/ostream_withassign::~ostream_withassign(){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -