bread.c - 9base - revived minimalist port of Plan 9 userland to Unix
(HTM) git clone git://git.suckless.org/9base
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
bread.c (681B)
---
1 #include "lib9.h"
2 #include <bio.h>
3
4 long
5 Bread(Biobuf *bp, void *ap, long count)
6 {
7 long c;
8 unsigned char *p;
9 int i, n, ic;
10
11 p = ap;
12 c = count;
13 ic = bp->icount;
14
15 while(c > 0) {
16 n = -ic;
17 if(n > c)
18 n = c;
19 if(n == 0) {
20 if(bp->state != Bractive)
21 break;
22 i = read(bp->fid, bp->bbuf, bp->bsize);
23 if(i <= 0) {
24 bp->state = Bracteof;
25 if(i < 0)
26 bp->state = Binactive;
27 break;
28 }
29 bp->gbuf = bp->bbuf;
30 bp->offset += i;
31 if(i < bp->bsize) {
32 memmove(bp->ebuf-i, bp->bbuf, i);
33 bp->gbuf = bp->ebuf-i;
34 }
35 ic = -i;
36 continue;
37 }
38 memmove(p, bp->ebuf+ic, n);
39 c -= n;
40 ic += n;
41 p += n;
42 }
43 bp->icount = ic;
44 return count-c;
45 }