|
|
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) && !(flag&_IONBF) && ptrname!=2) do { ! 23: p = lseek(fileno(iop), 0L, 1); ! 24: if (p < 0) ! 25: break; ! 26: d = iop->_cnt; ! 27: if (ptrname == 1) { ! 28: offset += p - d; ! 29: ptrname = 0; ! 30: } ! 31: if (offset < 0) ! 32: break; ! 33: if (flag & _IORW) ! 34: break; ! 35: p -= offset; ! 36: if (p >= 0 && p <= iop->_ptr - iop->_base + d) ! 37: d -= (int)p; ! 38: else { ! 39: d = (unsigned int)offset % BUFSIZ; ! 40: if (d == 0) /* leave room for ungetc */ ! 41: break; ! 42: lseek(fileno(iop), offset - d, 0); ! 43: if (_filbuf(iop) == EOF) ! 44: break; ! 45: if (--d > iop->_cnt) /* partial buffer */ ! 46: break; ! 47: } ! 48: iop->_cnt -= d; ! 49: iop->_ptr += d; ! 50: return (0); ! 51: } while (0); ! 52: if (flag & (_IORW|_IOREAD)) { ! 53: iop->_cnt = 0; ! 54: iop->_ptr = iop->_base; ! 55: } ! 56: return (lseek(fileno(iop), offset, ptrname) < 0? -1: 0); ! 57: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.