Commit | Line | Data |
---|---|---|
e690a3a0 TL |
1 | #include "bio.h" |
2 | ||
3 | /* | |
4 | * NAMES: bread(), brseek(), blseek() | |
5 | * | |
6 | * DESCRIPTION: | |
7 | * This is a buffered read package. | |
8 | * | |
9 | * Bread may be called with a negative nbytes which causes it to | |
10 | * read backwards. In this case, buffer should point to the first | |
11 | * byte following the buffer. If only a partial read is possible | |
12 | * (due to beginning of file), only the last bytes of the buffer | |
13 | * will be filled. | |
14 | */ | |
15 | ||
16 | ||
17 | bread(brs, buff, nbytes) | |
18 | struct brbuf *brs; char *buff; { | |
19 | register int k, nb; | |
20 | ||
21 | if (nbytes > 0) { | |
22 | for (nb=nbytes; nb>0; nb--) { | |
23 | if (brs->nr == 0) { | |
24 | brs->nr = read(brs->fd, brs->next=brs->b, 512); | |
25 | brs->nl = 0; | |
26 | if (brs->nr < 0) return(-1); | |
27 | if (brs->nr == 0) return(nbytes-nb); | |
28 | } | |
29 | *buff++ = *brs->next++; | |
30 | brs->nr--; | |
31 | brs->nl++; | |
32 | } | |
33 | } | |
34 | else { | |
35 | nbytes = -nbytes; | |
36 | for (nb=nbytes; nb>0; nb--) { | |
37 | if (brs->nl == 0) { | |
38 | lseek(brs->fd, (long) -(512 + brs->nr), 1); | |
39 | brs->nl = read(brs->fd, brs->b, 512); | |
40 | if (brs->nl < 0) { | |
41 | for (k=511; k>0; k--) { | |
42 | lseek(brs->fd, 1, 1); | |
43 | brs->nl = read(brs->fd, brs->b, k); | |
44 | if (brs->nl >= 0) break; | |
45 | } | |
46 | if (brs->nl < 0) return(nbytes-nb); | |
47 | } | |
48 | if (brs->nl == 0) return(nbytes-nb); | |
49 | brs->next = brs->b + brs->nl; | |
50 | brs->nr = 0; | |
51 | } | |
52 | *--buff = *--brs->next; | |
53 | brs->nr++; | |
54 | brs->nl--; | |
55 | } | |
56 | } | |
57 | return(nbytes); | |
58 | } | |
59 | ||
60 | blseek(brs, offset, flag) | |
61 | struct brbuf *brs; long offset; { | |
62 | brs->nl = 0; | |
63 | brs->nr = 0; | |
64 | return(lseek(brs->fd,offset,flag)); | |
65 | } | |
66 | ||
67 | binit(brs) | |
68 | struct brbuf *brs; { | |
69 | brs->nl = brs->nr = 0; | |
70 | } |