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