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
5 b6afd33e 2003-11-23 devnull enum {
6 b6afd33e 2003-11-23 devnull HistorySize= 32*1024,
7 b6afd33e 2003-11-23 devnull BufSize= 4*1024,
8 b6afd33e 2003-11-23 devnull MaxHuffBits= 17, /* maximum bits in a encoded code */
9 b6afd33e 2003-11-23 devnull Nlitlen= 288, /* number of litlen codes */
10 b6afd33e 2003-11-23 devnull Noff= 32, /* number of offset codes */
11 b6afd33e 2003-11-23 devnull Nclen= 19, /* number of codelen codes */
12 b6afd33e 2003-11-23 devnull LenShift= 10, /* code = len<<LenShift|code */
13 b6afd33e 2003-11-23 devnull LitlenBits= 7, /* number of bits in litlen decode table */
14 b6afd33e 2003-11-23 devnull OffBits= 6, /* number of bits in offset decode table */
15 b6afd33e 2003-11-23 devnull ClenBits= 6, /* number of bits in code len decode table */
16 b6afd33e 2003-11-23 devnull MaxFlatBits= LitlenBits,
17 b6afd33e 2003-11-23 devnull MaxLeaf= Nlitlen
18 b6afd33e 2003-11-23 devnull };
19 b6afd33e 2003-11-23 devnull
20 b6afd33e 2003-11-23 devnull typedef struct Input Input;
21 b6afd33e 2003-11-23 devnull typedef struct History History;
22 b6afd33e 2003-11-23 devnull typedef struct Huff Huff;
23 b6afd33e 2003-11-23 devnull
24 b6afd33e 2003-11-23 devnull struct Input
25 b6afd33e 2003-11-23 devnull {
26 b6afd33e 2003-11-23 devnull int error; /* first error encountered, or FlateOk */
27 b6afd33e 2003-11-23 devnull void *wr;
28 b6afd33e 2003-11-23 devnull int (*w)(void*, void*, int);
29 b6afd33e 2003-11-23 devnull void *getr;
30 b6afd33e 2003-11-23 devnull int (*get)(void*);
31 b6afd33e 2003-11-23 devnull ulong sreg;
32 b6afd33e 2003-11-23 devnull int nbits;
33 b6afd33e 2003-11-23 devnull };
34 b6afd33e 2003-11-23 devnull
35 b6afd33e 2003-11-23 devnull struct History
36 b6afd33e 2003-11-23 devnull {
37 b6afd33e 2003-11-23 devnull uchar his[HistorySize];
38 b6afd33e 2003-11-23 devnull uchar *cp; /* current pointer in history */
39 b6afd33e 2003-11-23 devnull int full; /* his has been filled up at least once */
40 b6afd33e 2003-11-23 devnull };
41 b6afd33e 2003-11-23 devnull
42 b6afd33e 2003-11-23 devnull struct Huff
43 b6afd33e 2003-11-23 devnull {
44 b6afd33e 2003-11-23 devnull int maxbits; /* max bits for any code */
45 b6afd33e 2003-11-23 devnull int minbits; /* min bits to get before looking in flat */
46 b6afd33e 2003-11-23 devnull int flatmask; /* bits used in "flat" fast decoding table */
47 b6afd33e 2003-11-23 devnull ulong flat[1<<MaxFlatBits];
48 b6afd33e 2003-11-23 devnull ulong maxcode[MaxHuffBits];
49 b6afd33e 2003-11-23 devnull ulong last[MaxHuffBits];
50 b6afd33e 2003-11-23 devnull ulong decode[MaxLeaf];
51 b6afd33e 2003-11-23 devnull };
52 b6afd33e 2003-11-23 devnull
53 b6afd33e 2003-11-23 devnull /* litlen code words 257-285 extra bits */
54 b6afd33e 2003-11-23 devnull static int litlenextra[Nlitlen-257] =
55 b6afd33e 2003-11-23 devnull {
56 b6afd33e 2003-11-23 devnull /* 257 */ 0, 0, 0,
57 b6afd33e 2003-11-23 devnull /* 260 */ 0, 0, 0, 0, 0, 1, 1, 1, 1, 2,
58 b6afd33e 2003-11-23 devnull /* 270 */ 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,
59 b6afd33e 2003-11-23 devnull /* 280 */ 4, 5, 5, 5, 5, 0, 0, 0
60 b6afd33e 2003-11-23 devnull };
61 b6afd33e 2003-11-23 devnull
62 b6afd33e 2003-11-23 devnull static int litlenbase[Nlitlen-257];
63 b6afd33e 2003-11-23 devnull
64 b6afd33e 2003-11-23 devnull /* offset code word extra bits */
65 b6afd33e 2003-11-23 devnull static int offextra[Noff] =
66 b6afd33e 2003-11-23 devnull {
67 b6afd33e 2003-11-23 devnull 0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
68 b6afd33e 2003-11-23 devnull 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
69 b6afd33e 2003-11-23 devnull 9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
70 b6afd33e 2003-11-23 devnull 0, 0,
71 b6afd33e 2003-11-23 devnull };
72 b6afd33e 2003-11-23 devnull static int offbase[Noff];
73 b6afd33e 2003-11-23 devnull
74 b6afd33e 2003-11-23 devnull /* order code lengths */
75 b6afd33e 2003-11-23 devnull static int clenorder[Nclen] =
76 b6afd33e 2003-11-23 devnull {
77 b6afd33e 2003-11-23 devnull 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
78 b6afd33e 2003-11-23 devnull };
79 b6afd33e 2003-11-23 devnull
80 b6afd33e 2003-11-23 devnull /* for static huffman tables */
81 b6afd33e 2003-11-23 devnull static Huff litlentab;
82 b6afd33e 2003-11-23 devnull static Huff offtab;
83 b6afd33e 2003-11-23 devnull static uchar revtab[256];
84 b6afd33e 2003-11-23 devnull
85 b6afd33e 2003-11-23 devnull static int uncblock(Input *in, History*);
86 b6afd33e 2003-11-23 devnull static int fixedblock(Input *in, History*);
87 b6afd33e 2003-11-23 devnull static int dynamicblock(Input *in, History*);
88 b6afd33e 2003-11-23 devnull static int sregfill(Input *in, int n);
89 b6afd33e 2003-11-23 devnull static int sregunget(Input *in);
90 b6afd33e 2003-11-23 devnull static int decode(Input*, History*, Huff*, Huff*);
91 b6afd33e 2003-11-23 devnull static int hufftab(Huff*, char*, int, int);
92 b6afd33e 2003-11-23 devnull static int hdecsym(Input *in, Huff *h, int b);
93 b6afd33e 2003-11-23 devnull
94 b6afd33e 2003-11-23 devnull int
95 b6afd33e 2003-11-23 devnull inflateinit(void)
96 b6afd33e 2003-11-23 devnull {
97 b6afd33e 2003-11-23 devnull char *len;
98 b6afd33e 2003-11-23 devnull int i, j, base;
99 b6afd33e 2003-11-23 devnull
100 b6afd33e 2003-11-23 devnull /* byte reverse table */
101 b6afd33e 2003-11-23 devnull for(i=0; i<256; i++)
102 b6afd33e 2003-11-23 devnull for(j=0; j<8; j++)
103 b6afd33e 2003-11-23 devnull if(i & (1<<j))
104 b6afd33e 2003-11-23 devnull revtab[i] |= 0x80 >> j;
105 b6afd33e 2003-11-23 devnull
106 b6afd33e 2003-11-23 devnull for(i=257,base=3; i<Nlitlen; i++) {
107 b6afd33e 2003-11-23 devnull litlenbase[i-257] = base;
108 b6afd33e 2003-11-23 devnull base += 1<<litlenextra[i-257];
109 b6afd33e 2003-11-23 devnull }
110 b6afd33e 2003-11-23 devnull /* strange table entry in spec... */
111 b6afd33e 2003-11-23 devnull litlenbase[285-257]--;
112 b6afd33e 2003-11-23 devnull
113 b6afd33e 2003-11-23 devnull for(i=0,base=1; i<Noff; i++) {
114 b6afd33e 2003-11-23 devnull offbase[i] = base;
115 b6afd33e 2003-11-23 devnull base += 1<<offextra[i];
116 b6afd33e 2003-11-23 devnull }
117 b6afd33e 2003-11-23 devnull
118 b6afd33e 2003-11-23 devnull len = malloc(MaxLeaf);
119 b6afd33e 2003-11-23 devnull if(len == nil)
120 b6afd33e 2003-11-23 devnull return FlateNoMem;
121 b6afd33e 2003-11-23 devnull
122 b6afd33e 2003-11-23 devnull /* static Litlen bit lengths */
123 b6afd33e 2003-11-23 devnull for(i=0; i<144; i++)
124 b6afd33e 2003-11-23 devnull len[i] = 8;
125 b6afd33e 2003-11-23 devnull for(i=144; i<256; i++)
126 b6afd33e 2003-11-23 devnull len[i] = 9;
127 b6afd33e 2003-11-23 devnull for(i=256; i<280; i++)
128 b6afd33e 2003-11-23 devnull len[i] = 7;
129 b6afd33e 2003-11-23 devnull for(i=280; i<Nlitlen; i++)
130 b6afd33e 2003-11-23 devnull len[i] = 8;
131 b6afd33e 2003-11-23 devnull
132 b6afd33e 2003-11-23 devnull if(!hufftab(&litlentab, len, Nlitlen, MaxFlatBits))
133 b6afd33e 2003-11-23 devnull return FlateInternal;
134 b6afd33e 2003-11-23 devnull
135 b6afd33e 2003-11-23 devnull /* static Offset bit lengths */
136 b6afd33e 2003-11-23 devnull for(i=0; i<Noff; i++)
137 b6afd33e 2003-11-23 devnull len[i] = 5;
138 b6afd33e 2003-11-23 devnull
139 b6afd33e 2003-11-23 devnull if(!hufftab(&offtab, len, Noff, MaxFlatBits))
140 b6afd33e 2003-11-23 devnull return FlateInternal;
141 b6afd33e 2003-11-23 devnull free(len);
142 b6afd33e 2003-11-23 devnull
143 b6afd33e 2003-11-23 devnull return FlateOk;
144 b6afd33e 2003-11-23 devnull }
145 b6afd33e 2003-11-23 devnull
146 b6afd33e 2003-11-23 devnull int
147 b6afd33e 2003-11-23 devnull inflate(void *wr, int (*w)(void*, void*, int), void *getr, int (*get)(void*))
148 b6afd33e 2003-11-23 devnull {
149 b6afd33e 2003-11-23 devnull History *his;
150 b6afd33e 2003-11-23 devnull Input in;
151 b6afd33e 2003-11-23 devnull int final, type;
152 b6afd33e 2003-11-23 devnull
153 b6afd33e 2003-11-23 devnull his = malloc(sizeof(History));
154 b6afd33e 2003-11-23 devnull if(his == nil)
155 b6afd33e 2003-11-23 devnull return FlateNoMem;
156 b6afd33e 2003-11-23 devnull his->cp = his->his;
157 b6afd33e 2003-11-23 devnull his->full = 0;
158 b6afd33e 2003-11-23 devnull in.getr = getr;
159 b6afd33e 2003-11-23 devnull in.get = get;
160 b6afd33e 2003-11-23 devnull in.wr = wr;
161 b6afd33e 2003-11-23 devnull in.w = w;
162 b6afd33e 2003-11-23 devnull in.nbits = 0;
163 b6afd33e 2003-11-23 devnull in.sreg = 0;
164 b6afd33e 2003-11-23 devnull in.error = FlateOk;
165 b6afd33e 2003-11-23 devnull
166 b6afd33e 2003-11-23 devnull do {
167 b6afd33e 2003-11-23 devnull if(!sregfill(&in, 3))
168 b6afd33e 2003-11-23 devnull goto bad;
169 b6afd33e 2003-11-23 devnull final = in.sreg & 0x1;
170 b6afd33e 2003-11-23 devnull type = (in.sreg>>1) & 0x3;
171 b6afd33e 2003-11-23 devnull in.sreg >>= 3;
172 b6afd33e 2003-11-23 devnull in.nbits -= 3;
173 b6afd33e 2003-11-23 devnull switch(type) {
174 b6afd33e 2003-11-23 devnull default:
175 b6afd33e 2003-11-23 devnull in.error = FlateCorrupted;
176 b6afd33e 2003-11-23 devnull goto bad;
177 b6afd33e 2003-11-23 devnull case 0:
178 b6afd33e 2003-11-23 devnull /* uncompressed */
179 b6afd33e 2003-11-23 devnull if(!uncblock(&in, his))
180 b6afd33e 2003-11-23 devnull goto bad;
181 b6afd33e 2003-11-23 devnull break;
182 b6afd33e 2003-11-23 devnull case 1:
183 b6afd33e 2003-11-23 devnull /* fixed huffman */
184 b6afd33e 2003-11-23 devnull if(!fixedblock(&in, his))
185 b6afd33e 2003-11-23 devnull goto bad;
186 b6afd33e 2003-11-23 devnull break;
187 b6afd33e 2003-11-23 devnull case 2:
188 b6afd33e 2003-11-23 devnull /* dynamic huffman */
189 b6afd33e 2003-11-23 devnull if(!dynamicblock(&in, his))
190 b6afd33e 2003-11-23 devnull goto bad;
191 b6afd33e 2003-11-23 devnull break;
192 b6afd33e 2003-11-23 devnull }
193 b6afd33e 2003-11-23 devnull } while(!final);
194 b6afd33e 2003-11-23 devnull
195 b6afd33e 2003-11-23 devnull if(his->cp != his->his && (*w)(wr, his->his, his->cp - his->his) != his->cp - his->his) {
196 b6afd33e 2003-11-23 devnull in.error = FlateOutputFail;
197 b6afd33e 2003-11-23 devnull goto bad;
198 b6afd33e 2003-11-23 devnull }
199 b6afd33e 2003-11-23 devnull
200 b6afd33e 2003-11-23 devnull if(!sregunget(&in))
201 b6afd33e 2003-11-23 devnull goto bad;
202 b6afd33e 2003-11-23 devnull
203 b6afd33e 2003-11-23 devnull free(his);
204 b6afd33e 2003-11-23 devnull if(in.error != FlateOk)
205 b6afd33e 2003-11-23 devnull return FlateInternal;
206 b6afd33e 2003-11-23 devnull return FlateOk;
207 b6afd33e 2003-11-23 devnull
208 b6afd33e 2003-11-23 devnull bad:
209 b6afd33e 2003-11-23 devnull free(his);
210 b6afd33e 2003-11-23 devnull if(in.error == FlateOk)
211 b6afd33e 2003-11-23 devnull return FlateInternal;
212 b6afd33e 2003-11-23 devnull return in.error;
213 b6afd33e 2003-11-23 devnull }
214 b6afd33e 2003-11-23 devnull
215 b6afd33e 2003-11-23 devnull static int
216 b6afd33e 2003-11-23 devnull uncblock(Input *in, History *his)
217 b6afd33e 2003-11-23 devnull {
218 b6afd33e 2003-11-23 devnull int len, nlen, c;
219 b6afd33e 2003-11-23 devnull uchar *hs, *hp, *he;
220 b6afd33e 2003-11-23 devnull
221 b6afd33e 2003-11-23 devnull if(!sregunget(in))
222 b6afd33e 2003-11-23 devnull return 0;
223 b6afd33e 2003-11-23 devnull len = (*in->get)(in->getr);
224 b6afd33e 2003-11-23 devnull len |= (*in->get)(in->getr)<<8;
225 b6afd33e 2003-11-23 devnull nlen = (*in->get)(in->getr);
226 b6afd33e 2003-11-23 devnull nlen |= (*in->get)(in->getr)<<8;
227 b6afd33e 2003-11-23 devnull if(len != (~nlen&0xffff)) {
228 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
229 b6afd33e 2003-11-23 devnull return 0;
230 b6afd33e 2003-11-23 devnull }
231 b6afd33e 2003-11-23 devnull
232 b6afd33e 2003-11-23 devnull hp = his->cp;
233 b6afd33e 2003-11-23 devnull hs = his->his;
234 b6afd33e 2003-11-23 devnull he = hs + HistorySize;
235 b6afd33e 2003-11-23 devnull
236 b6afd33e 2003-11-23 devnull while(len > 0) {
237 b6afd33e 2003-11-23 devnull c = (*in->get)(in->getr);
238 b6afd33e 2003-11-23 devnull if(c < 0)
239 b6afd33e 2003-11-23 devnull return 0;
240 b6afd33e 2003-11-23 devnull *hp++ = c;
241 b6afd33e 2003-11-23 devnull if(hp == he) {
242 b6afd33e 2003-11-23 devnull his->full = 1;
243 b6afd33e 2003-11-23 devnull if((*in->w)(in->wr, hs, HistorySize) != HistorySize) {
244 b6afd33e 2003-11-23 devnull in->error = FlateOutputFail;
245 b6afd33e 2003-11-23 devnull return 0;
246 b6afd33e 2003-11-23 devnull }
247 b6afd33e 2003-11-23 devnull hp = hs;
248 b6afd33e 2003-11-23 devnull }
249 b6afd33e 2003-11-23 devnull len--;
250 b6afd33e 2003-11-23 devnull }
251 b6afd33e 2003-11-23 devnull
252 b6afd33e 2003-11-23 devnull his->cp = hp;
253 b6afd33e 2003-11-23 devnull
254 b6afd33e 2003-11-23 devnull return 1;
255 b6afd33e 2003-11-23 devnull }
256 b6afd33e 2003-11-23 devnull
257 b6afd33e 2003-11-23 devnull static int
258 b6afd33e 2003-11-23 devnull fixedblock(Input *in, History *his)
259 b6afd33e 2003-11-23 devnull {
260 b6afd33e 2003-11-23 devnull return decode(in, his, &litlentab, &offtab);
261 b6afd33e 2003-11-23 devnull }
262 b6afd33e 2003-11-23 devnull
263 b6afd33e 2003-11-23 devnull static int
264 b6afd33e 2003-11-23 devnull dynamicblock(Input *in, History *his)
265 b6afd33e 2003-11-23 devnull {
266 b6afd33e 2003-11-23 devnull Huff *lentab, *offtab;
267 b6afd33e 2003-11-23 devnull char *len;
268 b6afd33e 2003-11-23 devnull int i, j, n, c, nlit, ndist, nclen, res, nb;
269 b6afd33e 2003-11-23 devnull
270 b6afd33e 2003-11-23 devnull if(!sregfill(in, 14))
271 b6afd33e 2003-11-23 devnull return 0;
272 b6afd33e 2003-11-23 devnull nlit = (in->sreg&0x1f) + 257;
273 b6afd33e 2003-11-23 devnull ndist = ((in->sreg>>5) & 0x1f) + 1;
274 b6afd33e 2003-11-23 devnull nclen = ((in->sreg>>10) & 0xf) + 4;
275 b6afd33e 2003-11-23 devnull in->sreg >>= 14;
276 b6afd33e 2003-11-23 devnull in->nbits -= 14;
277 b6afd33e 2003-11-23 devnull
278 b6afd33e 2003-11-23 devnull if(nlit > Nlitlen || ndist > Noff || nlit < 257) {
279 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
280 b6afd33e 2003-11-23 devnull return 0;
281 b6afd33e 2003-11-23 devnull }
282 b6afd33e 2003-11-23 devnull
283 b6afd33e 2003-11-23 devnull /* huff table header */
284 b6afd33e 2003-11-23 devnull len = malloc(Nlitlen+Noff);
285 b6afd33e 2003-11-23 devnull lentab = malloc(sizeof(Huff));
286 b6afd33e 2003-11-23 devnull offtab = malloc(sizeof(Huff));
287 b6afd33e 2003-11-23 devnull if(len == nil || lentab == nil || offtab == nil){
288 b6afd33e 2003-11-23 devnull in->error = FlateNoMem;
289 b6afd33e 2003-11-23 devnull goto bad;
290 b6afd33e 2003-11-23 devnull }
291 b6afd33e 2003-11-23 devnull for(i=0; i < Nclen; i++)
292 b6afd33e 2003-11-23 devnull len[i] = 0;
293 b6afd33e 2003-11-23 devnull for(i=0; i<nclen; i++) {
294 b6afd33e 2003-11-23 devnull if(!sregfill(in, 3))
295 b6afd33e 2003-11-23 devnull goto bad;
296 b6afd33e 2003-11-23 devnull len[clenorder[i]] = in->sreg & 0x7;
297 b6afd33e 2003-11-23 devnull in->sreg >>= 3;
298 b6afd33e 2003-11-23 devnull in->nbits -= 3;
299 b6afd33e 2003-11-23 devnull }
300 b6afd33e 2003-11-23 devnull
301 b6afd33e 2003-11-23 devnull if(!hufftab(lentab, len, Nclen, ClenBits)){
302 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
303 b6afd33e 2003-11-23 devnull goto bad;
304 b6afd33e 2003-11-23 devnull }
305 b6afd33e 2003-11-23 devnull
306 b6afd33e 2003-11-23 devnull n = nlit+ndist;
307 b6afd33e 2003-11-23 devnull for(i=0; i<n;) {
308 b6afd33e 2003-11-23 devnull nb = lentab->minbits;
309 b6afd33e 2003-11-23 devnull for(;;){
310 b6afd33e 2003-11-23 devnull if(in->nbits<nb && !sregfill(in, nb))
311 b6afd33e 2003-11-23 devnull goto bad;
312 b6afd33e 2003-11-23 devnull c = lentab->flat[in->sreg & lentab->flatmask];
313 b6afd33e 2003-11-23 devnull nb = c & 0xff;
314 b6afd33e 2003-11-23 devnull if(nb > in->nbits){
315 b6afd33e 2003-11-23 devnull if(nb != 0xff)
316 b6afd33e 2003-11-23 devnull continue;
317 b6afd33e 2003-11-23 devnull c = hdecsym(in, lentab, c);
318 b6afd33e 2003-11-23 devnull if(c < 0)
319 b6afd33e 2003-11-23 devnull goto bad;
320 b6afd33e 2003-11-23 devnull }else{
321 b6afd33e 2003-11-23 devnull c >>= 8;
322 b6afd33e 2003-11-23 devnull in->sreg >>= nb;
323 b6afd33e 2003-11-23 devnull in->nbits -= nb;
324 b6afd33e 2003-11-23 devnull }
325 b6afd33e 2003-11-23 devnull break;
326 b6afd33e 2003-11-23 devnull }
327 b6afd33e 2003-11-23 devnull
328 b6afd33e 2003-11-23 devnull if(c < 16) {
329 b6afd33e 2003-11-23 devnull j = 1;
330 b6afd33e 2003-11-23 devnull } else if(c == 16) {
331 b6afd33e 2003-11-23 devnull if(in->nbits<2 && !sregfill(in, 2))
332 b6afd33e 2003-11-23 devnull goto bad;
333 b6afd33e 2003-11-23 devnull j = (in->sreg&0x3)+3;
334 b6afd33e 2003-11-23 devnull in->sreg >>= 2;
335 b6afd33e 2003-11-23 devnull in->nbits -= 2;
336 b6afd33e 2003-11-23 devnull if(i == 0) {
337 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
338 b6afd33e 2003-11-23 devnull goto bad;
339 b6afd33e 2003-11-23 devnull }
340 b6afd33e 2003-11-23 devnull c = len[i-1];
341 b6afd33e 2003-11-23 devnull } else if(c == 17) {
342 b6afd33e 2003-11-23 devnull if(in->nbits<3 && !sregfill(in, 3))
343 b6afd33e 2003-11-23 devnull goto bad;
344 b6afd33e 2003-11-23 devnull j = (in->sreg&0x7)+3;
345 b6afd33e 2003-11-23 devnull in->sreg >>= 3;
346 b6afd33e 2003-11-23 devnull in->nbits -= 3;
347 b6afd33e 2003-11-23 devnull c = 0;
348 b6afd33e 2003-11-23 devnull } else if(c == 18) {
349 b6afd33e 2003-11-23 devnull if(in->nbits<7 && !sregfill(in, 7))
350 b6afd33e 2003-11-23 devnull goto bad;
351 b6afd33e 2003-11-23 devnull j = (in->sreg&0x7f)+11;
352 b6afd33e 2003-11-23 devnull in->sreg >>= 7;
353 b6afd33e 2003-11-23 devnull in->nbits -= 7;
354 b6afd33e 2003-11-23 devnull c = 0;
355 b6afd33e 2003-11-23 devnull } else {
356 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
357 b6afd33e 2003-11-23 devnull goto bad;
358 b6afd33e 2003-11-23 devnull }
359 b6afd33e 2003-11-23 devnull
360 b6afd33e 2003-11-23 devnull if(i+j > n) {
361 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
362 b6afd33e 2003-11-23 devnull goto bad;
363 b6afd33e 2003-11-23 devnull }
364 b6afd33e 2003-11-23 devnull
365 b6afd33e 2003-11-23 devnull while(j) {
366 b6afd33e 2003-11-23 devnull len[i] = c;
367 b6afd33e 2003-11-23 devnull i++;
368 b6afd33e 2003-11-23 devnull j--;
369 b6afd33e 2003-11-23 devnull }
370 b6afd33e 2003-11-23 devnull }
371 b6afd33e 2003-11-23 devnull
372 b6afd33e 2003-11-23 devnull if(!hufftab(lentab, len, nlit, LitlenBits)
373 b6afd33e 2003-11-23 devnull || !hufftab(offtab, &len[nlit], ndist, OffBits)){
374 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
375 b6afd33e 2003-11-23 devnull goto bad;
376 b6afd33e 2003-11-23 devnull }
377 b6afd33e 2003-11-23 devnull
378 b6afd33e 2003-11-23 devnull res = decode(in, his, lentab, offtab);
379 b6afd33e 2003-11-23 devnull
380 b6afd33e 2003-11-23 devnull free(len);
381 b6afd33e 2003-11-23 devnull free(lentab);
382 b6afd33e 2003-11-23 devnull free(offtab);
383 b6afd33e 2003-11-23 devnull
384 b6afd33e 2003-11-23 devnull return res;
385 b6afd33e 2003-11-23 devnull
386 b6afd33e 2003-11-23 devnull bad:
387 b6afd33e 2003-11-23 devnull free(len);
388 b6afd33e 2003-11-23 devnull free(lentab);
389 b6afd33e 2003-11-23 devnull free(offtab);
390 b6afd33e 2003-11-23 devnull return 0;
391 b6afd33e 2003-11-23 devnull }
392 b6afd33e 2003-11-23 devnull
393 b6afd33e 2003-11-23 devnull static int
394 b6afd33e 2003-11-23 devnull decode(Input *in, History *his, Huff *litlentab, Huff *offtab)
395 b6afd33e 2003-11-23 devnull {
396 b6afd33e 2003-11-23 devnull int len, off;
397 b6afd33e 2003-11-23 devnull uchar *hs, *hp, *hq, *he;
398 b6afd33e 2003-11-23 devnull int c;
399 b6afd33e 2003-11-23 devnull int nb;
400 b6afd33e 2003-11-23 devnull
401 b6afd33e 2003-11-23 devnull hs = his->his;
402 b6afd33e 2003-11-23 devnull he = hs + HistorySize;
403 b6afd33e 2003-11-23 devnull hp = his->cp;
404 b6afd33e 2003-11-23 devnull
405 b6afd33e 2003-11-23 devnull for(;;) {
406 b6afd33e 2003-11-23 devnull nb = litlentab->minbits;
407 b6afd33e 2003-11-23 devnull for(;;){
408 b6afd33e 2003-11-23 devnull if(in->nbits<nb && !sregfill(in, nb))
409 b6afd33e 2003-11-23 devnull return 0;
410 b6afd33e 2003-11-23 devnull c = litlentab->flat[in->sreg & litlentab->flatmask];
411 b6afd33e 2003-11-23 devnull nb = c & 0xff;
412 b6afd33e 2003-11-23 devnull if(nb > in->nbits){
413 b6afd33e 2003-11-23 devnull if(nb != 0xff)
414 b6afd33e 2003-11-23 devnull continue;
415 b6afd33e 2003-11-23 devnull c = hdecsym(in, litlentab, c);
416 b6afd33e 2003-11-23 devnull if(c < 0)
417 b6afd33e 2003-11-23 devnull return 0;
418 b6afd33e 2003-11-23 devnull }else{
419 b6afd33e 2003-11-23 devnull c >>= 8;
420 b6afd33e 2003-11-23 devnull in->sreg >>= nb;
421 b6afd33e 2003-11-23 devnull in->nbits -= nb;
422 b6afd33e 2003-11-23 devnull }
423 b6afd33e 2003-11-23 devnull break;
424 b6afd33e 2003-11-23 devnull }
425 b6afd33e 2003-11-23 devnull
426 b6afd33e 2003-11-23 devnull if(c < 256) {
427 b6afd33e 2003-11-23 devnull /* literal */
428 b6afd33e 2003-11-23 devnull *hp++ = c;
429 b6afd33e 2003-11-23 devnull if(hp == he) {
430 b6afd33e 2003-11-23 devnull his->full = 1;
431 b6afd33e 2003-11-23 devnull if((*in->w)(in->wr, hs, HistorySize) != HistorySize) {
432 b6afd33e 2003-11-23 devnull in->error = FlateOutputFail;
433 b6afd33e 2003-11-23 devnull return 0;
434 b6afd33e 2003-11-23 devnull }
435 b6afd33e 2003-11-23 devnull hp = hs;
436 b6afd33e 2003-11-23 devnull }
437 b6afd33e 2003-11-23 devnull continue;
438 b6afd33e 2003-11-23 devnull }
439 b6afd33e 2003-11-23 devnull
440 b6afd33e 2003-11-23 devnull if(c == 256)
441 b6afd33e 2003-11-23 devnull break;
442 b6afd33e 2003-11-23 devnull
443 b6afd33e 2003-11-23 devnull if(c > 285) {
444 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
445 b6afd33e 2003-11-23 devnull return 0;
446 b6afd33e 2003-11-23 devnull }
447 b6afd33e 2003-11-23 devnull
448 b6afd33e 2003-11-23 devnull c -= 257;
449 b6afd33e 2003-11-23 devnull nb = litlenextra[c];
450 b6afd33e 2003-11-23 devnull if(in->nbits < nb && !sregfill(in, nb))
451 b6afd33e 2003-11-23 devnull return 0;
452 b6afd33e 2003-11-23 devnull len = litlenbase[c] + (in->sreg & ((1<<nb)-1));
453 b6afd33e 2003-11-23 devnull in->sreg >>= nb;
454 b6afd33e 2003-11-23 devnull in->nbits -= nb;
455 b6afd33e 2003-11-23 devnull
456 b6afd33e 2003-11-23 devnull /* get offset */
457 b6afd33e 2003-11-23 devnull nb = offtab->minbits;
458 b6afd33e 2003-11-23 devnull for(;;){
459 b6afd33e 2003-11-23 devnull if(in->nbits<nb && !sregfill(in, nb))
460 b6afd33e 2003-11-23 devnull return 0;
461 b6afd33e 2003-11-23 devnull c = offtab->flat[in->sreg & offtab->flatmask];
462 b6afd33e 2003-11-23 devnull nb = c & 0xff;
463 b6afd33e 2003-11-23 devnull if(nb > in->nbits){
464 b6afd33e 2003-11-23 devnull if(nb != 0xff)
465 b6afd33e 2003-11-23 devnull continue;
466 b6afd33e 2003-11-23 devnull c = hdecsym(in, offtab, c);
467 b6afd33e 2003-11-23 devnull if(c < 0)
468 b6afd33e 2003-11-23 devnull return 0;
469 b6afd33e 2003-11-23 devnull }else{
470 b6afd33e 2003-11-23 devnull c >>= 8;
471 b6afd33e 2003-11-23 devnull in->sreg >>= nb;
472 b6afd33e 2003-11-23 devnull in->nbits -= nb;
473 b6afd33e 2003-11-23 devnull }
474 b6afd33e 2003-11-23 devnull break;
475 b6afd33e 2003-11-23 devnull }
476 b6afd33e 2003-11-23 devnull
477 b6afd33e 2003-11-23 devnull if(c > 29) {
478 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
479 b6afd33e 2003-11-23 devnull return 0;
480 b6afd33e 2003-11-23 devnull }
481 b6afd33e 2003-11-23 devnull
482 b6afd33e 2003-11-23 devnull nb = offextra[c];
483 b6afd33e 2003-11-23 devnull if(in->nbits < nb && !sregfill(in, nb))
484 b6afd33e 2003-11-23 devnull return 0;
485 b6afd33e 2003-11-23 devnull
486 b6afd33e 2003-11-23 devnull off = offbase[c] + (in->sreg & ((1<<nb)-1));
487 b6afd33e 2003-11-23 devnull in->sreg >>= nb;
488 b6afd33e 2003-11-23 devnull in->nbits -= nb;
489 b6afd33e 2003-11-23 devnull
490 b6afd33e 2003-11-23 devnull hq = hp - off;
491 b6afd33e 2003-11-23 devnull if(hq < hs) {
492 b6afd33e 2003-11-23 devnull if(!his->full) {
493 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
494 b6afd33e 2003-11-23 devnull return 0;
495 b6afd33e 2003-11-23 devnull }
496 b6afd33e 2003-11-23 devnull hq += HistorySize;
497 b6afd33e 2003-11-23 devnull }
498 b6afd33e 2003-11-23 devnull
499 b6afd33e 2003-11-23 devnull /* slow but correct */
500 b6afd33e 2003-11-23 devnull while(len) {
501 b6afd33e 2003-11-23 devnull *hp = *hq;
502 b6afd33e 2003-11-23 devnull hq++;
503 b6afd33e 2003-11-23 devnull hp++;
504 b6afd33e 2003-11-23 devnull if(hq >= he)
505 b6afd33e 2003-11-23 devnull hq = hs;
506 b6afd33e 2003-11-23 devnull if(hp == he) {
507 b6afd33e 2003-11-23 devnull his->full = 1;
508 b6afd33e 2003-11-23 devnull if((*in->w)(in->wr, hs, HistorySize) != HistorySize) {
509 b6afd33e 2003-11-23 devnull in->error = FlateOutputFail;
510 b6afd33e 2003-11-23 devnull return 0;
511 b6afd33e 2003-11-23 devnull }
512 b6afd33e 2003-11-23 devnull hp = hs;
513 b6afd33e 2003-11-23 devnull }
514 b6afd33e 2003-11-23 devnull len--;
515 b6afd33e 2003-11-23 devnull }
516 b6afd33e 2003-11-23 devnull
517 b6afd33e 2003-11-23 devnull }
518 b6afd33e 2003-11-23 devnull
519 b6afd33e 2003-11-23 devnull his->cp = hp;
520 b6afd33e 2003-11-23 devnull
521 b6afd33e 2003-11-23 devnull return 1;
522 b6afd33e 2003-11-23 devnull }
523 b6afd33e 2003-11-23 devnull
524 b6afd33e 2003-11-23 devnull static int
525 b6afd33e 2003-11-23 devnull revcode(int c, int b)
526 b6afd33e 2003-11-23 devnull {
527 b6afd33e 2003-11-23 devnull /* shift encode up so it starts on bit 15 then reverse */
528 b6afd33e 2003-11-23 devnull c <<= (16-b);
529 b6afd33e 2003-11-23 devnull c = revtab[c>>8] | (revtab[c&0xff]<<8);
530 b6afd33e 2003-11-23 devnull return c;
531 b6afd33e 2003-11-23 devnull }
532 b6afd33e 2003-11-23 devnull
533 b6afd33e 2003-11-23 devnull /*
534 b6afd33e 2003-11-23 devnull * construct the huffman decoding arrays and a fast lookup table.
535 b6afd33e 2003-11-23 devnull * the fast lookup is a table indexed by the next flatbits bits,
536 b6afd33e 2003-11-23 devnull * which returns the symbol matched and the number of bits consumed,
537 b6afd33e 2003-11-23 devnull * or the minimum number of bits needed and 0xff if more than flatbits
538 b6afd33e 2003-11-23 devnull * bits are needed.
539 b6afd33e 2003-11-23 devnull *
540 b6afd33e 2003-11-23 devnull * flatbits can be longer than the smallest huffman code,
541 b6afd33e 2003-11-23 devnull * because shorter codes are assigned smaller lexical prefixes.
542 b6afd33e 2003-11-23 devnull * this means assuming zeros for the next few bits will give a
543 b6afd33e 2003-11-23 devnull * conservative answer, in the sense that it will either give the
544 b6afd33e 2003-11-23 devnull * correct answer, or return the minimum number of bits which
545 b6afd33e 2003-11-23 devnull * are needed for an answer.
546 b6afd33e 2003-11-23 devnull */
547 b6afd33e 2003-11-23 devnull static int
548 b6afd33e 2003-11-23 devnull hufftab(Huff *h, char *hb, int maxleaf, int flatbits)
549 b6afd33e 2003-11-23 devnull {
550 b6afd33e 2003-11-23 devnull ulong bitcount[MaxHuffBits];
551 b6afd33e 2003-11-23 devnull ulong c, fc, ec, mincode, code, nc[MaxHuffBits];
552 b6afd33e 2003-11-23 devnull int i, b, minbits, maxbits;
553 b6afd33e 2003-11-23 devnull
554 b6afd33e 2003-11-23 devnull for(i = 0; i < MaxHuffBits; i++)
555 b6afd33e 2003-11-23 devnull bitcount[i] = 0;
556 b6afd33e 2003-11-23 devnull maxbits = -1;
557 b6afd33e 2003-11-23 devnull minbits = MaxHuffBits + 1;
558 b6afd33e 2003-11-23 devnull for(i=0; i < maxleaf; i++){
559 b6afd33e 2003-11-23 devnull b = hb[i];
560 b6afd33e 2003-11-23 devnull if(b){
561 b6afd33e 2003-11-23 devnull bitcount[b]++;
562 b6afd33e 2003-11-23 devnull if(b < minbits)
563 b6afd33e 2003-11-23 devnull minbits = b;
564 b6afd33e 2003-11-23 devnull if(b > maxbits)
565 b6afd33e 2003-11-23 devnull maxbits = b;
566 b6afd33e 2003-11-23 devnull }
567 b6afd33e 2003-11-23 devnull }
568 b6afd33e 2003-11-23 devnull
569 b6afd33e 2003-11-23 devnull h->maxbits = maxbits;
570 b6afd33e 2003-11-23 devnull if(maxbits <= 0){
571 b6afd33e 2003-11-23 devnull h->maxbits = 0;
572 b6afd33e 2003-11-23 devnull h->minbits = 0;
573 b6afd33e 2003-11-23 devnull h->flatmask = 0;
574 b6afd33e 2003-11-23 devnull return 1;
575 b6afd33e 2003-11-23 devnull }
576 b6afd33e 2003-11-23 devnull code = 0;
577 b6afd33e 2003-11-23 devnull c = 0;
578 b6afd33e 2003-11-23 devnull for(b = 0; b <= maxbits; b++){
579 b6afd33e 2003-11-23 devnull h->last[b] = c;
580 b6afd33e 2003-11-23 devnull c += bitcount[b];
581 b6afd33e 2003-11-23 devnull mincode = code << 1;
582 b6afd33e 2003-11-23 devnull nc[b] = mincode;
583 b6afd33e 2003-11-23 devnull code = mincode + bitcount[b];
584 b6afd33e 2003-11-23 devnull if(code > (1 << b))
585 b6afd33e 2003-11-23 devnull return 0;
586 b6afd33e 2003-11-23 devnull h->maxcode[b] = code - 1;
587 b6afd33e 2003-11-23 devnull h->last[b] += code - 1;
588 b6afd33e 2003-11-23 devnull }
589 b6afd33e 2003-11-23 devnull
590 b6afd33e 2003-11-23 devnull if(flatbits > maxbits)
591 b6afd33e 2003-11-23 devnull flatbits = maxbits;
592 b6afd33e 2003-11-23 devnull h->flatmask = (1 << flatbits) - 1;
593 b6afd33e 2003-11-23 devnull if(minbits > flatbits)
594 b6afd33e 2003-11-23 devnull minbits = flatbits;
595 b6afd33e 2003-11-23 devnull h->minbits = minbits;
596 b6afd33e 2003-11-23 devnull
597 b6afd33e 2003-11-23 devnull b = 1 << flatbits;
598 b6afd33e 2003-11-23 devnull for(i = 0; i < b; i++)
599 b6afd33e 2003-11-23 devnull h->flat[i] = ~0;
600 b6afd33e 2003-11-23 devnull
601 b6afd33e 2003-11-23 devnull /*
602 b6afd33e 2003-11-23 devnull * initialize the flat table to include the minimum possible
603 b6afd33e 2003-11-23 devnull * bit length for each code prefix
604 b6afd33e 2003-11-23 devnull */
605 b6afd33e 2003-11-23 devnull for(b = maxbits; b > flatbits; b--){
606 b6afd33e 2003-11-23 devnull code = h->maxcode[b];
607 b6afd33e 2003-11-23 devnull if(code == -1)
608 b6afd33e 2003-11-23 devnull break;
609 b6afd33e 2003-11-23 devnull mincode = code + 1 - bitcount[b];
610 b6afd33e 2003-11-23 devnull mincode >>= b - flatbits;
611 b6afd33e 2003-11-23 devnull code >>= b - flatbits;
612 b6afd33e 2003-11-23 devnull for(; mincode <= code; mincode++)
613 b6afd33e 2003-11-23 devnull h->flat[revcode(mincode, flatbits)] = (b << 8) | 0xff;
614 b6afd33e 2003-11-23 devnull }
615 b6afd33e 2003-11-23 devnull
616 b6afd33e 2003-11-23 devnull for(i = 0; i < maxleaf; i++){
617 b6afd33e 2003-11-23 devnull b = hb[i];
618 b6afd33e 2003-11-23 devnull if(b <= 0)
619 b6afd33e 2003-11-23 devnull continue;
620 b6afd33e 2003-11-23 devnull c = nc[b]++;
621 b6afd33e 2003-11-23 devnull if(b <= flatbits){
622 b6afd33e 2003-11-23 devnull code = (i << 8) | b;
623 b6afd33e 2003-11-23 devnull ec = (c + 1) << (flatbits - b);
624 b6afd33e 2003-11-23 devnull if(ec > (1<<flatbits))
625 b6afd33e 2003-11-23 devnull return 0; /* this is actually an internal error */
626 b6afd33e 2003-11-23 devnull for(fc = c << (flatbits - b); fc < ec; fc++)
627 b6afd33e 2003-11-23 devnull h->flat[revcode(fc, flatbits)] = code;
628 b6afd33e 2003-11-23 devnull }
629 b6afd33e 2003-11-23 devnull if(b > minbits){
630 b6afd33e 2003-11-23 devnull c = h->last[b] - c;
631 b6afd33e 2003-11-23 devnull if(c >= maxleaf)
632 b6afd33e 2003-11-23 devnull return 0;
633 b6afd33e 2003-11-23 devnull h->decode[c] = i;
634 b6afd33e 2003-11-23 devnull }
635 b6afd33e 2003-11-23 devnull }
636 b6afd33e 2003-11-23 devnull return 1;
637 b6afd33e 2003-11-23 devnull }
638 b6afd33e 2003-11-23 devnull
639 b6afd33e 2003-11-23 devnull static int
640 b6afd33e 2003-11-23 devnull hdecsym(Input *in, Huff *h, int nb)
641 b6afd33e 2003-11-23 devnull {
642 b6afd33e 2003-11-23 devnull long c;
643 b6afd33e 2003-11-23 devnull
644 b6afd33e 2003-11-23 devnull if((nb & 0xff) == 0xff)
645 b6afd33e 2003-11-23 devnull nb = nb >> 8;
646 b6afd33e 2003-11-23 devnull else
647 b6afd33e 2003-11-23 devnull nb = nb & 0xff;
648 b6afd33e 2003-11-23 devnull for(; nb <= h->maxbits; nb++){
649 b6afd33e 2003-11-23 devnull if(in->nbits<nb && !sregfill(in, nb))
650 b6afd33e 2003-11-23 devnull return -1;
651 b6afd33e 2003-11-23 devnull c = revtab[in->sreg&0xff]<<8;
652 b6afd33e 2003-11-23 devnull c |= revtab[(in->sreg>>8)&0xff];
653 b6afd33e 2003-11-23 devnull c >>= (16-nb);
654 b6afd33e 2003-11-23 devnull if(c <= h->maxcode[nb]){
655 b6afd33e 2003-11-23 devnull in->sreg >>= nb;
656 b6afd33e 2003-11-23 devnull in->nbits -= nb;
657 b6afd33e 2003-11-23 devnull return h->decode[h->last[nb] - c];
658 b6afd33e 2003-11-23 devnull }
659 b6afd33e 2003-11-23 devnull }
660 b6afd33e 2003-11-23 devnull in->error = FlateCorrupted;
661 b6afd33e 2003-11-23 devnull return -1;
662 b6afd33e 2003-11-23 devnull }
663 b6afd33e 2003-11-23 devnull
664 b6afd33e 2003-11-23 devnull static int
665 b6afd33e 2003-11-23 devnull sregfill(Input *in, int n)
666 b6afd33e 2003-11-23 devnull {
667 b6afd33e 2003-11-23 devnull int c;
668 b6afd33e 2003-11-23 devnull
669 b6afd33e 2003-11-23 devnull while(n > in->nbits) {
670 b6afd33e 2003-11-23 devnull c = (*in->get)(in->getr);
671 b6afd33e 2003-11-23 devnull if(c < 0){
672 b6afd33e 2003-11-23 devnull in->error = FlateInputFail;
673 b6afd33e 2003-11-23 devnull return 0;
674 b6afd33e 2003-11-23 devnull }
675 b6afd33e 2003-11-23 devnull in->sreg |= c<<in->nbits;
676 b6afd33e 2003-11-23 devnull in->nbits += 8;
677 b6afd33e 2003-11-23 devnull }
678 b6afd33e 2003-11-23 devnull return 1;
679 b6afd33e 2003-11-23 devnull }
680 b6afd33e 2003-11-23 devnull
681 b6afd33e 2003-11-23 devnull static int
682 b6afd33e 2003-11-23 devnull sregunget(Input *in)
683 b6afd33e 2003-11-23 devnull {
684 b6afd33e 2003-11-23 devnull if(in->nbits >= 8) {
685 b6afd33e 2003-11-23 devnull in->error = FlateInternal;
686 b6afd33e 2003-11-23 devnull return 0;
687 b6afd33e 2003-11-23 devnull }
688 b6afd33e 2003-11-23 devnull
689 b6afd33e 2003-11-23 devnull /* throw other bits on the floor */
690 b6afd33e 2003-11-23 devnull in->nbits = 0;
691 b6afd33e 2003-11-23 devnull in->sreg = 0;
692 b6afd33e 2003-11-23 devnull return 1;
693 b6afd33e 2003-11-23 devnull }