ack/lang/cem/libcc/stdio/fillbuf.c
1989-02-21 10:01:55 +00:00

49 lines
853 B
C

/* $Header$ */
#include <stdio.h>
char *malloc();
_fillbuf(iop)
register FILE *iop;
{
static unsigned char ch[_NFILES];
iop->_count = 0;
if (fileno(iop) < 0) return EOF;
if ( io_testflag(iop, (IO_EOF | IO_ERR )))
return (EOF);
if ( !io_testflag(iop, IO_READMODE) )
return (EOF);
if (! io_testflag(iop, IO_UNBUFF) && ! iop->_buf) {
iop->_buf = (unsigned char *) malloc(_BUFSIZ);
if (! iop->_buf) {
iop->_flags |= IO_UNBUFF;
}
else {
iop->_flags |= IO_MYBUF;
iop->_bufsiz = _BUFSIZ;
}
}
if (! iop->_buf) {
iop->_buf = &ch[fileno(iop)];
iop->_bufsiz = 1;
}
iop->_ptr = iop->_buf;
iop->_count = read(iop->_fd, iop->_buf, iop->_bufsiz);
if (iop->_count <= 0){
if (iop->_count == 0) {
iop->_flags |= IO_EOF;
}
else
iop->_flags |= IO_ERR;
return (EOF);
}
iop->_count--;
return *iop->_ptr++;
}