|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <flate.h> | 
|  |  | 
|  | typedef struct Block	Block; | 
|  |  | 
|  | struct Block | 
|  | { | 
|  | uchar	*pos; | 
|  | uchar	*limit; | 
|  | }; | 
|  |  | 
|  | static int | 
|  | blgetc(void *vb) | 
|  | { | 
|  | Block *b; | 
|  |  | 
|  | b = vb; | 
|  | if(b->pos >= b->limit) | 
|  | return -1; | 
|  | return *b->pos++; | 
|  | } | 
|  |  | 
|  | static int | 
|  | blwrite(void *vb, void *buf, int n) | 
|  | { | 
|  | Block *b; | 
|  |  | 
|  | b = vb; | 
|  |  | 
|  | if(n > b->limit - b->pos) | 
|  | n = b->limit - b->pos; | 
|  | memmove(b->pos, buf, n); | 
|  | b->pos += n; | 
|  | return n; | 
|  | } | 
|  |  | 
|  | int | 
|  | inflateblock(uchar *dst, int dsize, uchar *src, int ssize) | 
|  | { | 
|  | Block bd, bs; | 
|  | int ok; | 
|  |  | 
|  | bs.pos = src; | 
|  | bs.limit = src + ssize; | 
|  |  | 
|  | bd.pos = dst; | 
|  | bd.limit = dst + dsize; | 
|  |  | 
|  | ok = inflate(&bd, blwrite, &bs, blgetc); | 
|  | if(ok != FlateOk) | 
|  | return ok; | 
|  | return bd.pos - dst; | 
|  | } |