|
|
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.