Minix1.5/lib/ansi/fseek.c

#include <lib.h>
#include <unistd.h>
#include <stdio.h>

int fseek(iop, offset, where)
FILE *iop;
long offset;
int where;
{
  int count;
  long pos = -1L;

  iop->_flags &= ~(_EOF | _ERR);
  /* Clear both the end of file and error flags */

  if (testflag(iop, READMODE)) {
	if (where < 2 && iop->_buf && !testflag(iop, UNBUFF)) {
		count = iop->_count;
		pos = offset;

		if (where == 0) {
			long L_tmp = lseek(fileno(iop), 0L, 1);
			/* Determine where we are */

			pos += (long) count - L_tmp;
		} else
			offset -= (long) count;

		if (count > 0 && pos <= (long) count
		    && pos >= (long) iop->_buf - (long) iop->_ptr) {
			iop->_ptr += (int) pos;
			iop->_count -= (int) pos;
			return(0);
		}
	}
	pos = lseek(fileno(iop), offset, where);
	iop->_count = 0;
  } else if (testflag(iop, WRITEMODE)) {
	fflush(iop);
	pos = lseek(fileno(iop), offset, where);
  }
  return((pos == -1L) ? -1 : 0);
}