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