/*ident "@(#)cls4:lib/stream/stream.c 1.4" */ /******************************************************************************* C++ source for the C++ Language System, Release 3.0. This product is a new release of the original cfront developed in the computer science research center of AT&T Bell Laboratories. Copyright (c) 1993 UNIX System Laboratories, Inc. Copyright (c) 1991, 1992 AT&T and UNIX System Laboratories, Inc. Copyright (c) 1984, 1989, 1990 AT&T. All Rights Reserved. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX System Laboratories, Inc. The copyright notice above does not evidence any actual or intended publication of such source code. *******************************************************************************/ #include void (*ios::stdioflush)() = 0 ; long ios::nextbit = 1L<<16 ; long ios::nextword = 0 ; const long ios::adjustfield = ios::left|ios::right|ios::internal ; const long ios::floatfield = ios::fixed|ios::scientific ; const long ios::basefield = ios::dec|ios::hex|ios::oct ; #define ISTREAM istream #define OSTREAM ostream #define IOSTREAM iostream union ios_user_union { long i ; void* p ; } ; void ios::init(streambuf* b) { // Must be called by other constructors. */ /* initialize private members */ nuser = 0 ; x_user = 0 ; /* initialize protected members */ bp = b ; state = 0 ; ispecial = 0 ; ospecial = 0 ; isfx_special = 0 ; osfx_special = 0 ; delbuf = 0 ; x_tie = 0 ; x_flags = 0 ; x_precision = 6 ; x_fill = ' ' ; x_width = 0 ; if (!bp) setstate(hardfail|failbit) ; flags(skipws|ios::basefield) ; tie(0) ; } ios::ios(streambuf* b) { init(b) ; } ios::~ios() { if (bp) bp->sync() ; if (delbuf) { delete bp ; bp = 0 ; } if (x_user) { delete x_user ; x_user = 0 ; } } iostream::iostream(streambuf* b) { init(b) ; } iostream::~iostream() { } istream::istream(streambuf* b) { init(b) ; } istream::~istream() { } ostream::ostream(streambuf* b) { init(b) ; } ostream::~ostream() { } IOSTREAM::IOSTREAM() { } ISTREAM::ISTREAM() { } OSTREAM::OSTREAM() { } ostream& OSTREAM::flush() { if ( !opfx() ) return *this ; if ( bp->out_waiting() ) { if ( bp->overflow() == EOF ) setstate(ios::badbit) ; } else if ( bp->in_avail() ) { if ( bp->sync() == EOF ) setstate(ios::badbit) ; } return *this ; } streampos OSTREAM::tellp() { return bp->seekoff(0,cur,out) ; } streampos ISTREAM::tellg() { return bp->seekoff(0,cur,in) ; } ostream& OSTREAM::seekp(streampos p) { if ( bp->seekpos(p,out) == EOF ) setstate(badbit) ; return *this ; } typedef ios::seek_dir Sdir ; /** Gets around a bug in release 2.0 beta 5 **/ ostream& OSTREAM::seekp(streamoff o, Sdir d) { if ( bp->seekoff(o,d,out) == EOF ) setstate(badbit) ; return *this ; } istream& ISTREAM::seekg(streampos p) { if ( bp->seekpos(p,in) == EOF ) setstate(badbit) ; else clear(rdstate()&~(eofbit|badbit)); return *this ; } istream& ISTREAM::seekg(streamoff o, Sdir d) { if ( bp->seekoff(o,d,in) == EOF ) setstate(badbit) ; else clear(rdstate()&~(eofbit|badbit)); return *this ; } ostream* ios::tie(ostream* s) { ostream* t = x_tie ; x_tie = s ; if ( s ) { ispecial |= tied ; ospecial |= tied ; } else { ispecial &= ~tied ; ospecial &= ~tied ; } return t ; } char ios::fill(char c) { char oldf = x_fill ; x_fill = c ; return oldf ; } int ios::precision(int p) { register int oldp = x_precision ; x_precision = p; return oldp ; } long ios::setf(long b, long f) { long oldf = x_flags ; x_flags = (b&f) | (x_flags&~f) ; if (x_flags&skipws ) ispecial |= skipping ; else ispecial &= ~skipping ; osfx_special = (x_flags&(unitbuf|stdio)) != 0 ; return oldf ; } long ios::setf(long b) { long oldf = x_flags ; x_flags |= b ; if (x_flags&skipws ) ispecial |= skipping ; else ispecial &= ~skipping ; osfx_special = (x_flags&(unitbuf|stdio)) != 0 ; return oldf ; } long ios::unsetf(long b) { long oldf = x_flags ; x_flags &= ~b ; if (x_flags&skipws ) ispecial |= skipping ; else ispecial &= ~skipping ; osfx_special = (x_flags&(unitbuf|stdio)) != 0 ; return oldf ; } long ios::flags(long f) { long oldf = x_flags ; x_flags = f ; if (x_flags&skipws ) ispecial |= skipping ; else ispecial &= ~skipping ; osfx_special = (x_flags&(unitbuf|stdio)) != 0 ; return oldf ; } int ISTREAM::do_ipfx(int noskipws) { if ( state&hardfail) return 0 ; // note that we flush tied stream even when !this->good(). if ( x_tie && x_tie->rdbuf()->out_waiting() && (noskipws==0 || rdbuf()->in_avail()flush() ; } if ( good() && !noskipws && (ispecial&skipping) ) eatwhite() ; if ( eof() ) { // if we were only skipping this wouldn't be a failure. // but the presumption is that this is a prefix operation // prior to inputting something else. setstate(ios::failbit) ; return 0 ; } return good() ; } int OSTREAM::do_opfx() { if ( state&hardfail) return 0 ; if ( x_tie && x_tie->rdbuf()->out_waiting()) { x_tie->flush() ; } return good() ; } void OSTREAM::do_osfx() { if ( (x_flags & stdio) && stdioflush ) { (*stdioflush)() ; } if ( x_flags & unitbuf ) flush() ; } void ios::operator=(ios& rhs) { bp = rhs.bp ; } ios::ios() { assign_private = state ; state = hardfail ; } istream_withassign::istream_withassign() { // In order for the standard streams to be properly initialized // it is essential that nothing is done by the combination // of this constructor and ios::ios(). So we undo the effect of // ios::ios() state = assign_private ; } istream_withassign::~istream_withassign() { } istream_withassign& istream_withassign::operator=(istream& s) { init(s.rdbuf()) ; return *this ; } ostream_withassign::~ostream_withassign() { } istream_withassign& istream_withassign::operator=(streambuf* sb) { init(sb) ; return *this ; } ostream_withassign::ostream_withassign() { // In order for the standard streams to be properly initialized // it is essential that nothing is done by the combination // of this constructor and ios::ios(). So we undo the effect of // ios::ios() state = assign_private ; } ostream_withassign& ostream_withassign::operator=(ostream& s) { init(s.rdbuf()) ; return *this ; } ostream_withassign& ostream_withassign::operator=(streambuf* sb) { init(sb) ; return *this ; } iostream_withassign::iostream_withassign() { // In order for the standard streams to be properly initialized // it is essential that nothing is done by the combination // of this constructor and ios::ios(). So we undo the effect of // ios::ios() state = assign_private ; } iostream_withassign::~iostream_withassign() { } iostream_withassign& iostream_withassign::operator=(ios& s) { init(s.rdbuf()) ; return *this ; } iostream_withassign& iostream_withassign::operator=(streambuf* sb) { init(sb) ; return *this ; } void ios::uresize(int n) { if ( n < nuser ) return ; ios_user_union* newu = new ios_user_union[n+1] ; for ( int x = 0 ; x < nuser ; ++x ) { newu[x] = x_user[x] ; } ; delete [] x_user ; nuser = n+1 ; x_user = newu ; } long & ios::iword(int x) { if ( x < 0 ) x = 0 ; if ( x >= nuser ) uresize(x) ; return x_user[x].i ; } void* & ios::pword(int x) { if ( x < 0 ) x = 0 ; if ( x >= nuser ) uresize(x) ; return x_user[x].p ; } long ios::bitalloc() { long w = nextbit ; nextbit = nextbit << 1 ; return w ; } int ios::xalloc() { return nextword++ ; }