Blob
1 #include <u.h>2 #include <libc.h>3 #include <flate.h>5 typedef struct Block Block;7 struct Block8 {9 uchar *pos;10 uchar *limit;11 };13 static int14 blgetc(void *vb)15 {16 Block *b;18 b = vb;19 if(b->pos >= b->limit)20 return -1;21 return *b->pos++;22 }24 static int25 blwrite(void *vb, void *buf, int n)26 {27 Block *b;29 b = vb;31 if(n > b->limit - b->pos)32 n = b->limit - b->pos;33 memmove(b->pos, buf, n);34 b->pos += n;35 return n;36 }38 int39 inflateblock(uchar *dst, int dsize, uchar *src, int ssize)40 {41 Block bd, bs;42 int ok;44 bs.pos = src;45 bs.limit = src + ssize;47 bd.pos = dst;48 bd.limit = dst + dsize;50 ok = inflate(&bd, blwrite, &bs, blgetc);51 if(ok != FlateOk)52 return ok;53 return bd.pos - dst;54 }