Annotation of 42BSD/lib/libc/stdio/filbuf.c, revision 1.1

1.1     ! root        1: /* @(#)filbuf.c        4.6 (Berkeley) 6/30/83 */
        !             2: #include       <stdio.h>
        !             3: #include       <sys/types.h>
        !             4: #include       <sys/stat.h>
        !             5: char   *malloc();
        !             6: 
        !             7: _filbuf(iop)
        !             8: register FILE *iop;
        !             9: {
        !            10:        int size;
        !            11:        struct stat stbuf;
        !            12:        static char smallbuf[_NFILE];
        !            13:        extern char _sibuf[];
        !            14: 
        !            15:        if (iop->_flag & _IORW)
        !            16:                iop->_flag |= _IOREAD;
        !            17: 
        !            18:        if ((iop->_flag&_IOREAD) == 0)
        !            19:                return(EOF);
        !            20:        if (iop->_flag&(_IOSTRG|_IOEOF))
        !            21:                return(EOF);
        !            22: tryagain:
        !            23:        if (iop->_base==NULL) {
        !            24:                if (iop->_flag&_IONBF) {
        !            25:                        iop->_base = &smallbuf[fileno(iop)];
        !            26:                        goto tryagain;
        !            27:                }
        !            28:                if (fstat(fileno(iop), &stbuf) < 0 || stbuf.st_blksize <= NULL)
        !            29:                        size = BUFSIZ;
        !            30:                else
        !            31:                        size = stbuf.st_blksize;
        !            32:                if (iop == stdin)
        !            33:                        iop->_base = _sibuf;
        !            34:                else {
        !            35:                        if ((iop->_base = malloc(size)) == NULL) {
        !            36:                                iop->_flag |= _IONBF;
        !            37:                                goto tryagain;
        !            38:                        }
        !            39:                        iop->_flag |= _IOMYBUF;
        !            40:                }
        !            41:                iop->_bufsiz = size;
        !            42:        }
        !            43:        if (iop == stdin) {
        !            44:                if (stdout->_flag&_IOLBF)
        !            45:                        fflush(stdout);
        !            46:                if (stderr->_flag&_IOLBF)
        !            47:                        fflush(stderr);
        !            48:        }
        !            49:        iop->_cnt = read(fileno(iop), iop->_base,
        !            50:                iop->_flag & _IONBF ? 1 : iop->_bufsiz);
        !            51:        iop->_ptr = iop->_base;
        !            52:        if (--iop->_cnt < 0) {
        !            53:                if (iop->_cnt == -1) {
        !            54:                        iop->_flag |= _IOEOF;
        !            55:                        if (iop->_flag & _IORW)
        !            56:                                iop->_flag &= ~_IOREAD;
        !            57:                } else
        !            58:                        iop->_flag |= _IOERR;
        !            59:                iop->_cnt = 0;
        !            60:                return(-1);
        !            61:        }
        !            62:        return(*iop->_ptr++&0377);
        !            63: }

unix.superglobalmegacorp.com

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