BSD 4 release
[unix-history] / usr / src / libc / stdio / fseek.c
CommitLineData
9c8fc5ca
BJ
1/*
2 * Seek for standard library. Coordinates with buffering.
3 */
4
5#include <stdio.h>
6
7long lseek();
8
9fseek(iop, offset, ptrname)
10FILE *iop;
11long offset;
12{
13 register resync, c;
14 long p;
15
16 iop->_flag &= ~_IOEOF;
17 if (iop->_flag&_IOREAD) {
18 if (ptrname<2 && iop->_base &&
19 !(iop->_flag&_IONBF)) {
20 c = iop->_cnt;
21 p = offset;
22 if (ptrname==0)
23 p += c - lseek(fileno(iop),0L,1);
24 else
25 offset -= c;
26 if(c>0&&p<=c&&p>=iop->_base-iop->_ptr){
27 iop->_ptr += (int)p;
28 iop->_cnt -= (int)p;
29 return(0);
30 }
31 resync = offset&01;
32 } else
33 resync = 0;
34 p = lseek(fileno(iop), offset-resync, ptrname);
35 iop->_cnt = 0;
36 if (resync)
37 getc(iop);
38 }
39 else if (iop->_flag&_IOWRT) {
40 fflush(iop);
41 p = lseek(fileno(iop), offset, ptrname);
42 }
43 return(p==-1?-1:0);
44}