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