xref: /plan9/sys/src/libbio/bread.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier long
Bread(Biobufhdr * bp,void * ap,long count)63e12c5d1SDavid du Colombier Bread(Biobufhdr *bp, void *ap, long count)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	long c;
93e12c5d1SDavid du Colombier 	uchar *p;
103e12c5d1SDavid du Colombier 	int i, n, ic;
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier 	p = ap;
133e12c5d1SDavid du Colombier 	c = count;
143e12c5d1SDavid du Colombier 	ic = bp->icount;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier 	while(c > 0) {
173e12c5d1SDavid du Colombier 		n = -ic;
183e12c5d1SDavid du Colombier 		if(n > c)
193e12c5d1SDavid du Colombier 			n = c;
203e12c5d1SDavid du Colombier 		if(n == 0) {
213e12c5d1SDavid du Colombier 			if(bp->state != Bractive)
223e12c5d1SDavid du Colombier 				break;
233e12c5d1SDavid du Colombier 			i = read(bp->fid, bp->bbuf, bp->bsize);
243e12c5d1SDavid du Colombier 			if(i <= 0) {
253e12c5d1SDavid du Colombier 				bp->state = Bracteof;
263e12c5d1SDavid du Colombier 				if(i < 0)
273e12c5d1SDavid du Colombier 					bp->state = Binactive;
283e12c5d1SDavid du Colombier 				break;
293e12c5d1SDavid du Colombier 			}
30219b2ee8SDavid du Colombier 			bp->gbuf = bp->bbuf;
313e12c5d1SDavid du Colombier 			bp->offset += i;
32219b2ee8SDavid du Colombier 			if(i < bp->bsize) {
333e12c5d1SDavid du Colombier 				memmove(bp->ebuf-i, bp->bbuf, i);
34219b2ee8SDavid du Colombier 				bp->gbuf = bp->ebuf-i;
35219b2ee8SDavid du Colombier 			}
363e12c5d1SDavid du Colombier 			ic = -i;
373e12c5d1SDavid du Colombier 			continue;
383e12c5d1SDavid du Colombier 		}
393e12c5d1SDavid du Colombier 		memmove(p, bp->ebuf+ic, n);
403e12c5d1SDavid du Colombier 		c -= n;
413e12c5d1SDavid du Colombier 		ic += n;
423e12c5d1SDavid du Colombier 		p += n;
433e12c5d1SDavid du Colombier 	}
443e12c5d1SDavid du Colombier 	bp->icount = ic;
45*59cc4ca5SDavid du Colombier 	if(count == c && bp->state == Binactive)
46*59cc4ca5SDavid du Colombier 		return -1;
473e12c5d1SDavid du Colombier 	return count-c;
483e12c5d1SDavid du Colombier }
49