1*2009Swnj /* @(#)fseek.c 4.1 (Berkeley) 12/21/80 */ 2*2009Swnj /* 3*2009Swnj * Seek for standard library. Coordinates with buffering. 4*2009Swnj */ 5*2009Swnj 6*2009Swnj #include <stdio.h> 7*2009Swnj 8*2009Swnj long lseek(); 9*2009Swnj 10*2009Swnj fseek(iop, offset, ptrname) 11*2009Swnj FILE *iop; 12*2009Swnj long offset; 13*2009Swnj { 14*2009Swnj register resync, c; 15*2009Swnj long p; 16*2009Swnj 17*2009Swnj iop->_flag &= ~_IOEOF; 18*2009Swnj if (iop->_flag&_IOREAD) { 19*2009Swnj if (ptrname<2 && iop->_base && 20*2009Swnj !(iop->_flag&_IONBF)) { 21*2009Swnj c = iop->_cnt; 22*2009Swnj p = offset; 23*2009Swnj if (ptrname==0) 24*2009Swnj p += c - lseek(fileno(iop),0L,1); 25*2009Swnj else 26*2009Swnj offset -= c; 27*2009Swnj if(c>0&&p<=c&&p>=iop->_base-iop->_ptr){ 28*2009Swnj iop->_ptr += (int)p; 29*2009Swnj iop->_cnt -= (int)p; 30*2009Swnj return(0); 31*2009Swnj } 32*2009Swnj resync = offset&01; 33*2009Swnj } else 34*2009Swnj resync = 0; 35*2009Swnj p = lseek(fileno(iop), offset-resync, ptrname); 36*2009Swnj iop->_cnt = 0; 37*2009Swnj if (resync) 38*2009Swnj getc(iop); 39*2009Swnj } 40*2009Swnj else if (iop->_flag&_IOWRT) { 41*2009Swnj fflush(iop); 42*2009Swnj p = lseek(fileno(iop), offset, ptrname); 43*2009Swnj } 44*2009Swnj return(p==-1?-1:0); 45*2009Swnj } 46