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
blread(void * vb,void * buf,int n)13 blread(void *vb, void *buf, int n)
14 {
15 Block *b;
16
17 b = vb;
18 if(n > b->limit - b->pos)
19 n = b->limit - b->pos;
20 memmove(buf, b->pos, n);
21 b->pos += n;
22 return n;
23 }
24
25 static int
blwrite(void * vb,void * buf,int n)26 blwrite(void *vb, void *buf, int n)
27 {
28 Block *b;
29
30 b = vb;
31
32 if(n > b->limit - b->pos)
33 n = b->limit - b->pos;
34 memmove(b->pos, buf, n);
35 b->pos += n;
36 return n;
37 }
38
39 int
deflateblock(uchar * dst,int dsize,uchar * src,int ssize,int level,int debug)40 deflateblock(uchar *dst, int dsize, uchar *src, int ssize, int level, int debug)
41 {
42 Block bd, bs;
43 int ok;
44
45 bs.pos = src;
46 bs.limit = src + ssize;
47
48 bd.pos = dst;
49 bd.limit = dst + dsize;
50
51 ok = deflate(&bd, blwrite, &bs, blread, level, debug);
52 if(ok != FlateOk)
53 return ok;
54 return bd.pos - dst;
55 }
56