|
|
1.1 ! root 1: #include <pagsiz.h> ! 2: #include "bio.h" ! 3: ! 4: /* ! 5: * NAMES: bread(), brseek(), blseek() ! 6: * ! 7: * DESCRIPTION: ! 8: * This is a buffered read package. ! 9: * ! 10: * Bread may be called with a negative nbytes which causes it to ! 11: * read backwards. In this case, buffer should point to the first ! 12: * byte following the buffer. If only a partial read is possible ! 13: * (due to beginning of file), only the last bytes of the buffer ! 14: * will be filled. ! 15: */ ! 16: ! 17: ! 18: bread(brs, buff, nbytes) ! 19: struct brbuf *brs; char *buff; { ! 20: register int k, nb; ! 21: ! 22: if (nbytes > 0) { ! 23: for (nb=nbytes; nb>0; nb--) { ! 24: if (brs->nr == 0) { ! 25: brs->nr = read(brs->fd, brs->next=brs->b, BSIZE); ! 26: brs->nl = 0; ! 27: if (brs->nr < 0) return(-1); ! 28: if (brs->nr == 0) return(nbytes-nb); ! 29: } ! 30: *buff++ = *brs->next++; ! 31: brs->nr--; ! 32: brs->nl++; ! 33: } ! 34: } ! 35: else { ! 36: nbytes = -nbytes; ! 37: for (nb=nbytes; nb>0; nb--) { ! 38: if (brs->nl == 0) { ! 39: if ((k=tell(brs->fd)) >= BSIZE + brs->nr) { ! 40: lseek(brs->fd, (long) -(BSIZE + brs->nr), 1); ! 41: brs->nl = read(brs->fd, brs->b, BSIZE); ! 42: } else { ! 43: lseek(brs->fd, 0L, 0); ! 44: k = k - brs->nr; ! 45: if (k < 0) k = 0; ! 46: brs->nl = read(brs->fd, brs->b, k); ! 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: } ! 71: ! 72: long ! 73: tell(fildes) { ! 74: return(lseek(fildes, 0L, 1)); ! 75: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.