Blame


1 b2cfc4e2 2003-09-30 devnull #include "lib9.h"
2 b2cfc4e2 2003-09-30 devnull #include <bio.h>
3 b2cfc4e2 2003-09-30 devnull
4 b2cfc4e2 2003-09-30 devnull off_t
5 b2cfc4e2 2003-09-30 devnull Bseek(Biobuf *bp, off_t offset, int base)
6 b2cfc4e2 2003-09-30 devnull {
7 b2cfc4e2 2003-09-30 devnull off_t n, d;
8 b2cfc4e2 2003-09-30 devnull
9 b2cfc4e2 2003-09-30 devnull switch(bp->state) {
10 b2cfc4e2 2003-09-30 devnull default:
11 b2cfc4e2 2003-09-30 devnull fprint(2, "Bseek: unknown state %d\n", bp->state);
12 b2cfc4e2 2003-09-30 devnull return Beof;
13 b2cfc4e2 2003-09-30 devnull
14 b2cfc4e2 2003-09-30 devnull case Bracteof:
15 b2cfc4e2 2003-09-30 devnull bp->state = Bractive;
16 b2cfc4e2 2003-09-30 devnull bp->icount = 0;
17 b2cfc4e2 2003-09-30 devnull bp->gbuf = bp->ebuf;
18 b2cfc4e2 2003-09-30 devnull
19 b2cfc4e2 2003-09-30 devnull case Bractive:
20 b2cfc4e2 2003-09-30 devnull n = offset;
21 b2cfc4e2 2003-09-30 devnull if(base == 1) {
22 b2cfc4e2 2003-09-30 devnull n += Boffset(bp);
23 b2cfc4e2 2003-09-30 devnull base = 0;
24 b2cfc4e2 2003-09-30 devnull }
25 b2cfc4e2 2003-09-30 devnull
26 b2cfc4e2 2003-09-30 devnull /*
27 b2cfc4e2 2003-09-30 devnull * try to seek within buffer
28 b2cfc4e2 2003-09-30 devnull */
29 b2cfc4e2 2003-09-30 devnull if(base == 0) {
30 b2cfc4e2 2003-09-30 devnull d = n - Boffset(bp);
31 b2cfc4e2 2003-09-30 devnull bp->icount += d;
32 b2cfc4e2 2003-09-30 devnull if(d >= 0) {
33 b2cfc4e2 2003-09-30 devnull if(bp->icount <= 0)
34 b2cfc4e2 2003-09-30 devnull return n;
35 b2cfc4e2 2003-09-30 devnull } else {
36 b2cfc4e2 2003-09-30 devnull if(bp->ebuf - bp->gbuf >= -bp->icount)
37 b2cfc4e2 2003-09-30 devnull return n;
38 b2cfc4e2 2003-09-30 devnull }
39 b2cfc4e2 2003-09-30 devnull }
40 b2cfc4e2 2003-09-30 devnull
41 b2cfc4e2 2003-09-30 devnull /*
42 b2cfc4e2 2003-09-30 devnull * reset the buffer
43 b2cfc4e2 2003-09-30 devnull */
44 b2cfc4e2 2003-09-30 devnull n = lseek(bp->fid, n, base);
45 b2cfc4e2 2003-09-30 devnull bp->icount = 0;
46 b2cfc4e2 2003-09-30 devnull bp->gbuf = bp->ebuf;
47 b2cfc4e2 2003-09-30 devnull break;
48 b2cfc4e2 2003-09-30 devnull
49 b2cfc4e2 2003-09-30 devnull case Bwactive:
50 b2cfc4e2 2003-09-30 devnull Bflush(bp);
51 b2cfc4e2 2003-09-30 devnull n = lseek(bp->fid, offset, base);
52 b2cfc4e2 2003-09-30 devnull break;
53 b2cfc4e2 2003-09-30 devnull }
54 b2cfc4e2 2003-09-30 devnull bp->offset = n;
55 b2cfc4e2 2003-09-30 devnull return n;
56 b2cfc4e2 2003-09-30 devnull }