home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
minnie.tuhs.org
/
unixen.tar
/
unixen
/
PDP-11
/
Distributions
/
ucb
/
spencer_2bsd.tar.gz
/
2bsd.tar
/
src
/
libNS
/
filbuf.c
< prev
next >
Wrap
C/C++ Source or Header
|
1980-02-17
|
1KB
|
50 lines
/* 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);
}