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 }