ack/lang/cem/libcc/stdio/fseek.c
1987-01-27 15:57:55 +00:00

40 lines
814 B
C

#include <stdio.h>
fseek(iop, offset, where)
FILE *iop;
long offset;
{
int count;
long lseek();
long pos;
iop->_flags &= ~(IO_EOF | IO_ERR);
/* Clear both the end of file and error flags */
if ( io_testflag(iop,IO_READMODE) ) {
if ( where < 2 && iop->_buf && !io_testflag(iop,IO_UNBUFF) ) {
count = iop->_count;
pos = offset;
if ( where == 0 )
pos += count - lseek(fileno(iop), 0L,1);
else
offset -= count;
if ( count > 0 && pos <= count
&& pos >= iop->_buf - iop->_ptr ) {
iop->_ptr += (int) pos;
iop->_count -= (int) pos;
return(0);
}
}
pos = lseek(fileno(iop), offset, where);
iop->_count = 0;
} else if ( io_testflag(iop,IO_WRITEMODE) ) {
fflush(iop);
pos = lseek(fileno(iop), offset, where);
}
return((pos == -1) ? -1 : 0 );
}