/* Release 3.10 */ /*-------------------------------------------------------------------------* * * * STREAM.HPP - header file for AT&T v1.2 stream input and output. * * * * COPYRIGHT (C) 1990..1992 Clarion Software Corporation * * All Rights Reserved * * * *--------------------------------------------------------------------------*/ #include #ifndef __STREAM_INC_ #define __STREAM_INC_ #include #pragma save #pragma name(prefix=>"__o__") struct whitespace { char x; }; extern struct whitespace WS; class istream; class ostream; class streambuf { friend istream; friend ostream; protected: FILE *file; char *base; char *pptr; char *gptr; char *eptr; int didalloc; virtual int overflow(int = EOF ); virtual int underflow(); int allocate(); streambuf * setbuf(char *, int , unsigned = 0); virtual void terminate(); public: streambuf() { file=0; didalloc=0; base=pptr=gptr=eptr=NULL; } streambuf(char *buf, int len) { file=0; didalloc=0; setbuf(buf, len); } virtual ~streambuf(); virtual int snextc(); virtual int sputc(int); virtual void sputbackc(char); }; enum open_mode { input, output, append }; class filebuf : public streambuf { private: int fd; int isopen; protected: void terminate(); public: filebuf() { isopen=0; fd=0; } filebuf(FILE *); filebuf(int); filebuf(int, char *, int); ~filebuf() { close(); } filebuf* open(char *, int); int close(); int snextc() { return ::fgetc(file); } int sputc(int _c) { return ::fputc(_c, file); } void sputbackc(char _c) { (void) :: ungetc(_c, file); } }; char *dec(long, int = 0); char *hex(long, int = 0); char *oct(long, int = 0); char *chr(int, int = 0); char *str(const char *, int = 0); char *form(char *, ...); enum stream_state { _good=0, _eof=1, _fail=2, _bad=4 }; class ostream { friend istream; private: streambuf* stream; char mystream; char state; public: ostream(streambuf *); ostream(int); ostream(int, char *); ~ostream() { (void) flush(); if(mystream) delete stream; } operator void*() { return (state == _good) ? this : NULL; } int operator !() { return (state != _good); } ostream& operator <<(int); ostream& operator <<(long); ostream& operator <<(unsigned int _U) { return *this << ((long) _U); } ostream& operator <<(unsigned long); ostream& operator <<(const char *); ostream& operator <<(double); ostream& operator <<(long double); ostream& put(char _c) { if(stream->sputc(_c) == EOF) state = _fail; return *this; } ostream& flush(); int rdstate() { return state; } void clear(int _s = _good) { state = _s; } int bad() { return (state & _bad); } int fail() { return (state & _fail); } int eof() { return (state & _eof); } int good() { return (state == _good); } }; class istream { friend void eatwhite(istream& _s) {_s >> WS; } private: ostream* tied_to; streambuf* stream; char skipping; char mystream; int state; long getlong(int); long double getreal(); public: istream(streambuf*, int = 1, ostream* = NULL); istream(int, char*, int = 1); istream(int, int = 1, ostream* = NULL); ~istream() { if(mystream) delete stream; } operator void*() { return (state == _good) ? this : NULL; } int operator !() { return (state != _good); } istream& operator >> (signed char& _c) { unsigned char _x; *this >> _x; if(state == _good) _c=(signed char) _x; return *this; } istream& operator >> ( char& _c) { unsigned char _x; *this >> _x; if(state == _good) _c=(char) _x; return *this; } istream& operator >> (short& _s){ short _x= (short) getlong(0); if(state == _good) _s=_x; return *this; } istream& operator >> (int& _i) { int _x= (int) getlong(0); if(state == _good) _i=_x; return *this; } istream& operator >> (long& _l){ long _x= getlong(0); if(state == _good) _l=_x; return *this; } istream& operator >> (unsigned char& _c); istream& operator >> (unsigned short& _s){ unsigned short _x= (unsigned short) getlong(0); if(state == _good) _s=_x; return *this; } istream& operator >> (unsigned int& _i){ unsigned int _x= (unsigned int) getlong(0); if(state == _good) _i=_x; return *this; } istream& operator >> (unsigned long& _l){ unsigned long _x= (unsigned long) getlong(0); if(state == _good) _l=_x; return *this; } istream& operator >>(float&); istream& operator >>(double&); istream& operator >>(long double&); istream& operator >>(char *); istream& operator >>(whitespace&); istream& get(char&); istream& get(char*, int, int = '\n'); int skip(int _s) { short _t = skipping; skipping = _s; return _t; } ostream * tie( ostream *_to ) { ostream *_t = tied_to; tied_to = _to; return _t; } void putback(char _c) { stream->sputbackc(_c); }; int rdstate() { return state; } void clear(int _s = _good) { state = _s; } int bad() { return (state & _bad); } int fail() { return (state & _fail); } int eof() { return (state & _eof); } int good() { return (state == _good); } }; extern istream cin; extern ostream cout; extern ostream cerr; #pragma restore #endif