|
|
1.1 ! root 1: /* @(#)fseek.c 4.3 (Berkeley) 9/25/83 */ ! 2: /* ! 3: * Seek for standard library. Coordinates with buffering. ! 4: */ ! 5: ! 6: #include <stdio.h> ! 7: ! 8: long lseek(); ! 9: ! 10: fseek(iop, offset, ptrname) ! 11: FILE *iop; ! 12: long offset; ! 13: { ! 14: register resync, c; ! 15: long p; ! 16: ! 17: iop->_flag &= ~_IOEOF; ! 18: if (iop->_flag&_IOREAD) { ! 19: if (ptrname<2 && iop->_base && ! 20: !(iop->_flag&_IONBF)) { ! 21: c = iop->_cnt; ! 22: p = offset; ! 23: if (ptrname==0) ! 24: p += c - lseek(fileno(iop),0L,1); ! 25: else ! 26: offset -= c; ! 27: if(!(iop->_flag&_IORW) && c>0&&p<=c ! 28: && p>=iop->_base-iop->_ptr){ ! 29: iop->_ptr += (int)p; ! 30: iop->_cnt -= (int)p; ! 31: return(0); ! 32: } ! 33: resync = offset&01; ! 34: } else ! 35: resync = 0; ! 36: if (iop->_flag & _IORW) { ! 37: iop->_ptr = iop->_base; ! 38: iop->_flag &= ~_IOREAD; ! 39: resync = 0; ! 40: } ! 41: p = lseek(fileno(iop), offset-resync, ptrname); ! 42: iop->_cnt = 0; ! 43: if (resync) ! 44: getc(iop); ! 45: } ! 46: else if (iop->_flag & (_IOWRT|_IORW)) { ! 47: fflush(iop); ! 48: if (iop->_flag & _IORW) { ! 49: iop->_cnt = 0; ! 50: iop->_flag &= ~_IOWRT; ! 51: iop->_ptr = iop->_base; ! 52: } ! 53: p = lseek(fileno(iop), offset, ptrname); ! 54: } ! 55: return(p==-1?-1:0); ! 56: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.