Annotation of researchv9/cmd/cfront/libC/stream/stream.h, revision 1.1

1.1     ! root        1: /*
        !             2:        stream.h, the header file for the C++ stream i/o system 4/06/85
        !             3: */
        !             4: #ifndef STREAMH
        !             5: #define STREAMH
        !             6: #include <stdio.h>
        !             7: #ifndef NULL
        !             8: #define NULL   0
        !             9: #endif
        !            10: #ifndef EOF
        !            11: #define        EOF     (-1)
        !            12: #endif
        !            13: #ifndef BUFSIZE
        !            14: #define BUFSIZE 1024
        !            15: #endif
        !            16: 
        !            17: enum state_value { _good=0, _eof=1, _fail=2, _bad=4 };
        !            18: enum open_mode { input=0, output=1, append=2 };
        !            19: 
        !            20: struct streambuf {                     // a buffer for streams
        !            21: 
        !            22:        char*   base;                   // pointer to beginning of buffer
        !            23:        char*   pptr;                   // pointer to next free byte
        !            24:        char*   gptr;                   // pointer to next filled byte
        !            25:        char*   eptr;                   // pointer to first byte following buffer
        !            26:        char    alloc;                  // true if buffer is allocated using "new"
        !            27:        FILE*   fp;                     // for stdio compatibility
        !            28:        
        !            29:        virtual overflow(int c=EOF);    // Empty a buffer.
        !            30:                                        // Return EOF on error
        !            31:                                        //        0 on success
        !            32: 
        !            33:        virtual int underflow();        // Fill a buffer
        !            34:                                        // Return EOF on error or end of input
        !            35:                                        //        next character on success
        !            36:        
        !            37:        inline int sgetc()              // get the current character
        !            38:        {
        !            39:                return (gptr>=pptr) ? underflow() : *gptr&0377;
        !            40:        }
        !            41: 
        !            42:        
        !            43:        inline int snextc()             // get the next character
        !            44:        {
        !            45:                return (gptr>=(pptr-1)) ? underflow() : *++gptr&0377;
        !            46:        }
        !            47: 
        !            48:        inline void stossc()            // advance to the next character
        !            49:        {
        !            50:                if (gptr++ >= pptr)
        !            51:                        underflow();
        !            52:        }
        !            53: 
        !            54:        inline void sputbackc(char c)
        !            55:        /*
        !            56:                Return a character to the buffer (ala lookahead 1).  Since
        !            57:                the user may be "playing games" the character might be 
        !            58:                different than the last one returned by sgetc or snextc.
        !            59:                If the user attempts to put back more characters than have
        !            60:                been extracted, nothing will be put back.
        !            61:                Putting back an EOF is DANGEROUS.
        !            62:        */
        !            63:        {
        !            64:                if (gptr > base) *--gptr = c;
        !            65:        }
        !            66: 
        !            67:        inline int sputc(int c =EOF)    // put a character into the buffer
        !            68:        {
        !            69:                if (fp == 0)
        !            70:                        return (eptr<=pptr) ? overflow(c&0377) : (*pptr++=c&0377);
        !            71:                else
        !            72:                        return putc(c, fp);
        !            73:        }
        !            74: 
        !            75:        
        !            76:        inline streambuf * setbuf(char *p, int len, int count =0)
        !            77:        /*
        !            78:                supply an area for a buffer.
        !            79:                The "count" parameter allows the buffer to start in non-empty.
        !            80:        */
        !            81:        {
        !            82:                base = gptr = p;
        !            83:                pptr = p + count;
        !            84:                eptr = base + len;
        !            85:                return this;
        !            86:        }
        !            87: 
        !            88:        int doallocate();               // allocate some space for the buffer
        !            89:        inline int allocate(){ return base==0 ? doallocate() : 0; }
        !            90: 
        !            91:        streambuf() { base = gptr = pptr = eptr = 0; alloc = 0; fp = 0; }
        !            92:        streambuf(char* p, int l) { setbuf(p,l); alloc = 0; }
        !            93:        ~streambuf() { if (base && alloc) delete base; }
        !            94: };
        !            95: 
        !            96: extern int close(int);
        !            97: 
        !            98: struct filebuf : public streambuf {    // a stream buffer for files
        !            99: 
        !           100:        int     fd;                     // file descriptor
        !           101:        char    opened;                 // non-zero if file has been opened
        !           102: 
        !           103:        int overflow(int c=EOF);        // Empty a buffer.
        !           104:                                        // Return EOF on error
        !           105:                                        //        0 on success
        !           106:        
        !           107:        int underflow();                // Fill a buffer.
        !           108:                                        // Return EOF on error or end of input
        !           109:                                        //        next character on success
        !           110:         
        !           111:        filebuf* open(char *name, open_mode om);        // Open a file
        !           112:                                                        // return 0 if failure
        !           113:                                                        // return "this" if success
        !           114:        int     close() { int i = opened?::close(fd):0; opened=0; return i; }
        !           115: 
        !           116:        filebuf() { opened = 0; fp = 0; }
        !           117:        filebuf(FILE* p) { fp = p; opened = 1; }
        !           118:        filebuf(int nfd) { fd = nfd; opened = 1; }
        !           119:        filebuf(int nfd, char* p, int l) : (p,l) { fd = nfd; opened = 1; }
        !           120:        ~filebuf() { close(); }
        !           121: };
        !           122: 
        !           123: struct circbuf : public streambuf {    // a circular stream buffer
        !           124: 
        !           125:        int overflow(int c=EOF);        // Empty a buffer.
        !           126:                                        // Return EOF on error
        !           127:                                        //        0 on success
        !           128:        
        !           129:        int underflow();                // Fill a buffer.
        !           130:                                        // Return EOF on error or end of input
        !           131:                                        //        next character on success
        !           132:        circbuf() { }
        !           133:        ~circbuf() { }
        !           134: 
        !           135: };
        !           136: 
        !           137: /*
        !           138:  *     This type defines white space.  Any number of whitespace
        !           139:  *     characters can be used to separate two fields in an input
        !           140:  *     stream.  The effect of sending an input stream to a whitespace
        !           141:  *     object is to cause all whitespace in the input stream, up to the
        !           142:  *     next non-whitespace character, to be discarded.  The whitespace
        !           143:  *     characters are space, tab, form feed, and new line.
        !           144:  */
        !           145: struct whitespace { };
        !           146: 
        !           147: /***************************** output: *********************************/
        !           148: 
        !           149: extern char* oct(long, int =0);
        !           150: extern char* dec(long, int =0);
        !           151: extern char* hex(long, int =0);
        !           152: 
        !           153: extern char* chr(int, int =0);         // chr(0) is the empty string ""
        !           154: extern char* str(const char*, int =0);
        !           155: extern char* form(const char* ...);            // printf format
        !           156: 
        !           157: class istream;
        !           158: class common;
        !           159: 
        !           160: class ostream {
        !           161: friend istream;
        !           162: 
        !           163:        streambuf* bp;
        !           164:        short   state;
        !           165: public:
        !           166:        ostream& operator<<(const char*);       // write
        !           167:        ostream& operator<<(int a) { return *this<<long(a); }
        !           168:        ostream& operator<<(long);      // beware: << 'a' writes 97
        !           169:        ostream& operator<<(double);
        !           170:        ostream& operator<<(const streambuf&);
        !           171:        ostream& operator<<(const whitespace&);
        !           172:        ostream& operator<<(const common&);
        !           173: 
        !           174:        ostream& put(char);             // put('a') writes a
        !           175:        ostream& flush() { bp->overflow(); return *this; }
        !           176: 
        !           177: 
        !           178:                operator void*(){ return _eof<state?0:this; }
        !           179:        int     operator!()     { return _eof<state; }
        !           180:        int     eof()           { return state&_eof; }
        !           181:        int     fail()          { return _eof<state; }
        !           182:        int     bad()           { return _fail<state; }
        !           183:        int     good()          { return state==_good; }
        !           184:        void    clear(state_value i =0) { state=i; }
        !           185:        int     rdstate()       { return state; }
        !           186:        char*   bufptr()        { return bp->base; }
        !           187: 
        !           188:                ostream(streambuf* s) { bp = s; state = 0; }
        !           189:                ostream(int fd) { bp = new filebuf(fd); state = 0; }
        !           190:                ostream(int size, char* p)
        !           191:                {
        !           192:                        state = 0;
        !           193:                        bp = new streambuf();
        !           194:                        if (p == 0) p = new char[size];
        !           195:                        bp->setbuf(p, size);
        !           196:                }
        !           197:                ~ostream() { flush(); }
        !           198: };
        !           199: 
        !           200: /***************************** input: ***********************************/
        !           201: 
        !           202: /*
        !           203:        The >> operator reads after skipping initial whitespace
        !           204:        get() reads but does not skip whitespace
        !           205: 
        !           206:        if >> fails     (1) the state of the stream turns non-zero
        !           207:                        (2) the value of the argument does not change
        !           208:                        (3) non-whitespace characters are put back onto the stream
        !           209: 
        !           210:        >> get() fails if the state of the stream is non-zero
        !           211: */
        !           212: 
        !           213: class istream {
        !           214: friend ostream;
        !           215: 
        !           216:        streambuf*      bp;
        !           217:        ostream*        tied_to;
        !           218:        char            skipws;         // if non-null, automaticly skip whitespace
        !           219:        short           state;
        !           220: 
        !           221:        friend void eatwhite (istream&);
        !           222: public:
        !           223:        int      skip(int i) { int ii=skipws; skipws=i; return ii; }
        !           224: 
        !           225:        /*
        !           226:                formatted input: >> skip whitespace
        !           227:        */
        !           228:        istream& operator>>(char*);                     // string
        !           229:        istream& operator>>(char&);                     // single character
        !           230:        istream& operator>>(short&);
        !           231:        istream& operator>>(int&);
        !           232:        istream& operator>>(long&);
        !           233:        istream& operator>>(float&);
        !           234:        istream& operator>>(double&);
        !           235:        istream& operator>>(streambuf&);
        !           236:        istream& operator>>(whitespace&);               // skip whitespace
        !           237:        istream& operator>>(common&);
        !           238: 
        !           239:        /*
        !           240:                raw input: get's do not skip whitespace
        !           241:        */
        !           242:        istream& get(char*, int, char ='\n');           // string
        !           243:        istream& get(streambuf& sb, char ='\n');
        !           244:        istream& get(char& c)                           // single character
        !           245:        {
        !           246:                int os = skipws;
        !           247:                skipws = 0;
        !           248:                *this >> c;
        !           249:                skipws = os;
        !           250:                return *this;
        !           251:        }
        !           252: 
        !           253:        istream& putback(char c);
        !           254:        ostream* tie(ostream* s) { ostream* t = tied_to; tied_to = s; return t; }
        !           255: 
        !           256:                operator void*(){ return _eof<state?0:this; }
        !           257:        int     operator!()     { return _eof<state; }
        !           258:        int     eof()           { return state&_eof; }
        !           259:        int     fail()          { return _eof<state; }
        !           260:        int     bad()           { return _fail<state; }
        !           261:        int     good()          { return state==_good; }
        !           262:        void    clear(state_value i =0) { state=i; }
        !           263:        int     rdstate()       { return state; }
        !           264:        char*   bufptr()        { return bp->base; }    
        !           265: 
        !           266:                istream(streambuf* s, int sk =1, ostream* t =0) // bind to buffer
        !           267:                {
        !           268:                        state = 0;
        !           269:                        skipws = sk;
        !           270:                        tied_to = t;
        !           271:                        bp = s;
        !           272:                }
        !           273: 
        !           274:                istream(int size, char* p, int sk =1)           // bind to string
        !           275:                {
        !           276:                        state = 0;
        !           277:                        skipws = sk;
        !           278:                        tied_to = 0;
        !           279:                        bp = new streambuf();
        !           280:                        if (p == 0) p = new char[size];
        !           281:                        bp->setbuf(p, size, size);
        !           282:                }
        !           283: 
        !           284:                istream(int fd, int sk =1, ostream* t =0)       // bind to file
        !           285:                {
        !           286:                        state = 0;
        !           287:                        skipws = sk;
        !           288:                        tied_to = t;
        !           289:                        bp = new filebuf(fd);
        !           290:                }
        !           291: };
        !           292: 
        !           293: 
        !           294: extern istream cin;    // standard input predefined
        !           295: extern ostream cout;   // standard output
        !           296: extern ostream cerr;   // error output
        !           297: 
        !           298: extern whitespace WS;  // predefined white space
        !           299: 
        !           300: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.