Bell 32V development
[unix-history] / usr / src / cmd / sdb / bio.c
CommitLineData
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
17bread(brs, buff, nbytes)
18struct 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
60blseek(brs, offset, flag)
61struct brbuf *brs; long offset; {
62 brs->nl = 0;
63 brs->nr = 0;
64 return(lseek(brs->fd,offset,flag));
65 }
66
67binit(brs)
68struct brbuf *brs; {
69 brs->nl = brs->nr = 0;
70}