1 #include "lib9.h"
2 #include <flate.h>
3
4 typedef struct Block Block;
5
6 struct Block
7 {
8 uchar *pos;
9 uchar *limit;
10 };
11
12 static int
blgetc(void * vb)13 blgetc(void *vb)
14 {
15 Block *b;
16
17 b = vb;
18 if(b->pos >= b->limit)
19 return -1;
20 return *b->pos++;
21 }
22
23 static int
blwrite(void * vb,void * buf,int n)24 blwrite(void *vb, void *buf, int n)
25 {
26 Block *b;
27
28 b = vb;
29
30 if(n > b->limit - b->pos)
31 n = b->limit - b->pos;
32 memmove(b->pos, buf, n);
33 b->pos += n;
34 return n;
35 }
36
37 int
inflateblock(uchar * dst,int dsize,uchar * src,int ssize)38 inflateblock(uchar *dst, int dsize, uchar *src, int ssize)
39 {
40 Block bd, bs;
41 int ok;
42
43 bs.pos = src;
44 bs.limit = src + ssize;
45
46 bd.pos = dst;
47 bd.limit = dst + dsize;
48
49 ok = inflate(&bd, blwrite, &bs, blgetc);
50 if(ok != FlateOk)
51 return ok;
52 return bd.pos - dst;
53 }
54