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