Annotation of researchv10dc/cmd/cfront/libC/iostream/iostream.h, revision 1.1

1.1     ! root        1: /*ident        "@(#)ctrans:incl/iostream.h     1.1.5.2" */
        !             2: /**************************************************************************
        !             3:                         Copyright (c) 1984 AT&T
        !             4:                           All Rights Reserved   
        !             5: 
        !             6:         THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
        !             7:       
        !             8:         The copyright notice above does not evidence any        
        !             9:         actual or intended publication of such source code.
        !            10: 
        !            11: *****************************************************************************/
        !            12: #ifndef IOSTREAMH
        !            13: #define IOSTREAMH
        !            14: 
        !            15: #include <memory.h>
        !            16:                /* Some inlines use memcpy */
        !            17: 
        !            18: /* If EOF is defined already verify that it is -1.  Otherwise
        !            19:  * define it.
        !            20:  */
        !            21: 
        !            22: #ifdef EOF
        !            23: #      if EOF!=-1
        !            24: #              define EOF (-1) 
        !            25: #      endif
        !            26: #else
        !            27: #      define EOF (-1)
        !            28: #endif
        !            29: 
        !            30: /* Don't worry about NULL not being 0 */
        !            31: #ifndef NULL
        !            32: #      define NULL 0
        !            33: #endif
        !            34: 
        !            35: #define        zapeof(c) ((c)&0377)
        !            36:            /* extracts char from c. The critical requirement is
        !            37:             *      zapeof(EOF)!=EOF
        !            38:             * ((c)&0377) and ((unsigned char)(c)) are alternative definitions
        !            39:             * whose efficiency depends on compiler environment.
        !            40:             */
        !            41: 
        !            42: typedef long streampos ;
        !            43: typedef long streamoff ;
        !            44: 
        !            45: class streambuf ;
        !            46: class ostream ;
        !            47: 
        !            48: 
        !            49: class ios {
        !            50: public: /* Some enums are declared in ios to avoid pollution of
        !            51:         * global namespace
        !            52:         */
        !            53:        enum io_state   { goodbit=0, eofbit=1, failbit=2, badbit=4, 
        !            54:                                hardfail=0200};
        !            55:                                /* hard fail can be set and reset internally,
        !            56:                                 * but not via public function */
        !            57:        enum open_mode  { in=1, out=2, ate=4, app=010, trunc=020,
        !            58:                                nocreate=040, noreplace=0100} ;
        !            59:        enum seek_dir   { beg=0, cur=1, end=2 } ;
        !            60: 
        !            61:        /* flags for controlling format */
        !            62:        enum            { skipws=01,    
        !            63:                                        /* skip whitespace on input */
        !            64:                          left=02,  right=04, internal=010,
        !            65:                                        /* padding location */
        !            66:                          dec=020, oct=040, hex=0100, 
        !            67:                                        /* conversion base */
        !            68:                          showbase=0200, showpoint=0400, uppercase=01000,
        !            69:                          showpos=02000, 
        !            70:                                        /* modifiers */
        !            71:                          scientific=04000, fixed=010000,
        !            72:                                        /* floating point notation */
        !            73:                          unitbuf=020000, stdio=040000
        !            74:                                        /* stuff to control flushing */
        !            75:                          } ;
        !            76:        static const long 
        !            77:                        basefield ; /* dec|oct|hex */
        !            78:        static const long
        !            79:                        adjustfield ; /* left|right|internal */
        !            80:        static const long
        !            81:                        floatfield ; /* scientific|fixed */
        !            82: public:
        !            83:                        ios(streambuf*) ;
        !            84:        virtual         ~ios() ;
        !            85: 
        !            86:        long            flags()         { return x_flags ; }
        !            87:        long            flags(long f);
        !            88: 
        !            89:        long            setf(long setbits, long field);
        !            90:        long            setf(long) ;
        !            91:        long            unsetf(long) ;
        !            92: 
        !            93:        int             width()         { return x_width ; }
        !            94:        int             width(int w)
        !            95:        {
        !            96:                        int i = x_width ; x_width = w ; return i ;
        !            97:        }
        !            98:                
        !            99:        ostream*        tie(ostream* s); 
        !           100:        ostream*        tie()           { return x_tie ; }
        !           101:        char            fill(char) ;
        !           102:        char            fill()          { return x_fill ; }
        !           103:        int             precision(int) ;
        !           104:        int             precision()     { return x_precision ; }
        !           105: 
        !           106:        int             rdstate()       { return state ; }
        !           107:                        operator void*()
        !           108:                                {
        !           109:                                if (state&(failbit|badbit|hardfail)) return 0 ;
        !           110:                                else return this ;
        !           111:                                }
        !           112: 
        !           113:        int             operator!()
        !           114:                                { return state&(failbit|badbit|hardfail); } 
        !           115:        int             eof()   { return state&eofbit; }
        !           116:        int             fail()  { return state&(failbit|badbit|hardfail); }
        !           117:        int             bad()   { return state&badbit ; }
        !           118:        int             good()  { return state==0 ; }
        !           119:        void            clear(int i =0) 
        !           120:                                {       
        !           121:                                state =  (i&0377) | (state&hardfail) ;
        !           122:                                ispecial = (ispecial&~0377) | state ; 
        !           123:                                ospecial = (ospecial&~0377) | state ; 
        !           124:                                }
        !           125:        streambuf*      rdbuf() { return bp ;} 
        !           126: 
        !           127: public: /* Members related to user allocated bits and words */
        !           128:        long &          iword(int) ;
        !           129:        void* &         pword(int) ;
        !           130:        static long     bitalloc() ;
        !           131:        static long     xalloc() ;
        !           132: 
        !           133: private: /*** privates for implemting allocated bits and words */ 
        !           134:        static long     nextbit ;
        !           135:        static long     nextword ;
        !           136:        
        !           137:        int             nuser ;
        !           138:        union ios_user_union*
        !           139:                        x_user ;
        !           140:        void    uresize(int) ;
        !           141: public: /* static member functions */
        !           142:        static void     sync_with_stdio() ;
        !           143: protected:
        !           144:        enum            { skipping=01000, tied=02000 } ;
        !           145:                        /*** bits 0377 are reserved for userbits ***/
        !           146:        streambuf*      bp;
        !           147:        void            setstate(int b)
        !           148:                        {       state |= (b&0377) ;
        !           149:                                ispecial |= b&~skipping ;
        !           150:                                ispecial |= b ;
        !           151:                        }
        !           152:        int             state;  
        !           153:        int             ispecial;               
        !           154:        int             ospecial;
        !           155:        int             isfx_special;
        !           156:        int             osfx_special;           
        !           157:        int             delbuf;
        !           158:        ostream*        x_tie;
        !           159:        long            x_flags;
        !           160:        short           x_precision;
        !           161:        char            x_fill;
        !           162:        short           x_width;
        !           163: 
        !           164:        static void     (*stdioflush)() ;
        !           165: 
        !           166:        void            init(streambuf*) ;
        !           167:                                /* Does the real work of a constructor */
        !           168:                        ios() ; /* No initialization at all. Needed by
        !           169:                                 * multiple inheritance versions */
        !           170:        int             assign_private ;
        !           171:                                /* needed by with_assgn classes */
        !           172: private:               
        !           173:                        ios(ios&) ; /* Declared but not defined */
        !           174:        void            operator=(ios&) ; /* Declared but not defined */
        !           175: public:   /* old stream package compatibility */
        !           176:        int             skip(int i) ; 
        !           177: };
        !           178: 
        !           179: class streambuf {
        !           180:        short           alloc;  
        !           181:        short           x_unbuf;
        !           182:        char*           x_base; 
        !           183:        char*           x_pbase;
        !           184:        char*           x_pptr; 
        !           185:        char*           x_epptr;
        !           186:        char*           x_gptr;
        !           187:        char*           x_egptr;
        !           188:        char*           x_eback;
        !           189:        int             x_blen; 
        !           190:     private:
        !           191:                        streambuf(streambuf&); /* Declared but not defined */
        !           192:        void            operator=(streambuf&); /* Declared but not defined */
        !           193:     public:
        !           194:        void            dbp();
        !           195:     protected:
        !           196:        char*           base()          { return x_base ; }
        !           197:        char*           pbase()         { return x_pbase ; }
        !           198:        char*           pptr()          { return x_pptr ; }
        !           199:        char*           epptr()         { return x_epptr ; }
        !           200:        char*           gptr()          { return x_gptr ; }
        !           201:        char*           egptr()         { return x_egptr ; }
        !           202:        char*           eback()         { return x_eback ; }
        !           203:        char*           ebuf()          { return x_base+x_blen ; }
        !           204:        int             blen()          { return x_blen; }
        !           205:        void            setp(char*  p, char*  ep)
        !           206:        {
        !           207:                x_pbase=x_pptr=p ; x_epptr=ep ;
        !           208:        }
        !           209:        void            setg(char*  eb,char*  g, char*  eg)
        !           210:        {
        !           211:                x_eback=eb; x_gptr=g ; x_egptr=eg ;
        !           212:        }
        !           213:        void            pbump(int n) 
        !           214:        { 
        !           215:                x_pptr+=n ;
        !           216:        }
        !           217: 
        !           218:        void            gbump(int n) 
        !           219:        { 
        !           220:                x_gptr+=n ;
        !           221:                }
        !           222: 
        !           223:        void            setb(char* b, char* eb, int a = 0 )
        !           224:        {
        !           225:                if ( alloc && x_base ) delete x_base ;
        !           226:                x_base = b ;
        !           227:                x_blen= (eb>b) ? (eb-b) : 0 ;
        !           228:                alloc = a ;
        !           229:                }
        !           230:        int             unbuffered() { return x_unbuf; }
        !           231:        void            unbuffered(int unb) { x_unbuf = (unb!=0)  ; }
        !           232:        int             allocate()
        !           233:        {
        !           234:                if ( x_base== 0 && !unbuffered() ) return doallocate() ;
        !           235:                else                             return 0 ;
        !           236:        }
        !           237:        virtual int     doallocate();
        !           238:     public : 
        !           239:        virtual int     overflow(int c=EOF);
        !           240:        virtual int     underflow();
        !           241:        virtual int     pbackfail(int c);
        !           242:        virtual int     sync();
        !           243:        virtual streampos
        !           244:                        seekoff(streamoff,ios::seek_dir,int =ios::in|ios::out);
        !           245:        virtual streampos
        !           246:                        seekpos(streampos, int =ios::in|ios::out) ;
        !           247:        virtual int     xsputn(const char*  s,int n);
        !           248:        virtual int     xsgetn(char*  s,int n);
        !           249: 
        !           250:        int             in_avail()
        !           251:        {
        !           252:                return x_gptr<x_egptr ? x_egptr-x_gptr : 0 ;
        !           253:        }
        !           254: 
        !           255:        int             out_waiting() 
        !           256:        {       
        !           257:                if ( x_pptr ) return x_pptr-x_pbase ;
        !           258:                else          return 0 ; 
        !           259:        }
        !           260: 
        !           261:        int             sgetc()
        !           262:        {
        !           263:                /***WARNING: sgetc does not bump the pointer ***/
        !           264:                return (x_gptr>=x_egptr) ? underflow() : zapeof(*x_gptr);
        !           265:        }
        !           266:        int             snextc()
        !           267:        {
        !           268:                return (++x_gptr>=x_egptr)
        !           269:                                ? x_snextc()
        !           270:                                : zapeof(*x_gptr);
        !           271:        }
        !           272:        int             sbumpc()
        !           273:        {
        !           274:                return  ( x_gptr>=x_egptr && underflow()==EOF ) 
        !           275:                                ? EOF 
        !           276:                                : zapeof(*x_gptr++) ;
        !           277:        }
        !           278:        void            stossc()
        !           279:        {
        !           280:                if ( x_gptr++ > x_egptr ) underflow() ;
        !           281:        }
        !           282: 
        !           283:        int             sputbackc(char c)
        !           284:        {
        !           285:                if (x_gptr > x_eback ) {
        !           286:                        if ( *--x_gptr == c ) return zapeof(c) ;
        !           287:                        else                  return zapeof(*x_gptr=c) ;
        !           288:                } else {
        !           289:                        return pbackfail(c) ;
        !           290:                }
        !           291:        }
        !           292: 
        !           293:        int             sputc(int c)
        !           294:        {
        !           295:                return (x_pptr>=x_epptr) ? overflow(zapeof(c))
        !           296:                                      : zapeof(*x_pptr++=c);
        !           297:        }
        !           298:        int             sputn(const char*  s,int n)
        !           299:         {
        !           300:                if ( n <= (x_epptr-x_pptr) ) {
        !           301:                        memcpy(x_pptr,s,n) ;
        !           302:                        pbump(n);
        !           303:                        return n ;
        !           304:                } else {
        !           305:                        return xsputn(s,n) ;
        !           306:                }
        !           307:        }
        !           308:        int             sgetn(char*  s,int n)
        !           309:        {
        !           310:                if ( n <= (x_egptr-x_gptr) ) {
        !           311:                        memcpy(s,x_gptr,n) ;
        !           312:                        gbump(n);
        !           313:                        return n ;
        !           314:                } else {
        !           315:                        return xsgetn(s,n) ;
        !           316:                }
        !           317:        }
        !           318:        virtual streambuf*
        !           319:                        setbuf(char*  p, int len) ;
        !           320:        streambuf*      setbuf(unsigned char*  p, int len) ;
        !           321: 
        !           322:        streambuf*      setbuf(char*  p, int len, int count) ;
        !           323:                                /* obsolete third argument */
        !           324:                        /*** Constructors -- should be protected ***/
        !           325:                        streambuf() ;
        !           326:                        streambuf(char*  p, int l) ;
        !           327: 
        !           328:                        streambuf(char*  p, int l,int c) ;
        !           329:                        /* 3 argument form is obsolete.
        !           330:                         * Use strstreambuf.
        !           331:                         */
        !           332:        virtual         ~streambuf() ;
        !           333: private:
        !           334:        int             x_snextc() ;
        !           335: };
        !           336: 
        !           337: class istream : virtual public ios {
        !           338: public: /* Constructor */
        !           339:                        istream(streambuf*) ;
        !           340:        virtual         ~istream() ;
        !           341: public:        
        !           342:        int             ipfx(int noskipws=0)
        !           343:                        {       if ( noskipws?(ispecial&~skipping):ispecial) {
        !           344:                                        return do_ipfx(noskipws) ;
        !           345:                                } else return 1 ;
        !           346:                        }
        !           347:        void            isfx() { }  
        !           348:        istream&        seekg(streampos p) ;
        !           349:        istream&        seekg(streamoff o, ios::seek_dir d) ;
        !           350:        streampos       tellg() ; 
        !           351:        istream&        operator>> (istream& (*f)(istream&))
        !           352:                        {       return (*f)(*this) ; }
        !           353:        istream&        operator>> (ios& (*f)(ios&) ) ;
        !           354:        istream&        operator>>(char*);
        !           355:        istream&        operator>>(unsigned char*);
        !           356:        istream&        operator>>(unsigned char& c)
        !           357:                        {       if ( ipfx(0) ) {
        !           358:                                        if (  bp->in_avail() ) {
        !           359:                                                c = bp->sbumpc() ;
        !           360:                                        } else  xget((char*)&c) ;
        !           361:                                }
        !           362:                                return *this ;
        !           363:                        }
        !           364:        istream&        operator>>(char& c)
        !           365:                        {       if ( ipfx(0) ) {
        !           366:                                        if (  bp->in_avail() ) {
        !           367:                                                c = bp->sbumpc() ;
        !           368:                                        } else  xget((char*)&c) ;
        !           369:                                }
        !           370:                                return *this ;
        !           371:                        }
        !           372:        istream&        operator>>(short&);
        !           373:        istream&        operator>>(int&);
        !           374:        istream&        operator>>(long&);
        !           375:        istream&        operator>>(unsigned short&);
        !           376:        istream&        operator>>(unsigned int&);
        !           377:        istream&        operator>>(unsigned long&);
        !           378:        istream&        operator>>(float&);
        !           379:        istream&        operator>>(double&);
        !           380:        istream&        operator>>(streambuf*);
        !           381:        istream&        get(char* , int lim, char delim='\n');
        !           382:        istream&        get(unsigned char* b,int lim, char delim='\n');
        !           383:        istream&        getline(char* b, int lim, char delim='\n');
        !           384:        istream&        getline(unsigned char* b, int lim, char delim='\n');
        !           385:        istream&        get(streambuf& sb, char delim ='\n');
        !           386:        istream&        get(unsigned char& c)
        !           387:                        {
        !           388:                                if ( ipfx(1) && bp->in_avail()) {
        !           389:                                        x_gcount = 1 ;
        !           390:                                        c = bp->sbumpc() ;
        !           391:                                } else {
        !           392:                                        xget((char*)&c) ;
        !           393:                                }
        !           394:                                return *this ;
        !           395:                        }
        !           396:        istream&        get(char& c)
        !           397:                        {
        !           398:                                if ( ipfx(1) && bp->in_avail()) {
        !           399:                                        x_gcount = 1 ;
        !           400:                                        c = bp->sbumpc() ;
        !           401:                                } else {
        !           402:                                        xget(&c) ;
        !           403:                                }
        !           404:                                return *this ;
        !           405:                        }
        !           406:        int             get()
        !           407:                        {
        !           408:                                int c ;
        !           409:                                if ( !ipfx(1) ) return EOF ;
        !           410:                                else {
        !           411:                                        c = bp->sbumpc() ;
        !           412:                                        if ( c == EOF ) setstate(eofbit) ;
        !           413:                                        return c ;
        !           414:                                        }
        !           415:                        }
        !           416:        int             peek() 
        !           417:                        {
        !           418:                                if ( ipfx(-1) ) return bp->sgetc() ;
        !           419:                                else            return EOF ;
        !           420: 
        !           421:                        }
        !           422:        istream&        ignore(int n=1,int delim=EOF) ;
        !           423:        istream&        read(char*  s,int n);
        !           424:        istream&        read(unsigned char* s,int n) 
        !           425:                        {
        !           426:                                return read((char*)s,n) ;
        !           427:                        }
        !           428:        int             gcount() ;
        !           429:        istream&        putback(char c);
        !           430:        int             sync()  { return bp->sync() ; }
        !           431: protected:  
        !           432:        int             do_ipfx(int noskipws) ;
        !           433:        void            eatwhite() ;
        !           434:                        istream() ;
        !           435: private: 
        !           436:        int             x_gcount ;
        !           437:        void            xget(char*  c) ;
        !           438: public: /*** Obsolete constructors, carried over from stream package ***/
        !           439:                        istream(streambuf*, int sk, ostream* t=0) ;
        !           440:                                /* obsolete, set sk and tie
        !           441:                                 * via format state variables */
        !           442:                        istream(int size ,char*,int sk=1) ;
        !           443:                                /* obsolete, use strstream */
        !           444:                        istream(int fd,int sk=1, ostream* t=0) ;
        !           445:                                /* obsolete use fstream */
        !           446: };
        !           447: 
        !           448: class ostream : virtual public ios {
        !           449: public: /* Constructor */
        !           450:                        ostream(streambuf*) ;
        !           451:        virtual         ~ostream();
        !           452: public:        
        !           453:        int             opfx()  /* Output prefix */
        !           454:                        {       if ( ospecial ) return do_opfx() ;
        !           455:                                else            return 1 ;
        !           456:                        }
        !           457:        void            osfx() 
        !           458:                        {       if ( osfx_special ) do_osfx() ; }
        !           459: 
        !           460:        ostream&        flush() ;
        !           461:        ostream&        seekp(streampos p) ;
        !           462:        ostream&        seekp(streamoff o, ios::seek_dir d) ;
        !           463:        streampos       tellp() ; 
        !           464:        ostream&        put(char c)
        !           465:        {
        !           466:                if ( opfx() ) {
        !           467:                        if (  bp->sputc(c) == EOF )  {
        !           468:                                setstate(eofbit|failbit) ;
        !           469:                        }
        !           470:                        osfx() ;
        !           471:                }
        !           472:                return *this ;
        !           473:        }
        !           474:        ostream&        operator<<(char c) { put(c) ; osfx() ; return *this ; }
        !           475: 
        !           476:        ostream&        operator<<(unsigned char c) 
        !           477:        {       put(c) ; osfx() ; return *this ; }
        !           478: 
        !           479:        ostream&        operator<<(const char*);
        !           480:        ostream&        operator<<(int a); 
        !           481:        ostream&        operator<<(long);       
        !           482:        ostream&        operator<<(double);
        !           483:        ostream&        operator<<(float);
        !           484:        ostream&        operator<<(unsigned int a);
        !           485:        ostream&        operator<<(unsigned long);
        !           486:        ostream&        operator<<(void*);
        !           487:        ostream&        operator<<(streambuf*);
        !           488:        ostream&        operator<<(short i) { return *this << (int)i ; }
        !           489:        ostream&        operator<<(unsigned short i) 
        !           490:                        { return *this << (int)i  ; }
        !           491: 
        !           492:        ostream&        operator<< (ostream& (*f)(ostream&))
        !           493:                        { return (*f)(*this) ; }
        !           494:        ostream&        operator<< (ios& (*f)(ios&) ) ;
        !           495: 
        !           496:        ostream&        write(const char*  s,int n)     
        !           497:        {
        !           498:                if ( !state ) {
        !           499:                        if ( bp->sputn(s,n) != n ) setstate(eofbit|failbit);
        !           500:                        }
        !           501:                return *this ;
        !           502:        }
        !           503:        ostream&        write(const unsigned char* s, int n)
        !           504:        {
        !           505:                return write((const char*)s,n);
        !           506:        }
        !           507: protected: /* More ostream members */
        !           508:        int             do_opfx() ;
        !           509:        void            do_osfx() ;
        !           510:                        ostream() ;
        !           511: 
        !           512: public: /*** Obsolete constructors, carried over from stream package ***/
        !           513:                        ostream(int fd) ;
        !           514:                                /* obsolete use fstream */
        !           515:                        ostream(int size ,char*) ;
        !           516:                                /* obsolete, use strstream */
        !           517: } ;
        !           518: 
        !           519: class iostream : public istream, public ostream {
        !           520: public:
        !           521:                        iostream(streambuf*) ;
        !           522:        virtual         ~iostream() ;
        !           523: protected:
        !           524:                        iostream() ;
        !           525:        } ;
        !           526: 
        !           527: class istream_withassign : public istream {
        !           528: public:
        !           529:                        istream_withassign() ;
        !           530:        virtual         ~istream_withassign() ;
        !           531:        istream_withassign&     operator=(istream&) ;
        !           532:        istream_withassign&     operator=(streambuf*) ;
        !           533: } ;
        !           534: 
        !           535: class ostream_withassign : public ostream {
        !           536: public:
        !           537:                        ostream_withassign() ;
        !           538:        virtual         ~ostream_withassign() ;
        !           539:        ostream_withassign&     operator=(ostream&) ;
        !           540:        ostream_withassign&     operator=(streambuf*) ;
        !           541: } ;
        !           542: 
        !           543: class iostream_withassign : public iostream {
        !           544: public:
        !           545:                        iostream_withassign() ;
        !           546:        virtual         ~iostream_withassign() ;
        !           547:        iostream_withassign&    operator=(ios&) ;
        !           548:        iostream_withassign&    operator=(streambuf*) ;
        !           549: } ;
        !           550: 
        !           551: extern istream_withassign cin ;
        !           552: extern ostream_withassign cout ;
        !           553: extern ostream_withassign cerr ;
        !           554: extern ostream_withassign clog ;
        !           555: 
        !           556: ios&           dec(ios&) ; 
        !           557: ostream&       endl(ostream& i) ;
        !           558: ostream&       ends(ostream& i) ;
        !           559: ostream&       flush(ostream&) ;
        !           560: ios&           hex(ios&) ;
        !           561: ios&           oct(ios&) ; 
        !           562: istream&       ws(istream&) ;
        !           563: 
        !           564: static class Iostream_init {
        !           565:        static int      stdstatus ; /* see cstreams.c */
        !           566:        static int      initcount ;
        !           567:        friend          ios ;
        !           568: public:
        !           569:        Iostream_init() ; 
        !           570:        ~Iostream_init() ; 
        !           571: } iostream_init ;      
        !           572: 
        !           573: #endif

unix.superglobalmegacorp.com

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