#include "lib9.h" | |
#include <bio.h> | |
long | |
Bread(Biobuf *bp, void *ap, long count) | |
{ | |
long c; | |
unsigned char *p; | |
int i, n, ic; | |
p = ap; | |
c = count; | |
ic = bp->icount; | |
while(c > 0) { | |
n = -ic; | |
if(n > c) | |
n = c; | |
if(n == 0) { | |
if(bp->state != Bractive) | |
break; | |
i = read(bp->fid, bp->bbuf, bp->bsize); | |
if(i <= 0) { | |
bp->state = Bracteof; | |
if(i < 0) | |
bp->state = Binactive; | |
break; | |
} | |
bp->gbuf = bp->bbuf; | |
bp->offset += i; | |
if(i < bp->bsize) { | |
memmove(bp->ebuf-i, bp->bbuf, i); | |
bp->gbuf = bp->ebuf-i; | |
} | |
ic = -i; | |
continue; | |
} | |
memmove(p, bp->ebuf+ic, n); | |
c -= n; | |
ic += n; | |
p += n; | |
} | |
bp->icount = ic; | |
return count-c; | |
} |