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