xref: /csrg-svn/lib/libc/stdio/fseek.c (revision 26653)
1*26653Sdonn #if defined(LIBC_SCCS) && !defined(lint)
2*26653Sdonn static char sccsid[] = "@(#)fseek.c	5.3 (Berkeley) 03/09/86";
3*26653Sdonn #endif LIBC_SCCS and not lint
422134Smckusick 
52009Swnj /*
62009Swnj  * Seek for standard library.  Coordinates with buffering.
72009Swnj  */
82009Swnj 
92009Swnj #include	<stdio.h>
102009Swnj 
112009Swnj long lseek();
122009Swnj 
132009Swnj fseek(iop, offset, ptrname)
1417953Sserge 	register FILE *iop;
1517953Sserge 	long offset;
162009Swnj {
172009Swnj 	register resync, c;
1826431Slepreau 	long p = -1;			/* can't happen? */
192009Swnj 
202009Swnj 	iop->_flag &= ~_IOEOF;
212009Swnj 	if (iop->_flag&_IOREAD) {
222009Swnj 		if (ptrname<2 && iop->_base &&
232009Swnj 			!(iop->_flag&_IONBF)) {
242009Swnj 			c = iop->_cnt;
252009Swnj 			p = offset;
2617953Sserge 			if (ptrname==0) {
2726431Slepreau 				long curpos = lseek(fileno(iop), 0L, 1);
2817953Sserge 				if (curpos == -1)
2917953Sserge 					return (-1);
3017953Sserge 				p += c - curpos;
3117953Sserge 			} else
322009Swnj 				offset -= c;
333163Stoy 			if(!(iop->_flag&_IORW) && c>0&&p<=c
343163Stoy 			    && p>=iop->_base-iop->_ptr){
352009Swnj 				iop->_ptr += (int)p;
362009Swnj 				iop->_cnt -= (int)p;
3726431Slepreau 				return(0);
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;
4926431Slepreau 		if (resync && p != -1)
5026431Slepreau 			if (getc(iop) == EOF)
5126431Slepreau 				p = -1;
522009Swnj 	}
533163Stoy 	else if (iop->_flag & (_IOWRT|_IORW)) {
5426431Slepreau 		p = fflush(iop);
553163Stoy 		if (iop->_flag & _IORW) {
563163Stoy 			iop->_cnt = 0;
573163Stoy 			iop->_flag &= ~_IOWRT;
583163Stoy 			iop->_ptr = iop->_base;
593163Stoy 		}
6026431Slepreau 		return(lseek(fileno(iop), offset, ptrname) == -1 || p == EOF ?
6126431Slepreau 		    -1 : 0);
622009Swnj 	}
6326431Slepreau 	return(p==-1?-1:0);
642009Swnj }
65