xref: /csrg-svn/lib/libc/stdio/fseek.c (revision 17953)
1*17953Sserge /* @(#)fseek.c	4.4 (Berkeley) 02/13/85 */
22009Swnj /*
32009Swnj  * Seek for standard library.  Coordinates with buffering.
42009Swnj  */
52009Swnj 
62009Swnj #include	<stdio.h>
72009Swnj 
82009Swnj long lseek();
92009Swnj 
10*17953Sserge long
112009Swnj fseek(iop, offset, ptrname)
12*17953Sserge 	register FILE *iop;
13*17953Sserge 	long offset;
142009Swnj {
152009Swnj 	register resync, c;
16*17953Sserge 	long p, curpos = -1;
172009Swnj 
182009Swnj 	iop->_flag &= ~_IOEOF;
192009Swnj 	if (iop->_flag&_IOREAD) {
202009Swnj 		if (ptrname<2 && iop->_base &&
212009Swnj 			!(iop->_flag&_IONBF)) {
222009Swnj 			c = iop->_cnt;
232009Swnj 			p = offset;
24*17953Sserge 			if (ptrname==0) {
25*17953Sserge 				curpos = lseek(fileno(iop), 0L, 1);
26*17953Sserge 				if (curpos == -1)
27*17953Sserge 					return (-1);
28*17953Sserge 				p += c - curpos;
29*17953Sserge 			} else
302009Swnj 				offset -= c;
313163Stoy 			if(!(iop->_flag&_IORW) && c>0&&p<=c
323163Stoy 			    && p>=iop->_base-iop->_ptr){
332009Swnj 				iop->_ptr += (int)p;
342009Swnj 				iop->_cnt -= (int)p;
35*17953Sserge 				if (curpos == -1)
36*17953Sserge 					curpos = lseek(fileno(iop), 0L, 1);
37*17953Sserge 				return (curpos == -1? -1: curpos - iop->_cnt);
382009Swnj 			}
392009Swnj 			resync = offset&01;
402009Swnj 		} else
412009Swnj 			resync = 0;
423163Stoy 		if (iop->_flag & _IORW) {
433163Stoy 			iop->_ptr = iop->_base;
443163Stoy 			iop->_flag &= ~_IOREAD;
4515072Skarels 			resync = 0;
463163Stoy 		}
472009Swnj 		p = lseek(fileno(iop), offset-resync, ptrname);
482009Swnj 		iop->_cnt = 0;
49*17953Sserge 		if (resync && getc(iop) != EOF && p != -1)
50*17953Sserge 			p++;
512009Swnj 	}
523163Stoy 	else if (iop->_flag & (_IOWRT|_IORW)) {
532009Swnj 		fflush(iop);
543163Stoy 		if (iop->_flag & _IORW) {
553163Stoy 			iop->_cnt = 0;
563163Stoy 			iop->_flag &= ~_IOWRT;
573163Stoy 			iop->_ptr = iop->_base;
583163Stoy 		}
592009Swnj 		p = lseek(fileno(iop), offset, ptrname);
602009Swnj 	}
61*17953Sserge 	return(p);
622009Swnj }
63