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 }