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