Annotation of researchv10no/cmd/cfront/libC/ooiostream/stdiobuf.c, revision 1.1.1.1

1.1       root        1: /*ident        "@(#)ctrans:lib/stream/stdiobuf.c       1.1.2.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: stdiobuf.c:
                     12: 
                     13: *****************************************************************************/
                     14: 
                     15: 
                     16: #include <iostream.h>
                     17: #include <stdiostream.h>
                     18: 
                     19: int stdiobuf::overflow(int c) 
                     20: {
                     21:        if ( fp == 0 || c==EOF) return EOF ;
                     22:        if ( last_op == ios::in ) {
                     23:                if ( egptr()!=gptr() ) ungetc(*gptr(),fp) ;
                     24:                // stdio requires seeks between reads and writes
                     25:                fseek(fp,0,ios::cur) ;
                     26:                setg(0,0,0) ;
                     27:                }
                     28:        last_op = ios::out ;
                     29:        
                     30:        return putc(c,fp) ;
                     31: }
                     32: 
                     33: int stdiobuf::underflow() {
                     34:        if ( fp == 0 ) return EOF ;
                     35:        if ( last_op == ios::out ) {
                     36:                fseek(fp,0,0) ;
                     37:                }
                     38:        if ( feof(fp) ) return EOF ;
                     39:        int c = getc(fp) ;
                     40:        if ( c == EOF ) return EOF ;
                     41:        setg(buf,buf,buf+1) ;
                     42:        buf[0] = c ;
                     43:        return c ;
                     44: }
                     45: 
                     46: int stdiobuf::pbackfail(int c) 
                     47: {
                     48:        return ungetc(c,fp) ;
                     49: }
                     50: 
                     51: int stdiobuf::sync()
                     52: {
                     53:        if ( last_op==ios::out ) fflush(fp) ;
                     54:        else if ( last_op==ios::in && gptr()!=egptr() ) {
                     55:                ungetc(*gptr(),fp) ;
                     56:                setg(0,0,0) ;
                     57:        }
                     58:        return fseek(fp,0,ios::cur) ;
                     59: }
                     60:        
                     61: streampos stdiobuf::seekoff(streamoff p,seek_dir d,open_mode) 
                     62: {
                     63: 
                     64:        if ( gptr()!=egptr() ) ungetc(*gptr(),fp) ;
                     65:        setg(0,0,0) ;
                     66:        return fseek(fp,p,d) ;
                     67: }
                     68: 
                     69: stdiobuf::stdiobuf(FILE* f) :
                     70:        fp(f)
                     71: {
                     72:        setbuf((char*)0,0) ;
                     73: }
                     74: 
                     75: stdiobuf::~stdiobuf() 
                     76: {
                     77:        if (fp) fflush(fp) ;
                     78: }
                     79: 
                     80: stdiostream::stdiostream(FILE* f) :  buf(f)
                     81: {
                     82:        init(&buf) ;
                     83: }
                     84: 
                     85: stdiostream::~stdiostream() { }
                     86: 
                     87: stdiobuf* stdiostream::rdbuf() { return &buf ; }

unix.superglobalmegacorp.com

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