Blame


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