xref: /inferno-os/os/boot/libflate/inflateblock.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
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
blgetc(void * vb)13 blgetc(void *vb)
14 {
15 	Block *b;
16 
17 	b = vb;
18 	if(b->pos >= b->limit)
19 		return -1;
20 	return *b->pos++;
21 }
22 
23 static int
blwrite(void * vb,void * buf,int n)24 blwrite(void *vb, void *buf, int n)
25 {
26 	Block *b;
27 
28 	b = vb;
29 
30 	if(n > b->limit - b->pos)
31 		n = b->limit - b->pos;
32 	memmove(b->pos, buf, n);
33 	b->pos += n;
34 	return n;
35 }
36 
37 int
inflateblock(uchar * dst,int dsize,uchar * src,int ssize)38 inflateblock(uchar *dst, int dsize, uchar *src, int ssize)
39 {
40 	Block bd, bs;
41 	int ok;
42 
43 	bs.pos = src;
44 	bs.limit = src + ssize;
45 
46 	bd.pos = dst;
47 	bd.limit = dst + dsize;
48 
49 	ok = inflate(&bd, blwrite, &bs, blgetc);
50 	if(ok != FlateOk)
51 		return ok;
52 	return bd.pos - dst;
53 }
54