Annotation of researchv9/cmd/cfront/libC/stream/filebuf.c, revision 1.1.1.1

1.1       root        1: #include "stream.h"
                      2: 
                      3: /* define some UNIX calls */
                      4: extern int open (char *, int);
                      5: extern int close (int);
                      6: extern long lseek (int, long, int);
                      7: extern int read (int, char *, unsigned);
                      8: extern int write (int, char *, unsigned);
                      9: extern int creat (char *, int);
                     10: 
                     11: /*
                     12:  *     Open a file with the given mode.
                     13:  *     Return:         NULL if failure
                     14:  *                     this if success
                     15:  */
                     16: filebuf* filebuf::open (char *name, open_mode om)
                     17: {
                     18:        switch (om) {
                     19:        case input:     
                     20:                fd = ::open(name, 0);
                     21:                break;
                     22:        case output:    
                     23:                fd = creat(name, 0664);
                     24:                break;
                     25:        case append:    
                     26:                fd = ::open(name, 1);
                     27:                if (fd < 0) fd = creat(name, 0664);
                     28:                if (fd >= 0) (void)lseek(fd, 0, 2);
                     29:                break;
                     30:        }
                     31: 
                     32:        if (fd < 0) return NULL;
                     33: 
                     34:        opened = 1;
                     35:        return this;
                     36: }
                     37: 
                     38: /*
                     39:  *     Empty an output buffer.
                     40:  *     Returns:        EOF on error
                     41:  *                     0 on success
                     42:  */
                     43: int filebuf::overflow(int c)
                     44: {
                     45:        if (!opened || allocate()==EOF) return EOF;
                     46: 
                     47:        if (fp != NULL) {               // stdio compatibility
                     48:                fflush(fp);
                     49:                return 0;
                     50:        }
                     51:        else if (base == eptr) {        // unbuffered IO
                     52:                if (c != EOF) {
                     53:                        *pptr = c;
                     54:                        if (write(fd, pptr, 1) != 1) return EOF;
                     55:                }
                     56:        }
                     57:        else {                          // buffered IO
                     58:                if (pptr > base)
                     59:                        if (write(fd, base, pptr-base) != pptr-base) return EOF;
                     60:                pptr = gptr = base;
                     61:                if (c != EOF) *pptr++ = c;
                     62:        }
                     63:        return c & 0377;
                     64: }
                     65: 
                     66: /*
                     67:  *     Fill an input buffer.
                     68:  *     Returns:        EOF on error or end of input
                     69:  *                     next character on success
                     70:  */
                     71: int filebuf::underflow()
                     72: {
                     73:        int count;
                     74:        extern int strlen(char *);
                     75: 
                     76:        if (!opened || allocate()==EOF) return EOF;
                     77: 
                     78:        if (fp!=NULL) {                 // stdio compatibility
                     79:                if (fgets(base+1, eptr-base-1, fp) == NULL) return EOF;
                     80:                count = strlen(base+1);
                     81:        }
                     82:        else {                          // normal stream io
                     83:                if ((count=read(fd, base+1, eptr-base-1)) < 1) return EOF;
                     84:        }
                     85:        gptr = base+1;                  // leave room for putback
                     86:        pptr = gptr+count;
                     87:        return *gptr & 0377;
                     88: }

unix.superglobalmegacorp.com

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