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