/* Copyright (c) 1979 Regents of the University of California */ #include <stdio.h> _filbuf(iop) register struct _iobuf *iop; { static char smallbuf[_NFILE]; register n; char *malloc(); if ((iop->_flag&_IOREAD) == 0) _error("Reading bad file\n"); if (iop->_flag&_IOSTRG) return(-1); tryagain: if (iop->_base==NULL) { if (iop->_flag&_IONBF) { iop->_base = &smallbuf[fileno(iop)]; goto tryagain; } if ((iop->_base = malloc(BUFSIZ)) == NULL) { iop->_flag |= _IONBF; goto tryagain; } iop->_flag |= _IOMYBUF; } if((iop->_flag & _IODIRT) && !(iop->_flag & _IONBF) && (iop->_flag & _IOWRT)) { if (iop->_delta) if (lseek(iop->_file,(long) -iop->_delta, 1) < 0) { _error("Seek error in filbuf\n"); iop->_flag |= _IOERR; } if( 0 < (n = iop->_ptr - iop->_base)) if( n != write(iop->_file, iop->_base, n) ) iop->_flag |= _IOERR; iop->_flag &= ~_IODIRT; } iop->_ptr = iop->_base; iop->_cnt = read(fileno(iop), iop->_ptr, iop->_flag&_IONBF?1:BUFSIZ); iop->_delta = iop->_cnt; if (--iop->_cnt < 0) { if (iop->_cnt == -1) iop->_flag |= _IOEOF; else iop->_flag |= _IOERR; iop->_cnt = 0; return(-1); } return(*iop->_ptr++&0377); }