Annotation of researchv10no/cmd/cfront/libC/iostream/strstream.c, revision 1.1

1.1     ! root        1: /*ident        "@(#)ctrans:lib/stream/strstream.c      1.1.4.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: strstream.c:
        !            12: 
        !            13: *****************************************************************************/
        !            14: 
        !            15: #include <iostream.h>
        !            16: #include <string.h>
        !            17: #include <strstream.h>
        !            18: #include <memory.h>
        !            19: 
        !            20: typedef unsigned int Size_t ;  
        !            21:                        // Some day <memory.h> will be ANSIfied and
        !            22:                        // this will be declared there.
        !            23:                        // Until then make it compatible with declaration
        !            24:                        // of third argument of memcpy.
        !            25: 
        !            26: static const int initsize = 16*sizeof(int) ;
        !            27: static const int increment = 2 ;       
        !            28: 
        !            29: static const int arbitrary = 1024 ;    // used by ignore_oflow.
        !            30: 
        !            31: static const int ios_atend = ios::ate ;
        !            32: static const int ios_input = ios::in ;
        !            33: static const int ios_output = ios::out ;
        !            34: static const int ios_append = ios::app ;
        !            35: static const int seek_cur = ios::cur ;
        !            36: static const int seek_end = ios::end ;
        !            37: static const int seek_beg = ios::beg ;
        !            38: 
        !            39: strstreambuf::strstreambuf(void* (*a)(long), void (*f)(void*)) :
        !            40:        afct(a),
        !            41:        ffct(f),
        !            42:        froozen(1),
        !            43:        auto_extend(initsize),
        !            44:        ignore_oflow(0)
        !            45: {
        !            46:        }
        !            47: 
        !            48: void strstreambuf::init(char* b, int size, char* pstart)
        !            49: {
        !            50:        if ( b && size > 0 ) {
        !            51:                setb(b,b+size) ;
        !            52:                }
        !            53:        else if ( b && size == 0 ) {
        !            54:                setb(b,b+strlen(b) ) ;
        !            55:                }
        !            56:        else if ( b && size < 0 ) {
        !            57:                ignore_oflow = 1 ;
        !            58:                setb(b,b+arbitrary) ;
        !            59:                }
        !            60:        else if ( !b && size > initsize ) {
        !            61:                auto_extend = size ;
        !            62:                setb(0,0) ;
        !            63:                }
        !            64:        else {
        !            65:                setb(0,0) ;
        !            66:                }
        !            67: 
        !            68:        if ( pstart && base() && base() <= pstart && pstart <= ebuf() ) {
        !            69:                setp(pstart,ebuf()) ;
        !            70:                }
        !            71:        else {
        !            72:                setp(0,0) ;
        !            73:                }
        !            74:        
        !            75:        if ( base() ) {
        !            76:                setg(base(),base(),ebuf()) ;
        !            77:                auto_extend = 0 ;
        !            78:                froozen = 1 ;
        !            79:                }
        !            80:        else {
        !            81:                setg(0,0,0) ;
        !            82:                }
        !            83:        }
        !            84: 
        !            85: strstreambuf::strstreambuf(char* b, int size, char* pstart) :
        !            86:        afct(0),
        !            87:        ffct(0),
        !            88:        froozen(0),
        !            89:        auto_extend(0),
        !            90:        ignore_oflow(0)
        !            91: {
        !            92:        init(b,size,pstart) ; 
        !            93:        }
        !            94: 
        !            95: strstreambuf::strstreambuf(unsigned char* b, int size, unsigned char* pstart) :
        !            96:        afct(0),
        !            97:        ffct(0),
        !            98:        froozen(0),
        !            99:        auto_extend(0),
        !           100:        ignore_oflow(0)
        !           101: {
        !           102:        init((char*)b,size,(char*)pstart) ; 
        !           103:        }
        !           104: 
        !           105: 
        !           106: strstreambuf::strstreambuf(int ae) :
        !           107:        afct(0),
        !           108:        ffct(0),
        !           109:        froozen(1),
        !           110:        auto_extend(ae>0?ae:initsize),
        !           111:        ignore_oflow(0)
        !           112: {
        !           113:        }
        !           114: 
        !           115: strstreambuf::strstreambuf() :
        !           116:        afct(0),
        !           117:        ffct(0),
        !           118:        froozen(1),
        !           119:        auto_extend(initsize),
        !           120:        ignore_oflow(0)
        !           121: {
        !           122:        }
        !           123: 
        !           124: 
        !           125: int strstreambuf::doallocate()
        !           126: {
        !           127:        if ( auto_extend < initsize ) auto_extend = initsize ;
        !           128:        char* newspace  = afct ? (char*)(*afct)(auto_extend) 
        !           129:                               : new char[auto_extend] ;
        !           130: 
        !           131:        if ( !newspace ) return EOF ;
        !           132: 
        !           133:        froozen = 0 ;
        !           134:        setb(newspace,newspace+auto_extend,0) ;
        !           135:                        // Will free this space ourselves if neccessary
        !           136: 
        !           137:        setp(newspace,newspace+auto_extend) ;
        !           138:        setg(newspace,newspace,newspace) ;
        !           139: 
        !           140:        return 0 ;
        !           141:        }
        !           142: 
        !           143: int strstreambuf::overflow(int c)
        !           144: {
        !           145:        if ( !base() ) {
        !           146:                allocate() ;
        !           147:                if ( !base() ) return EOF ;
        !           148:                }
        !           149:        else if ( auto_extend && !froozen ) {
        !           150:                Size_t inserted=pptr()-base() ; // number of chars previously
        !           151:                                                // inserted into buffer
        !           152: 
        !           153:                Size_t extracted=gptr()-base() ;
        !           154:                                                // number of chars previously
        !           155:                                                // extracted from buffer
        !           156: 
        !           157:                // after we copy chars from current space to a new
        !           158:                // (larger) area we have to adjust pointers to take into
        !           159:                // acount previous activities.
        !           160: 
        !           161:                Size_t newsize = (Size_t)increment*blen() + 4 ;
        !           162:                if ( newsize < auto_extend ) newsize = auto_extend ;
        !           163:                char* newspace = afct ? (char*)(*afct)(newsize) 
        !           164:                                      : new char[newsize] ;
        !           165: 
        !           166:                if ( !newspace ) return EOF ;
        !           167: 
        !           168:                memcpy(newspace,base(),inserted) ;
        !           169: 
        !           170:                if ( ffct )     (*ffct)(base()) ;
        !           171:                else            delete base() ;
        !           172: 
        !           173:                setb(newspace,newspace+newsize,0) ;
        !           174:                setp(base()+inserted,ebuf()) ;
        !           175:                setg(base(),base()+extracted,pptr()) ;
        !           176:                }
        !           177:        else if ( ignore_oflow ) {
        !           178:                setp(pptr(),pptr()+arbitrary) ; 
        !           179:                }
        !           180:        else {
        !           181:                return EOF ;
        !           182:                }
        !           183:        if ( c!=EOF ) return sputc(c) ;
        !           184:        }
        !           185: 
        !           186: int strstreambuf::underflow()
        !           187: {
        !           188:        if ( !pptr() ) return EOF ;
        !           189:        if ( !egptr() ) return EOF ;
        !           190: 
        !           191:        setg(base(),egptr(),pptr()) ;
        !           192:        
        !           193:        if ( egptr() <= gptr() )        return EOF ;
        !           194:        else                            return *gptr() ;
        !           195:        }
        !           196: 
        !           197: void strstreambuf::freeze(int n) 
        !           198: {
        !           199:        froozen = n ;
        !           200:        }
        !           201: 
        !           202: 
        !           203: char* strstreambuf::str() 
        !           204: {
        !           205:        freeze() ;
        !           206:        return base() ;
        !           207:        }
        !           208: 
        !           209: strstreambuf::~strstreambuf()
        !           210: {
        !           211:        if ( !froozen && base() ) {
        !           212:                if ( ffct )     ffct(base()) ;
        !           213:                else            delete base() ;
        !           214:                }
        !           215:        }
        !           216: 
        !           217: streambuf* strstreambuf::setbuf(char* p, int size) 
        !           218: {
        !           219:        if ( p == 0 && ( base()==0 || auto_extend ) ) {
        !           220:                auto_extend = size ;
        !           221:                return this ;
        !           222:                }
        !           223:        else {
        !           224:                return 0 ;
        !           225:                }
        !           226:        }
        !           227: 
        !           228: streampos strstreambuf::seekoff(streamoff o, ios::seek_dir d, int m)
        !           229: {
        !           230:        switch (d) {
        !           231:        case seek_beg : break ;
        !           232:        case seek_cur : {
        !           233:                if ( (m&ios_input) ) {
        !           234:                        o += gptr()-base() ;
        !           235:                        }
        !           236:                else  {
        !           237:                        o += pptr()-base() ;
        !           238:                        }
        !           239:                } break ;
        !           240:        case seek_end : {
        !           241:                if ( gptr()<egptr() && egptr()>pptr() ) {
        !           242:                        o += egptr()-base() ;
        !           243:                        }
        !           244:                else if ( pptr()<epptr() ) {
        !           245:                        o += pptr()-base();
        !           246:                        }
        !           247:                } break ;
        !           248:            } // end switch
        !           249:        if ( o < 0 ) return streampos(EOF) ;
        !           250:        if ( o >= blen() && !ignore_oflow ) return streampos(EOF) ;
        !           251:        if ( m&ios_input ) setg(base(), base()+o, egptr() ) ;
        !           252:        if ( m&ios_output) setp(base()+o, epptr() ) ;
        !           253:        return o ;
        !           254:        }
        !           255: 
        !           256: strstreambase::strstreambase(char* str, int size, char* pstart)
        !           257:        :  buf(str,size,pstart) { init(&buf) ; }
        !           258: 
        !           259: strstreambase::strstreambase() : buf() { init(&buf) ; }
        !           260: 
        !           261: strstreambase::~strstreambase() { }
        !           262: 
        !           263: strstreambuf* strstreambase::rdbuf() { return &buf ; }
        !           264: 
        !           265: istrstream::istrstream(char* str)
        !           266:        : strstreambase(str,strlen(str),0) { }
        !           267: 
        !           268: istrstream::istrstream(char* str, int size)
        !           269:        : strstreambase(str, size , 0) { }
        !           270: 
        !           271: istrstream::~istrstream() { }
        !           272: 
        !           273: 
        !           274: static char* pstart(char* str, int size, int m)
        !           275: {
        !           276:        if ( (m&(ios_append|ios_output)) == 0 ) return str+size ;
        !           277:        else if ( (m&(ios_append|ios_atend)) )  return str+strlen(str) ;
        !           278:        else                                    return str ;
        !           279:        }
        !           280: 
        !           281: ostrstream::ostrstream(char* str, int size, int m)
        !           282:        : strstreambase(str, size, pstart(str,size, (m|ios_output)) )
        !           283: { }
        !           284: 
        !           285: ostrstream::ostrstream() : strstreambase() { }
        !           286: 
        !           287: 
        !           288: ostrstream::~ostrstream()
        !           289: {
        !           290:        ios::rdbuf()->sputc(0) ;
        !           291:        }
        !           292: 
        !           293: char* ostrstream::str() 
        !           294: {
        !           295:        return strstreambase::rdbuf()->str() ;
        !           296:        }
        !           297: 
        !           298: int ostrstream::pcount() {
        !           299:        return ios::rdbuf()->out_waiting() ;
        !           300:        }
        !           301: 
        !           302: strstream::strstream() : strstreambase() { }
        !           303: 
        !           304: strstream::strstream(char* str, int size, int m) 
        !           305:        : strstreambase(str,size,pstart(str,size,m)) 
        !           306: { }
        !           307: 
        !           308: char* strstream::str() 
        !           309: {
        !           310:        return strstreambase::rdbuf()->str() ;
        !           311:        }
        !           312: 
        !           313: 
        !           314: strstream::~strstream() { }

unix.superglobalmegacorp.com

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