Blob
1 #include "lib9.h"2 #include <bio.h>4 long5 Bread(Biobuf *bp, void *ap, long count)6 {7 long c;8 unsigned char *p;9 int i, n, ic;11 p = ap;12 c = count;13 ic = bp->icount;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 }