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 #include "zlib.h"
5 b6afd33e 2003-11-23 devnull
6 b6afd33e 2003-11-23 devnull typedef struct ZRead ZRead;
7 b6afd33e 2003-11-23 devnull
8 b6afd33e 2003-11-23 devnull struct ZRead
9 b6afd33e 2003-11-23 devnull {
10 b6afd33e 2003-11-23 devnull ulong adler;
11 b6afd33e 2003-11-23 devnull void *rr;
12 b6afd33e 2003-11-23 devnull int (*r)(void*, void*, int);
13 b6afd33e 2003-11-23 devnull };
14 b6afd33e 2003-11-23 devnull
15 b6afd33e 2003-11-23 devnull static int
16 b6afd33e 2003-11-23 devnull zlread(void *vzr, void *buf, int n)
17 b6afd33e 2003-11-23 devnull {
18 b6afd33e 2003-11-23 devnull ZRead *zr;
19 b6afd33e 2003-11-23 devnull
20 b6afd33e 2003-11-23 devnull zr = vzr;
21 b6afd33e 2003-11-23 devnull n = (*zr->r)(zr->rr, buf, n);
22 b6afd33e 2003-11-23 devnull if(n <= 0)
23 b6afd33e 2003-11-23 devnull return n;
24 b6afd33e 2003-11-23 devnull zr->adler = adler32(zr->adler, buf, n);
25 b6afd33e 2003-11-23 devnull return n;
26 b6afd33e 2003-11-23 devnull }
27 b6afd33e 2003-11-23 devnull
28 b6afd33e 2003-11-23 devnull int
29 b6afd33e 2003-11-23 devnull deflatezlib(void *wr, int (*w)(void*, void*, int), void *rr, int (*r)(void*, void*, int), int level, int debug)
30 b6afd33e 2003-11-23 devnull {
31 b6afd33e 2003-11-23 devnull ZRead zr;
32 b6afd33e 2003-11-23 devnull uchar buf[4];
33 b6afd33e 2003-11-23 devnull int ok;
34 b6afd33e 2003-11-23 devnull
35 b6afd33e 2003-11-23 devnull buf[0] = ZlibDeflate | ZlibWin32k;
36 b6afd33e 2003-11-23 devnull
37 b6afd33e 2003-11-23 devnull /* bogus zlib encoding of compression level */
38 b6afd33e 2003-11-23 devnull buf[1] = ((level > 2) + (level > 5) + (level > 8)) << 6;
39 b6afd33e 2003-11-23 devnull
40 b6afd33e 2003-11-23 devnull /* header check field */
41 b6afd33e 2003-11-23 devnull buf[1] |= 31 - ((buf[0] << 8) | buf[1]) % 31;
42 b6afd33e 2003-11-23 devnull if((*w)(wr, buf, 2) != 2)
43 b6afd33e 2003-11-23 devnull return FlateOutputFail;
44 b6afd33e 2003-11-23 devnull
45 b6afd33e 2003-11-23 devnull zr.rr = rr;
46 b6afd33e 2003-11-23 devnull zr.r = r;
47 b6afd33e 2003-11-23 devnull zr.adler = 1;
48 b6afd33e 2003-11-23 devnull ok = deflate(wr, w, &zr, zlread, level, debug);
49 b6afd33e 2003-11-23 devnull if(ok != FlateOk)
50 b6afd33e 2003-11-23 devnull return ok;
51 b6afd33e 2003-11-23 devnull
52 b6afd33e 2003-11-23 devnull buf[0] = zr.adler >> 24;
53 b6afd33e 2003-11-23 devnull buf[1] = zr.adler >> 16;
54 b6afd33e 2003-11-23 devnull buf[2] = zr.adler >> 8;
55 b6afd33e 2003-11-23 devnull buf[3] = zr.adler;
56 b6afd33e 2003-11-23 devnull if((*w)(wr, buf, 4) != 4)
57 b6afd33e 2003-11-23 devnull return FlateOutputFail;
58 b6afd33e 2003-11-23 devnull
59 b6afd33e 2003-11-23 devnull return FlateOk;
60 b6afd33e 2003-11-23 devnull }