xref: /csrg-svn/lib/libc/stdio/fseek.c (revision 22134)
1*22134Smckusick #ifndef lint
2*22134Smckusick static char sccsid[] = "@(#)fseek.c	5.1 (Berkeley) 06/05/85";
3*22134Smckusick #endif not lint
4*22134Smckusick 
52009Swnj /*
62009Swnj  * Seek for standard library.  Coordinates with buffering.
72009Swnj  */
82009Swnj 
92009Swnj #include	<stdio.h>
102009Swnj 
112009Swnj long lseek();
122009Swnj 
1317953Sserge long
142009Swnj fseek(iop, offset, ptrname)
1517953Sserge 	register FILE *iop;
1617953Sserge 	long offset;
172009Swnj {
182009Swnj 	register resync, c;
1917953Sserge 	long p, curpos = -1;
202009Swnj 
212009Swnj 	iop->_flag &= ~_IOEOF;
222009Swnj 	if (iop->_flag&_IOREAD) {
232009Swnj 		if (ptrname<2 && iop->_base &&
242009Swnj 			!(iop->_flag&_IONBF)) {
252009Swnj 			c = iop->_cnt;
262009Swnj 			p = offset;
2717953Sserge 			if (ptrname==0) {
2817953Sserge 				curpos = lseek(fileno(iop), 0L, 1);
2917953Sserge 				if (curpos == -1)
3017953Sserge 					return (-1);
3117953Sserge 				p += c - curpos;
3217953Sserge 			} else
332009Swnj 				offset -= c;
343163Stoy 			if(!(iop->_flag&_IORW) && c>0&&p<=c
353163Stoy 			    && p>=iop->_base-iop->_ptr){
362009Swnj 				iop->_ptr += (int)p;
372009Swnj 				iop->_cnt -= (int)p;
3817953Sserge 				if (curpos == -1)
3917953Sserge 					curpos = lseek(fileno(iop), 0L, 1);
4017953Sserge 				return (curpos == -1? -1: curpos - iop->_cnt);
412009Swnj 			}
422009Swnj 			resync = offset&01;
432009Swnj 		} else
442009Swnj 			resync = 0;
453163Stoy 		if (iop->_flag & _IORW) {
463163Stoy 			iop->_ptr = iop->_base;
473163Stoy 			iop->_flag &= ~_IOREAD;
4815072Skarels 			resync = 0;
493163Stoy 		}
502009Swnj 		p = lseek(fileno(iop), offset-resync, ptrname);
512009Swnj 		iop->_cnt = 0;
5217953Sserge 		if (resync && getc(iop) != EOF && p != -1)
5317953Sserge 			p++;
542009Swnj 	}
553163Stoy 	else if (iop->_flag & (_IOWRT|_IORW)) {
562009Swnj 		fflush(iop);
573163Stoy 		if (iop->_flag & _IORW) {
583163Stoy 			iop->_cnt = 0;
593163Stoy 			iop->_flag &= ~_IOWRT;
603163Stoy 			iop->_ptr = iop->_base;
613163Stoy 		}
622009Swnj 		p = lseek(fileno(iop), offset, ptrname);
632009Swnj 	}
6417953Sserge 	return(p);
652009Swnj }
66