|
|
1.1 ! root 1: /* @(#)filbuf.c 2.1 */ ! 2: /* 3.0 SID # 1.2 */ ! 3: /*LINTLIBRARY*/ ! 4: #include <stdio.h> ! 5: ! 6: extern _findbuf(); ! 7: extern int read(); ! 8: extern int fflush(); ! 9: extern FILE *_lastbuf; ! 10: ! 11: int ! 12: _filbuf(iop) ! 13: register FILE *iop; ! 14: { ! 15: register FILE *diop; ! 16: ! 17: if (iop->_base == NULL) /* get buffer if we don't have one */ ! 18: _findbuf(iop); ! 19: ! 20: if ( !(iop->_flag & _IOREAD) ) ! 21: if (iop->_flag & _IORW) ! 22: iop->_flag |= _IOREAD; ! 23: else ! 24: return(EOF); ! 25: ! 26: /* if this device is a terminal (line-buffered) or unbuffered, then */ ! 27: /* flush buffers of all line-buffered devices currently writing */ ! 28: ! 29: if (iop->_flag & (_IOLBF | _IONBF)) ! 30: for (diop = _iob; diop < _lastbuf; diop++ ) ! 31: if (diop->_flag & _IOLBF) ! 32: (void) fflush(diop); ! 33: ! 34: iop->_ptr = iop->_base; ! 35: iop->_cnt = read(fileno(iop), (char *)iop->_base, ! 36: (unsigned)((iop->_flag & _IONBF) ? 1 : _bufsiz(iop) )); ! 37: if (--iop->_cnt >= 0) /* success */ ! 38: return (*iop->_ptr++); ! 39: if (iop->_cnt != -1) /* error */ ! 40: iop->_flag |= _IOERR; ! 41: else { /* end-of-file */ ! 42: iop->_flag |= _IOEOF; ! 43: if (iop->_flag & _IORW) ! 44: iop->_flag &= ~_IOREAD; ! 45: } ! 46: iop->_cnt = 0; ! 47: return (EOF); ! 48: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.