xref: /inferno-os/libfreetype/infblock.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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