1*37da2899SCharles.Forsyth /* infblock.c -- interpret and process block types to last block
2*37da2899SCharles.Forsyth * Copyright (C) 1995-2002 Mark Adler
3*37da2899SCharles.Forsyth * For conditions of distribution and use, see copyright notice in zlib.h
4*37da2899SCharles.Forsyth */
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsyth #include "zutil.h"
7*37da2899SCharles.Forsyth #include "infblock.h"
8*37da2899SCharles.Forsyth #include "inftrees.h"
9*37da2899SCharles.Forsyth #include "infcodes.h"
10*37da2899SCharles.Forsyth #include "infutil.h"
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsyth
13*37da2899SCharles.Forsyth /* simplify the use of the inflate_huft type with some defines */
14*37da2899SCharles.Forsyth #define exop word.what.Exop
15*37da2899SCharles.Forsyth #define bits word.what.Bits
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsyth /* Table for deflate from PKZIP's appnote.txt. */
18*37da2899SCharles.Forsyth local const uInt border[] = { /* Order of the bit length code lengths */
19*37da2899SCharles.Forsyth 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsyth /*
22*37da2899SCharles.Forsyth Notes beyond the 1.93a appnote.txt:
23*37da2899SCharles.Forsyth
24*37da2899SCharles.Forsyth 1. Distance pointers never point before the beginning of the output
25*37da2899SCharles.Forsyth stream.
26*37da2899SCharles.Forsyth 2. Distance pointers can point back across blocks, up to 32k away.
27*37da2899SCharles.Forsyth 3. There is an implied maximum of 7 bits for the bit length table and
28*37da2899SCharles.Forsyth 15 bits for the actual data.
29*37da2899SCharles.Forsyth 4. If only one code exists, then it is encoded using one bit. (Zero
30*37da2899SCharles.Forsyth would be more efficient, but perhaps a little confusing.) If two
31*37da2899SCharles.Forsyth codes exist, they are coded using one bit each (0 and 1).
32*37da2899SCharles.Forsyth 5. There is no way of sending zero distance codes--a dummy must be
33*37da2899SCharles.Forsyth sent if there are none. (History: a pre 2.0 version of PKZIP would
34*37da2899SCharles.Forsyth store blocks with no distance codes, but this was discovered to be
35*37da2899SCharles.Forsyth too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
36*37da2899SCharles.Forsyth zero distance codes, which is sent as one code of zero bits in
37*37da2899SCharles.Forsyth length.
38*37da2899SCharles.Forsyth 6. There are up to 286 literal/length codes. Code 256 represents the
39*37da2899SCharles.Forsyth end-of-block. Note however that the static length tree defines
40*37da2899SCharles.Forsyth 288 codes just to fill out the Huffman codes. Codes 286 and 287
41*37da2899SCharles.Forsyth cannot be used though, since there is no length base or extra bits
42*37da2899SCharles.Forsyth defined for them. Similarily, there are up to 30 distance codes.
43*37da2899SCharles.Forsyth However, static trees define 32 codes (all 5 bits) to fill out the
44*37da2899SCharles.Forsyth Huffman codes, but the last two had better not show up in the data.
45*37da2899SCharles.Forsyth 7. Unzip can check dynamic Huffman blocks for complete code sets.
46*37da2899SCharles.Forsyth The exception is that a single code would not be complete (see #4).
47*37da2899SCharles.Forsyth 8. The five bits following the block type is really the number of
48*37da2899SCharles.Forsyth literal codes sent minus 257.
49*37da2899SCharles.Forsyth 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
50*37da2899SCharles.Forsyth (1+6+6). Therefore, to output three times the length, you output
51*37da2899SCharles.Forsyth three codes (1+1+1), whereas to output four times the same length,
52*37da2899SCharles.Forsyth you only need two codes (1+3). Hmm.
53*37da2899SCharles.Forsyth 10. In the tree reconstruction algorithm, Code = Code + Increment
54*37da2899SCharles.Forsyth only if BitLength(i) is not zero. (Pretty obvious.)
55*37da2899SCharles.Forsyth 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
56*37da2899SCharles.Forsyth 12. Note: length code 284 can represent 227-258, but length code 285
57*37da2899SCharles.Forsyth really is 258. The last length deserves its own, short code
58*37da2899SCharles.Forsyth since it gets used a lot in very redundant files. The length
59*37da2899SCharles.Forsyth 258 is special since 258 - 3 (the min match length) is 255.
60*37da2899SCharles.Forsyth 13. The literal/length and distance code bit lengths are read as a
61*37da2899SCharles.Forsyth single stream of lengths. It is possible (and advantageous) for
62*37da2899SCharles.Forsyth a repeat code (16, 17, or 18) to go across the boundary between
63*37da2899SCharles.Forsyth the two sets of lengths.
64*37da2899SCharles.Forsyth */
65*37da2899SCharles.Forsyth
66*37da2899SCharles.Forsyth
inflate_blocks_reset(s,z,c)67*37da2899SCharles.Forsyth local void inflate_blocks_reset(s, z, c)
68*37da2899SCharles.Forsyth inflate_blocks_statef *s;
69*37da2899SCharles.Forsyth z_streamp z;
70*37da2899SCharles.Forsyth uLongf *c;
71*37da2899SCharles.Forsyth {
72*37da2899SCharles.Forsyth if (c != Z_NULL)
73*37da2899SCharles.Forsyth *c = s->check;
74*37da2899SCharles.Forsyth if (s->mode == BTREE || s->mode == DTREE)
75*37da2899SCharles.Forsyth ZFREE(z, s->sub.trees.blens);
76*37da2899SCharles.Forsyth if (s->mode == CODES)
77*37da2899SCharles.Forsyth inflate_codes_free(s->sub.decode.codes, z);
78*37da2899SCharles.Forsyth s->mode = TYPE;
79*37da2899SCharles.Forsyth s->bitk = 0;
80*37da2899SCharles.Forsyth s->bitb = 0;
81*37da2899SCharles.Forsyth s->read = s->write = s->window;
82*37da2899SCharles.Forsyth if (s->checkfn != Z_NULL)
83*37da2899SCharles.Forsyth z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
84*37da2899SCharles.Forsyth Tracev((stderr, "inflate: blocks reset\n"));
85*37da2899SCharles.Forsyth }
86*37da2899SCharles.Forsyth
87*37da2899SCharles.Forsyth
inflate_blocks_new(z,c,w)88*37da2899SCharles.Forsyth local inflate_blocks_statef *inflate_blocks_new(z, c, w)
89*37da2899SCharles.Forsyth z_streamp z;
90*37da2899SCharles.Forsyth check_func c;
91*37da2899SCharles.Forsyth uInt w;
92*37da2899SCharles.Forsyth {
93*37da2899SCharles.Forsyth inflate_blocks_statef *s;
94*37da2899SCharles.Forsyth
95*37da2899SCharles.Forsyth if ((s = (inflate_blocks_statef *)ZALLOC
96*37da2899SCharles.Forsyth (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
97*37da2899SCharles.Forsyth return s;
98*37da2899SCharles.Forsyth if ((s->hufts =
99*37da2899SCharles.Forsyth (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
100*37da2899SCharles.Forsyth {
101*37da2899SCharles.Forsyth ZFREE(z, s);
102*37da2899SCharles.Forsyth return Z_NULL;
103*37da2899SCharles.Forsyth }
104*37da2899SCharles.Forsyth if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
105*37da2899SCharles.Forsyth {
106*37da2899SCharles.Forsyth ZFREE(z, s->hufts);
107*37da2899SCharles.Forsyth ZFREE(z, s);
108*37da2899SCharles.Forsyth return Z_NULL;
109*37da2899SCharles.Forsyth }
110*37da2899SCharles.Forsyth s->end = s->window + w;
111*37da2899SCharles.Forsyth s->checkfn = c;
112*37da2899SCharles.Forsyth s->mode = TYPE;
113*37da2899SCharles.Forsyth Tracev((stderr, "inflate: blocks allocated\n"));
114*37da2899SCharles.Forsyth inflate_blocks_reset(s, z, Z_NULL);
115*37da2899SCharles.Forsyth return s;
116*37da2899SCharles.Forsyth }
117*37da2899SCharles.Forsyth
118*37da2899SCharles.Forsyth
inflate_blocks(s,z,r)119*37da2899SCharles.Forsyth local int inflate_blocks(s, z, r)
120*37da2899SCharles.Forsyth inflate_blocks_statef *s;
121*37da2899SCharles.Forsyth z_streamp z;
122*37da2899SCharles.Forsyth int r;
123*37da2899SCharles.Forsyth {
124*37da2899SCharles.Forsyth uInt t; /* temporary storage */
125*37da2899SCharles.Forsyth uLong b; /* bit buffer */
126*37da2899SCharles.Forsyth uInt k; /* bits in bit buffer */
127*37da2899SCharles.Forsyth Bytef *p; /* input data pointer */
128*37da2899SCharles.Forsyth uInt n; /* bytes available there */
129*37da2899SCharles.Forsyth Bytef *q; /* output window write pointer */
130*37da2899SCharles.Forsyth uInt m; /* bytes to end of window or read pointer */
131*37da2899SCharles.Forsyth
132*37da2899SCharles.Forsyth /* copy input/output information to locals (UPDATE macro restores) */
133*37da2899SCharles.Forsyth LOAD
134*37da2899SCharles.Forsyth
135*37da2899SCharles.Forsyth /* process input based on current state */
136*37da2899SCharles.Forsyth while (1) switch (s->mode)
137*37da2899SCharles.Forsyth {
138*37da2899SCharles.Forsyth case TYPE:
139*37da2899SCharles.Forsyth NEEDBITS(3)
140*37da2899SCharles.Forsyth t = (uInt)b & 7;
141*37da2899SCharles.Forsyth s->last = t & 1;
142*37da2899SCharles.Forsyth switch (t >> 1)
143*37da2899SCharles.Forsyth {
144*37da2899SCharles.Forsyth case 0: /* stored */
145*37da2899SCharles.Forsyth Tracev((stderr, "inflate: stored block%s\n",
146*37da2899SCharles.Forsyth s->last ? " (last)" : ""));
147*37da2899SCharles.Forsyth DUMPBITS(3)
148*37da2899SCharles.Forsyth t = k & 7; /* go to byte boundary */
149*37da2899SCharles.Forsyth DUMPBITS(t)
150*37da2899SCharles.Forsyth s->mode = LENS; /* get length of stored block */
151*37da2899SCharles.Forsyth break;
152*37da2899SCharles.Forsyth case 1: /* fixed */
153*37da2899SCharles.Forsyth Tracev((stderr, "inflate: fixed codes block%s\n",
154*37da2899SCharles.Forsyth s->last ? " (last)" : ""));
155*37da2899SCharles.Forsyth {
156*37da2899SCharles.Forsyth uInt bl, bd;
157*37da2899SCharles.Forsyth inflate_huft *tl, *td;
158*37da2899SCharles.Forsyth
159*37da2899SCharles.Forsyth inflate_trees_fixed(&bl, &bd, &tl, &td, z);
160*37da2899SCharles.Forsyth s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
161*37da2899SCharles.Forsyth if (s->sub.decode.codes == Z_NULL)
162*37da2899SCharles.Forsyth {
163*37da2899SCharles.Forsyth r = Z_MEM_ERROR;
164*37da2899SCharles.Forsyth LEAVE
165*37da2899SCharles.Forsyth }
166*37da2899SCharles.Forsyth }
167*37da2899SCharles.Forsyth DUMPBITS(3)
168*37da2899SCharles.Forsyth s->mode = CODES;
169*37da2899SCharles.Forsyth break;
170*37da2899SCharles.Forsyth case 2: /* dynamic */
171*37da2899SCharles.Forsyth Tracev((stderr, "inflate: dynamic codes block%s\n",
172*37da2899SCharles.Forsyth s->last ? " (last)" : ""));
173*37da2899SCharles.Forsyth DUMPBITS(3)
174*37da2899SCharles.Forsyth s->mode = TABLE;
175*37da2899SCharles.Forsyth break;
176*37da2899SCharles.Forsyth case 3: /* illegal */
177*37da2899SCharles.Forsyth DUMPBITS(3)
178*37da2899SCharles.Forsyth s->mode = BAD;
179*37da2899SCharles.Forsyth z->msg = (char*)"invalid block type";
180*37da2899SCharles.Forsyth r = Z_DATA_ERROR;
181*37da2899SCharles.Forsyth LEAVE
182*37da2899SCharles.Forsyth }
183*37da2899SCharles.Forsyth break;
184*37da2899SCharles.Forsyth case LENS:
185*37da2899SCharles.Forsyth NEEDBITS(32)
186*37da2899SCharles.Forsyth if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
187*37da2899SCharles.Forsyth {
188*37da2899SCharles.Forsyth s->mode = BAD;
189*37da2899SCharles.Forsyth z->msg = (char*)"invalid stored block lengths";
190*37da2899SCharles.Forsyth r = Z_DATA_ERROR;
191*37da2899SCharles.Forsyth LEAVE
192*37da2899SCharles.Forsyth }
193*37da2899SCharles.Forsyth s->sub.left = (uInt)b & 0xffff;
194*37da2899SCharles.Forsyth b = k = 0; /* dump bits */
195*37da2899SCharles.Forsyth Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
196*37da2899SCharles.Forsyth s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
197*37da2899SCharles.Forsyth break;
198*37da2899SCharles.Forsyth case STORED:
199*37da2899SCharles.Forsyth if (n == 0)
200*37da2899SCharles.Forsyth LEAVE
201*37da2899SCharles.Forsyth NEEDOUT
202*37da2899SCharles.Forsyth t = s->sub.left;
203*37da2899SCharles.Forsyth if (t > n) t = n;
204*37da2899SCharles.Forsyth if (t > m) t = m;
205*37da2899SCharles.Forsyth zmemcpy(q, p, t);
206*37da2899SCharles.Forsyth p += t; n -= t;
207*37da2899SCharles.Forsyth q += t; m -= t;
208*37da2899SCharles.Forsyth if ((s->sub.left -= t) != 0)
209*37da2899SCharles.Forsyth break;
210*37da2899SCharles.Forsyth Tracev((stderr, "inflate: stored end, %lu total out\n",
211*37da2899SCharles.Forsyth z->total_out + (q >= s->read ? q - s->read :
212*37da2899SCharles.Forsyth (s->end - s->read) + (q - s->window))));
213*37da2899SCharles.Forsyth s->mode = s->last ? DRY : TYPE;
214*37da2899SCharles.Forsyth break;
215*37da2899SCharles.Forsyth case TABLE:
216*37da2899SCharles.Forsyth NEEDBITS(14)
217*37da2899SCharles.Forsyth s->sub.trees.table = t = (uInt)b & 0x3fff;
218*37da2899SCharles.Forsyth #ifndef PKZIP_BUG_WORKAROUND
219*37da2899SCharles.Forsyth if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
220*37da2899SCharles.Forsyth {
221*37da2899SCharles.Forsyth s->mode = BAD;
222*37da2899SCharles.Forsyth z->msg = (char*)"too many length or distance symbols";
223*37da2899SCharles.Forsyth r = Z_DATA_ERROR;
224*37da2899SCharles.Forsyth LEAVE
225*37da2899SCharles.Forsyth }
226*37da2899SCharles.Forsyth #endif
227*37da2899SCharles.Forsyth t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
228*37da2899SCharles.Forsyth if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
229*37da2899SCharles.Forsyth {
230*37da2899SCharles.Forsyth r = Z_MEM_ERROR;
231*37da2899SCharles.Forsyth LEAVE
232*37da2899SCharles.Forsyth }
233*37da2899SCharles.Forsyth DUMPBITS(14)
234*37da2899SCharles.Forsyth s->sub.trees.index = 0;
235*37da2899SCharles.Forsyth Tracev((stderr, "inflate: table sizes ok\n"));
236*37da2899SCharles.Forsyth s->mode = BTREE;
237*37da2899SCharles.Forsyth case BTREE:
238*37da2899SCharles.Forsyth while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
239*37da2899SCharles.Forsyth {
240*37da2899SCharles.Forsyth NEEDBITS(3)
241*37da2899SCharles.Forsyth s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
242*37da2899SCharles.Forsyth DUMPBITS(3)
243*37da2899SCharles.Forsyth }
244*37da2899SCharles.Forsyth while (s->sub.trees.index < 19)
245*37da2899SCharles.Forsyth s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
246*37da2899SCharles.Forsyth s->sub.trees.bb = 7;
247*37da2899SCharles.Forsyth t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
248*37da2899SCharles.Forsyth &s->sub.trees.tb, s->hufts, z);
249*37da2899SCharles.Forsyth if (t != Z_OK)
250*37da2899SCharles.Forsyth {
251*37da2899SCharles.Forsyth r = t;
252*37da2899SCharles.Forsyth if (r == Z_DATA_ERROR)
253*37da2899SCharles.Forsyth {
254*37da2899SCharles.Forsyth ZFREE(z, s->sub.trees.blens);
255*37da2899SCharles.Forsyth s->mode = BAD;
256*37da2899SCharles.Forsyth }
257*37da2899SCharles.Forsyth LEAVE
258*37da2899SCharles.Forsyth }
259*37da2899SCharles.Forsyth s->sub.trees.index = 0;
260*37da2899SCharles.Forsyth Tracev((stderr, "inflate: bits tree ok\n"));
261*37da2899SCharles.Forsyth s->mode = DTREE;
262*37da2899SCharles.Forsyth case DTREE:
263*37da2899SCharles.Forsyth while (t = s->sub.trees.table,
264*37da2899SCharles.Forsyth s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
265*37da2899SCharles.Forsyth {
266*37da2899SCharles.Forsyth inflate_huft *h;
267*37da2899SCharles.Forsyth uInt i, j, c;
268*37da2899SCharles.Forsyth
269*37da2899SCharles.Forsyth t = s->sub.trees.bb;
270*37da2899SCharles.Forsyth NEEDBITS(t)
271*37da2899SCharles.Forsyth h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
272*37da2899SCharles.Forsyth t = h->bits;
273*37da2899SCharles.Forsyth c = h->base;
274*37da2899SCharles.Forsyth if (c < 16)
275*37da2899SCharles.Forsyth {
276*37da2899SCharles.Forsyth DUMPBITS(t)
277*37da2899SCharles.Forsyth s->sub.trees.blens[s->sub.trees.index++] = c;
278*37da2899SCharles.Forsyth }
279*37da2899SCharles.Forsyth else /* c == 16..18 */
280*37da2899SCharles.Forsyth {
281*37da2899SCharles.Forsyth i = c == 18 ? 7 : c - 14;
282*37da2899SCharles.Forsyth j = c == 18 ? 11 : 3;
283*37da2899SCharles.Forsyth NEEDBITS(t + i)
284*37da2899SCharles.Forsyth DUMPBITS(t)
285*37da2899SCharles.Forsyth j += (uInt)b & inflate_mask[i];
286*37da2899SCharles.Forsyth DUMPBITS(i)
287*37da2899SCharles.Forsyth i = s->sub.trees.index;
288*37da2899SCharles.Forsyth t = s->sub.trees.table;
289*37da2899SCharles.Forsyth if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
290*37da2899SCharles.Forsyth (c == 16 && i < 1))
291*37da2899SCharles.Forsyth {
292*37da2899SCharles.Forsyth ZFREE(z, s->sub.trees.blens);
293*37da2899SCharles.Forsyth s->mode = BAD;
294*37da2899SCharles.Forsyth z->msg = (char*)"invalid bit length repeat";
295*37da2899SCharles.Forsyth r = Z_DATA_ERROR;
296*37da2899SCharles.Forsyth LEAVE
297*37da2899SCharles.Forsyth }
298*37da2899SCharles.Forsyth c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
299*37da2899SCharles.Forsyth do {
300*37da2899SCharles.Forsyth s->sub.trees.blens[i++] = c;
301*37da2899SCharles.Forsyth } while (--j);
302*37da2899SCharles.Forsyth s->sub.trees.index = i;
303*37da2899SCharles.Forsyth }
304*37da2899SCharles.Forsyth }
305*37da2899SCharles.Forsyth s->sub.trees.tb = Z_NULL;
306*37da2899SCharles.Forsyth {
307*37da2899SCharles.Forsyth uInt bl, bd;
308*37da2899SCharles.Forsyth inflate_huft *tl, *td;
309*37da2899SCharles.Forsyth inflate_codes_statef *c;
310*37da2899SCharles.Forsyth
311*37da2899SCharles.Forsyth bl = 9; /* must be <= 9 for lookahead assumptions */
312*37da2899SCharles.Forsyth bd = 6; /* must be <= 9 for lookahead assumptions */
313*37da2899SCharles.Forsyth t = s->sub.trees.table;
314*37da2899SCharles.Forsyth t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
315*37da2899SCharles.Forsyth s->sub.trees.blens, &bl, &bd, &tl, &td,
316*37da2899SCharles.Forsyth s->hufts, z);
317*37da2899SCharles.Forsyth if (t != Z_OK)
318*37da2899SCharles.Forsyth {
319*37da2899SCharles.Forsyth if (t == (uInt)Z_DATA_ERROR)
320*37da2899SCharles.Forsyth {
321*37da2899SCharles.Forsyth ZFREE(z, s->sub.trees.blens);
322*37da2899SCharles.Forsyth s->mode = BAD;
323*37da2899SCharles.Forsyth }
324*37da2899SCharles.Forsyth r = t;
325*37da2899SCharles.Forsyth LEAVE
326*37da2899SCharles.Forsyth }
327*37da2899SCharles.Forsyth Tracev((stderr, "inflate: trees ok\n"));
328*37da2899SCharles.Forsyth if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
329*37da2899SCharles.Forsyth {
330*37da2899SCharles.Forsyth r = Z_MEM_ERROR;
331*37da2899SCharles.Forsyth LEAVE
332*37da2899SCharles.Forsyth }
333*37da2899SCharles.Forsyth s->sub.decode.codes = c;
334*37da2899SCharles.Forsyth }
335*37da2899SCharles.Forsyth ZFREE(z, s->sub.trees.blens);
336*37da2899SCharles.Forsyth s->mode = CODES;
337*37da2899SCharles.Forsyth case CODES:
338*37da2899SCharles.Forsyth UPDATE
339*37da2899SCharles.Forsyth if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
340*37da2899SCharles.Forsyth return inflate_flush(s, z, r);
341*37da2899SCharles.Forsyth r = Z_OK;
342*37da2899SCharles.Forsyth inflate_codes_free(s->sub.decode.codes, z);
343*37da2899SCharles.Forsyth LOAD
344*37da2899SCharles.Forsyth Tracev((stderr, "inflate: codes end, %lu total out\n",
345*37da2899SCharles.Forsyth z->total_out + (q >= s->read ? q - s->read :
346*37da2899SCharles.Forsyth (s->end - s->read) + (q - s->window))));
347*37da2899SCharles.Forsyth if (!s->last)
348*37da2899SCharles.Forsyth {
349*37da2899SCharles.Forsyth s->mode = TYPE;
350*37da2899SCharles.Forsyth break;
351*37da2899SCharles.Forsyth }
352*37da2899SCharles.Forsyth s->mode = DRY;
353*37da2899SCharles.Forsyth case DRY:
354*37da2899SCharles.Forsyth FLUSH
355*37da2899SCharles.Forsyth if (s->read != s->write)
356*37da2899SCharles.Forsyth LEAVE
357*37da2899SCharles.Forsyth s->mode = DONE;
358*37da2899SCharles.Forsyth case DONE:
359*37da2899SCharles.Forsyth r = Z_STREAM_END;
360*37da2899SCharles.Forsyth LEAVE
361*37da2899SCharles.Forsyth case BAD:
362*37da2899SCharles.Forsyth r = Z_DATA_ERROR;
363*37da2899SCharles.Forsyth LEAVE
364*37da2899SCharles.Forsyth default:
365*37da2899SCharles.Forsyth r = Z_STREAM_ERROR;
366*37da2899SCharles.Forsyth LEAVE
367*37da2899SCharles.Forsyth }
368*37da2899SCharles.Forsyth }
369*37da2899SCharles.Forsyth
370*37da2899SCharles.Forsyth
inflate_blocks_free(s,z)371*37da2899SCharles.Forsyth local int inflate_blocks_free(s, z)
372*37da2899SCharles.Forsyth inflate_blocks_statef *s;
373*37da2899SCharles.Forsyth z_streamp z;
374*37da2899SCharles.Forsyth {
375*37da2899SCharles.Forsyth inflate_blocks_reset(s, z, Z_NULL);
376*37da2899SCharles.Forsyth ZFREE(z, s->window);
377*37da2899SCharles.Forsyth ZFREE(z, s->hufts);
378*37da2899SCharles.Forsyth ZFREE(z, s);
379*37da2899SCharles.Forsyth Tracev((stderr, "inflate: blocks freed\n"));
380*37da2899SCharles.Forsyth return Z_OK;
381*37da2899SCharles.Forsyth }
382*37da2899SCharles.Forsyth
383*37da2899SCharles.Forsyth
384