xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/jffs2/cyg/compress/src/infback.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /* infback.c -- inflate using a call-back interface
2*10465441SEvalZero  * Copyright (C) 1995-2005 Mark Adler
3*10465441SEvalZero  * For conditions of distribution and use, see copyright notice in zlib.h
4*10465441SEvalZero  */
5*10465441SEvalZero 
6*10465441SEvalZero /*
7*10465441SEvalZero    This code is largely copied from inflate.c.  Normally either infback.o or
8*10465441SEvalZero    inflate.o would be linked into an application--not both.  The interface
9*10465441SEvalZero    with inffast.c is retained so that optimized assembler-coded versions of
10*10465441SEvalZero    inflate_fast() can be used with either inflate.c or infback.c.
11*10465441SEvalZero  */
12*10465441SEvalZero 
13*10465441SEvalZero #include "zutil.h"
14*10465441SEvalZero #include "inftrees.h"
15*10465441SEvalZero #include "inflate.h"
16*10465441SEvalZero #include "inffast.h"
17*10465441SEvalZero 
18*10465441SEvalZero /* function prototypes */
19*10465441SEvalZero local void fixedtables OF((struct inflate_state FAR *state));
20*10465441SEvalZero 
21*10465441SEvalZero /*
22*10465441SEvalZero    strm provides memory allocation functions in zalloc and zfree, or
23*10465441SEvalZero    Z_NULL to use the library memory allocation functions.
24*10465441SEvalZero 
25*10465441SEvalZero    windowBits is in the range 8..15, and window is a user-supplied
26*10465441SEvalZero    window and output buffer that is 2**windowBits bytes.
27*10465441SEvalZero  */
inflateBackInit_(strm,windowBits,window,version,stream_size)28*10465441SEvalZero int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
29*10465441SEvalZero z_streamp strm;
30*10465441SEvalZero int windowBits;
31*10465441SEvalZero unsigned char FAR *window;
32*10465441SEvalZero const char *version;
33*10465441SEvalZero int stream_size;
34*10465441SEvalZero {
35*10465441SEvalZero     struct inflate_state FAR *state;
36*10465441SEvalZero 
37*10465441SEvalZero     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
38*10465441SEvalZero         stream_size != (int)(sizeof(z_stream)))
39*10465441SEvalZero         return Z_VERSION_ERROR;
40*10465441SEvalZero     if (strm == Z_NULL || window == Z_NULL ||
41*10465441SEvalZero         windowBits < 8 || windowBits > 15)
42*10465441SEvalZero         return Z_STREAM_ERROR;
43*10465441SEvalZero     strm->msg = Z_NULL;                 /* in case we return an error */
44*10465441SEvalZero     if (strm->zalloc == (alloc_func)0) {
45*10465441SEvalZero         strm->zalloc = zcalloc;
46*10465441SEvalZero         strm->opaque = (voidpf)0;
47*10465441SEvalZero     }
48*10465441SEvalZero     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
49*10465441SEvalZero     state = (struct inflate_state FAR *)ZALLOC(strm, 1,
50*10465441SEvalZero                                                sizeof(struct inflate_state));
51*10465441SEvalZero     if (state == Z_NULL) return Z_MEM_ERROR;
52*10465441SEvalZero     Tracev((stderr, "inflate: allocated\n"));
53*10465441SEvalZero     strm->state = (struct internal_state FAR *)state;
54*10465441SEvalZero     state->dmax = 32768U;
55*10465441SEvalZero     state->wbits = windowBits;
56*10465441SEvalZero     state->wsize = 1U << windowBits;
57*10465441SEvalZero     state->window = window;
58*10465441SEvalZero     state->write = 0;
59*10465441SEvalZero     state->whave = 0;
60*10465441SEvalZero     return Z_OK;
61*10465441SEvalZero }
62*10465441SEvalZero 
63*10465441SEvalZero /*
64*10465441SEvalZero    Return state with length and distance decoding tables and index sizes set to
65*10465441SEvalZero    fixed code decoding.  Normally this returns fixed tables from inffixed.h.
66*10465441SEvalZero    If BUILDFIXED is defined, then instead this routine builds the tables the
67*10465441SEvalZero    first time it's called, and returns those tables the first time and
68*10465441SEvalZero    thereafter.  This reduces the size of the code by about 2K bytes, in
69*10465441SEvalZero    exchange for a little execution time.  However, BUILDFIXED should not be
70*10465441SEvalZero    used for threaded applications, since the rewriting of the tables and virgin
71*10465441SEvalZero    may not be thread-safe.
72*10465441SEvalZero  */
fixedtables(state)73*10465441SEvalZero local void fixedtables(state)
74*10465441SEvalZero struct inflate_state FAR *state;
75*10465441SEvalZero {
76*10465441SEvalZero #ifdef BUILDFIXED
77*10465441SEvalZero     static int virgin = 1;
78*10465441SEvalZero     static code *lenfix, *distfix;
79*10465441SEvalZero     static code fixed[544];
80*10465441SEvalZero 
81*10465441SEvalZero     /* build fixed huffman tables if first call (may not be thread safe) */
82*10465441SEvalZero     if (virgin) {
83*10465441SEvalZero         unsigned sym, bits;
84*10465441SEvalZero         static code *next;
85*10465441SEvalZero 
86*10465441SEvalZero         /* literal/length table */
87*10465441SEvalZero         sym = 0;
88*10465441SEvalZero         while (sym < 144) state->lens[sym++] = 8;
89*10465441SEvalZero         while (sym < 256) state->lens[sym++] = 9;
90*10465441SEvalZero         while (sym < 280) state->lens[sym++] = 7;
91*10465441SEvalZero         while (sym < 288) state->lens[sym++] = 8;
92*10465441SEvalZero         next = fixed;
93*10465441SEvalZero         lenfix = next;
94*10465441SEvalZero         bits = 9;
95*10465441SEvalZero         inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
96*10465441SEvalZero 
97*10465441SEvalZero         /* distance table */
98*10465441SEvalZero         sym = 0;
99*10465441SEvalZero         while (sym < 32) state->lens[sym++] = 5;
100*10465441SEvalZero         distfix = next;
101*10465441SEvalZero         bits = 5;
102*10465441SEvalZero         inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
103*10465441SEvalZero 
104*10465441SEvalZero         /* do this just once */
105*10465441SEvalZero         virgin = 0;
106*10465441SEvalZero     }
107*10465441SEvalZero #else /* !BUILDFIXED */
108*10465441SEvalZero #   include "inffixed.h"
109*10465441SEvalZero #endif /* BUILDFIXED */
110*10465441SEvalZero     state->lencode = lenfix;
111*10465441SEvalZero     state->lenbits = 9;
112*10465441SEvalZero     state->distcode = distfix;
113*10465441SEvalZero     state->distbits = 5;
114*10465441SEvalZero }
115*10465441SEvalZero 
116*10465441SEvalZero /* Macros for inflateBack(): */
117*10465441SEvalZero 
118*10465441SEvalZero /* Load returned state from inflate_fast() */
119*10465441SEvalZero #define LOAD() \
120*10465441SEvalZero     do { \
121*10465441SEvalZero         put = strm->next_out; \
122*10465441SEvalZero         left = strm->avail_out; \
123*10465441SEvalZero         next = strm->next_in; \
124*10465441SEvalZero         have = strm->avail_in; \
125*10465441SEvalZero         hold = state->hold; \
126*10465441SEvalZero         bits = state->bits; \
127*10465441SEvalZero     } while (0)
128*10465441SEvalZero 
129*10465441SEvalZero /* Set state from registers for inflate_fast() */
130*10465441SEvalZero #define RESTORE() \
131*10465441SEvalZero     do { \
132*10465441SEvalZero         strm->next_out = put; \
133*10465441SEvalZero         strm->avail_out = left; \
134*10465441SEvalZero         strm->next_in = next; \
135*10465441SEvalZero         strm->avail_in = have; \
136*10465441SEvalZero         state->hold = hold; \
137*10465441SEvalZero         state->bits = bits; \
138*10465441SEvalZero     } while (0)
139*10465441SEvalZero 
140*10465441SEvalZero /* Clear the input bit accumulator */
141*10465441SEvalZero #define INITBITS() \
142*10465441SEvalZero     do { \
143*10465441SEvalZero         hold = 0; \
144*10465441SEvalZero         bits = 0; \
145*10465441SEvalZero     } while (0)
146*10465441SEvalZero 
147*10465441SEvalZero /* Assure that some input is available.  If input is requested, but denied,
148*10465441SEvalZero    then return a Z_BUF_ERROR from inflateBack(). */
149*10465441SEvalZero #define PULL() \
150*10465441SEvalZero     do { \
151*10465441SEvalZero         if (have == 0) { \
152*10465441SEvalZero             have = in(in_desc, &next); \
153*10465441SEvalZero             if (have == 0) { \
154*10465441SEvalZero                 next = Z_NULL; \
155*10465441SEvalZero                 ret = Z_BUF_ERROR; \
156*10465441SEvalZero                 goto inf_leave; \
157*10465441SEvalZero             } \
158*10465441SEvalZero         } \
159*10465441SEvalZero     } while (0)
160*10465441SEvalZero 
161*10465441SEvalZero /* Get a byte of input into the bit accumulator, or return from inflateBack()
162*10465441SEvalZero    with an error if there is no input available. */
163*10465441SEvalZero #define PULLBYTE() \
164*10465441SEvalZero     do { \
165*10465441SEvalZero         PULL(); \
166*10465441SEvalZero         have--; \
167*10465441SEvalZero         hold += (unsigned long)(*next++) << bits; \
168*10465441SEvalZero         bits += 8; \
169*10465441SEvalZero     } while (0)
170*10465441SEvalZero 
171*10465441SEvalZero /* Assure that there are at least n bits in the bit accumulator.  If there is
172*10465441SEvalZero    not enough available input to do that, then return from inflateBack() with
173*10465441SEvalZero    an error. */
174*10465441SEvalZero #define NEEDBITS(n) \
175*10465441SEvalZero     do { \
176*10465441SEvalZero         while (bits < (unsigned)(n)) \
177*10465441SEvalZero             PULLBYTE(); \
178*10465441SEvalZero     } while (0)
179*10465441SEvalZero 
180*10465441SEvalZero /* Return the low n bits of the bit accumulator (n < 16) */
181*10465441SEvalZero #define BITS(n) \
182*10465441SEvalZero     ((unsigned)hold & ((1U << (n)) - 1))
183*10465441SEvalZero 
184*10465441SEvalZero /* Remove n bits from the bit accumulator */
185*10465441SEvalZero #define DROPBITS(n) \
186*10465441SEvalZero     do { \
187*10465441SEvalZero         hold >>= (n); \
188*10465441SEvalZero         bits -= (unsigned)(n); \
189*10465441SEvalZero     } while (0)
190*10465441SEvalZero 
191*10465441SEvalZero /* Remove zero to seven bits as needed to go to a byte boundary */
192*10465441SEvalZero #define BYTEBITS() \
193*10465441SEvalZero     do { \
194*10465441SEvalZero         hold >>= bits & 7; \
195*10465441SEvalZero         bits -= bits & 7; \
196*10465441SEvalZero     } while (0)
197*10465441SEvalZero 
198*10465441SEvalZero /* Assure that some output space is available, by writing out the window
199*10465441SEvalZero    if it's full.  If the write fails, return from inflateBack() with a
200*10465441SEvalZero    Z_BUF_ERROR. */
201*10465441SEvalZero #define ROOM() \
202*10465441SEvalZero     do { \
203*10465441SEvalZero         if (left == 0) { \
204*10465441SEvalZero             put = state->window; \
205*10465441SEvalZero             left = state->wsize; \
206*10465441SEvalZero             state->whave = left; \
207*10465441SEvalZero             if (out(out_desc, put, left)) { \
208*10465441SEvalZero                 ret = Z_BUF_ERROR; \
209*10465441SEvalZero                 goto inf_leave; \
210*10465441SEvalZero             } \
211*10465441SEvalZero         } \
212*10465441SEvalZero     } while (0)
213*10465441SEvalZero 
214*10465441SEvalZero /*
215*10465441SEvalZero    strm provides the memory allocation functions and window buffer on input,
216*10465441SEvalZero    and provides information on the unused input on return.  For Z_DATA_ERROR
217*10465441SEvalZero    returns, strm will also provide an error message.
218*10465441SEvalZero 
219*10465441SEvalZero    in() and out() are the call-back input and output functions.  When
220*10465441SEvalZero    inflateBack() needs more input, it calls in().  When inflateBack() has
221*10465441SEvalZero    filled the window with output, or when it completes with data in the
222*10465441SEvalZero    window, it calls out() to write out the data.  The application must not
223*10465441SEvalZero    change the provided input until in() is called again or inflateBack()
224*10465441SEvalZero    returns.  The application must not change the window/output buffer until
225*10465441SEvalZero    inflateBack() returns.
226*10465441SEvalZero 
227*10465441SEvalZero    in() and out() are called with a descriptor parameter provided in the
228*10465441SEvalZero    inflateBack() call.  This parameter can be a structure that provides the
229*10465441SEvalZero    information required to do the read or write, as well as accumulated
230*10465441SEvalZero    information on the input and output such as totals and check values.
231*10465441SEvalZero 
232*10465441SEvalZero    in() should return zero on failure.  out() should return non-zero on
233*10465441SEvalZero    failure.  If either in() or out() fails, than inflateBack() returns a
234*10465441SEvalZero    Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
235*10465441SEvalZero    was in() or out() that caused in the error.  Otherwise,  inflateBack()
236*10465441SEvalZero    returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
237*10465441SEvalZero    error, or Z_MEM_ERROR if it could not allocate memory for the state.
238*10465441SEvalZero    inflateBack() can also return Z_STREAM_ERROR if the input parameters
239*10465441SEvalZero    are not correct, i.e. strm is Z_NULL or the state was not initialized.
240*10465441SEvalZero  */
inflateBack(strm,in,in_desc,out,out_desc)241*10465441SEvalZero int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
242*10465441SEvalZero z_streamp strm;
243*10465441SEvalZero in_func in;
244*10465441SEvalZero void FAR *in_desc;
245*10465441SEvalZero out_func out;
246*10465441SEvalZero void FAR *out_desc;
247*10465441SEvalZero {
248*10465441SEvalZero     struct inflate_state FAR *state;
249*10465441SEvalZero     unsigned char FAR *next;    /* next input */
250*10465441SEvalZero     unsigned char FAR *put;     /* next output */
251*10465441SEvalZero     unsigned have, left;        /* available input and output */
252*10465441SEvalZero     unsigned long hold;         /* bit buffer */
253*10465441SEvalZero     unsigned bits;              /* bits in bit buffer */
254*10465441SEvalZero     unsigned copy;              /* number of stored or match bytes to copy */
255*10465441SEvalZero     unsigned char FAR *from;    /* where to copy match bytes from */
256*10465441SEvalZero     code this;                  /* current decoding table entry */
257*10465441SEvalZero     code last;                  /* parent table entry */
258*10465441SEvalZero     unsigned len;               /* length to copy for repeats, bits to drop */
259*10465441SEvalZero     int ret;                    /* return code */
260*10465441SEvalZero     static const unsigned short order[19] = /* permutation of code lengths */
261*10465441SEvalZero         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
262*10465441SEvalZero 
263*10465441SEvalZero     /* Check that the strm exists and that the state was initialized */
264*10465441SEvalZero     if (strm == Z_NULL || strm->state == Z_NULL)
265*10465441SEvalZero         return Z_STREAM_ERROR;
266*10465441SEvalZero     state = (struct inflate_state FAR *)strm->state;
267*10465441SEvalZero 
268*10465441SEvalZero     /* Reset the state */
269*10465441SEvalZero     strm->msg = Z_NULL;
270*10465441SEvalZero     state->mode = TYPE;
271*10465441SEvalZero     state->last = 0;
272*10465441SEvalZero     state->whave = 0;
273*10465441SEvalZero     next = strm->next_in;
274*10465441SEvalZero     have = next != Z_NULL ? strm->avail_in : 0;
275*10465441SEvalZero     hold = 0;
276*10465441SEvalZero     bits = 0;
277*10465441SEvalZero     put = state->window;
278*10465441SEvalZero     left = state->wsize;
279*10465441SEvalZero 
280*10465441SEvalZero     /* Inflate until end of block marked as last */
281*10465441SEvalZero     for (;;)
282*10465441SEvalZero         switch (state->mode) {
283*10465441SEvalZero         case TYPE:
284*10465441SEvalZero             /* determine and dispatch block type */
285*10465441SEvalZero             if (state->last) {
286*10465441SEvalZero                 BYTEBITS();
287*10465441SEvalZero                 state->mode = DONE;
288*10465441SEvalZero                 break;
289*10465441SEvalZero             }
290*10465441SEvalZero             NEEDBITS(3);
291*10465441SEvalZero             state->last = BITS(1);
292*10465441SEvalZero             DROPBITS(1);
293*10465441SEvalZero             switch (BITS(2)) {
294*10465441SEvalZero             case 0:                             /* stored block */
295*10465441SEvalZero                 Tracev((stderr, "inflate:     stored block%s\n",
296*10465441SEvalZero                         state->last ? " (last)" : ""));
297*10465441SEvalZero                 state->mode = STORED;
298*10465441SEvalZero                 break;
299*10465441SEvalZero             case 1:                             /* fixed block */
300*10465441SEvalZero                 fixedtables(state);
301*10465441SEvalZero                 Tracev((stderr, "inflate:     fixed codes block%s\n",
302*10465441SEvalZero                         state->last ? " (last)" : ""));
303*10465441SEvalZero                 state->mode = LEN;              /* decode codes */
304*10465441SEvalZero                 break;
305*10465441SEvalZero             case 2:                             /* dynamic block */
306*10465441SEvalZero                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
307*10465441SEvalZero                         state->last ? " (last)" : ""));
308*10465441SEvalZero                 state->mode = TABLE;
309*10465441SEvalZero                 break;
310*10465441SEvalZero             case 3:
311*10465441SEvalZero                 strm->msg = (char *)"invalid block type";
312*10465441SEvalZero                 state->mode = BAD;
313*10465441SEvalZero             }
314*10465441SEvalZero             DROPBITS(2);
315*10465441SEvalZero             break;
316*10465441SEvalZero 
317*10465441SEvalZero         case STORED:
318*10465441SEvalZero             /* get and verify stored block length */
319*10465441SEvalZero             BYTEBITS();                         /* go to byte boundary */
320*10465441SEvalZero             NEEDBITS(32);
321*10465441SEvalZero             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
322*10465441SEvalZero                 strm->msg = (char *)"invalid stored block lengths";
323*10465441SEvalZero                 state->mode = BAD;
324*10465441SEvalZero                 break;
325*10465441SEvalZero             }
326*10465441SEvalZero             state->length = (unsigned)hold & 0xffff;
327*10465441SEvalZero             Tracev((stderr, "inflate:       stored length %u\n",
328*10465441SEvalZero                     state->length));
329*10465441SEvalZero             INITBITS();
330*10465441SEvalZero 
331*10465441SEvalZero             /* copy stored block from input to output */
332*10465441SEvalZero             while (state->length != 0) {
333*10465441SEvalZero                 copy = state->length;
334*10465441SEvalZero                 PULL();
335*10465441SEvalZero                 ROOM();
336*10465441SEvalZero                 if (copy > have) copy = have;
337*10465441SEvalZero                 if (copy > left) copy = left;
338*10465441SEvalZero                 zmemcpy(put, next, copy);
339*10465441SEvalZero                 have -= copy;
340*10465441SEvalZero                 next += copy;
341*10465441SEvalZero                 left -= copy;
342*10465441SEvalZero                 put += copy;
343*10465441SEvalZero                 state->length -= copy;
344*10465441SEvalZero             }
345*10465441SEvalZero             Tracev((stderr, "inflate:       stored end\n"));
346*10465441SEvalZero             state->mode = TYPE;
347*10465441SEvalZero             break;
348*10465441SEvalZero 
349*10465441SEvalZero         case TABLE:
350*10465441SEvalZero             /* get dynamic table entries descriptor */
351*10465441SEvalZero             NEEDBITS(14);
352*10465441SEvalZero             state->nlen = BITS(5) + 257;
353*10465441SEvalZero             DROPBITS(5);
354*10465441SEvalZero             state->ndist = BITS(5) + 1;
355*10465441SEvalZero             DROPBITS(5);
356*10465441SEvalZero             state->ncode = BITS(4) + 4;
357*10465441SEvalZero             DROPBITS(4);
358*10465441SEvalZero #ifndef PKZIP_BUG_WORKAROUND
359*10465441SEvalZero             if (state->nlen > 286 || state->ndist > 30) {
360*10465441SEvalZero                 strm->msg = (char *)"too many length or distance symbols";
361*10465441SEvalZero                 state->mode = BAD;
362*10465441SEvalZero                 break;
363*10465441SEvalZero             }
364*10465441SEvalZero #endif
365*10465441SEvalZero             Tracev((stderr, "inflate:       table sizes ok\n"));
366*10465441SEvalZero 
367*10465441SEvalZero             /* get code length code lengths (not a typo) */
368*10465441SEvalZero             state->have = 0;
369*10465441SEvalZero             while (state->have < state->ncode) {
370*10465441SEvalZero                 NEEDBITS(3);
371*10465441SEvalZero                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
372*10465441SEvalZero                 DROPBITS(3);
373*10465441SEvalZero             }
374*10465441SEvalZero             while (state->have < 19)
375*10465441SEvalZero                 state->lens[order[state->have++]] = 0;
376*10465441SEvalZero             state->next = state->codes;
377*10465441SEvalZero             state->lencode = (code const FAR *)(state->next);
378*10465441SEvalZero             state->lenbits = 7;
379*10465441SEvalZero             ret = inflate_table(CODES, state->lens, 19, &(state->next),
380*10465441SEvalZero                                 &(state->lenbits), state->work);
381*10465441SEvalZero             if (ret) {
382*10465441SEvalZero                 strm->msg = (char *)"invalid code lengths set";
383*10465441SEvalZero                 state->mode = BAD;
384*10465441SEvalZero                 break;
385*10465441SEvalZero             }
386*10465441SEvalZero             Tracev((stderr, "inflate:       code lengths ok\n"));
387*10465441SEvalZero 
388*10465441SEvalZero             /* get length and distance code code lengths */
389*10465441SEvalZero             state->have = 0;
390*10465441SEvalZero             while (state->have < state->nlen + state->ndist) {
391*10465441SEvalZero                 for (;;) {
392*10465441SEvalZero                     this = state->lencode[BITS(state->lenbits)];
393*10465441SEvalZero                     if ((unsigned)(this.bits) <= bits) break;
394*10465441SEvalZero                     PULLBYTE();
395*10465441SEvalZero                 }
396*10465441SEvalZero                 if (this.val < 16) {
397*10465441SEvalZero                     NEEDBITS(this.bits);
398*10465441SEvalZero                     DROPBITS(this.bits);
399*10465441SEvalZero                     state->lens[state->have++] = this.val;
400*10465441SEvalZero                 }
401*10465441SEvalZero                 else {
402*10465441SEvalZero                     if (this.val == 16) {
403*10465441SEvalZero                         NEEDBITS(this.bits + 2);
404*10465441SEvalZero                         DROPBITS(this.bits);
405*10465441SEvalZero                         if (state->have == 0) {
406*10465441SEvalZero                             strm->msg = (char *)"invalid bit length repeat";
407*10465441SEvalZero                             state->mode = BAD;
408*10465441SEvalZero                             break;
409*10465441SEvalZero                         }
410*10465441SEvalZero                         len = (unsigned)(state->lens[state->have - 1]);
411*10465441SEvalZero                         copy = 3 + BITS(2);
412*10465441SEvalZero                         DROPBITS(2);
413*10465441SEvalZero                     }
414*10465441SEvalZero                     else if (this.val == 17) {
415*10465441SEvalZero                         NEEDBITS(this.bits + 3);
416*10465441SEvalZero                         DROPBITS(this.bits);
417*10465441SEvalZero                         len = 0;
418*10465441SEvalZero                         copy = 3 + BITS(3);
419*10465441SEvalZero                         DROPBITS(3);
420*10465441SEvalZero                     }
421*10465441SEvalZero                     else {
422*10465441SEvalZero                         NEEDBITS(this.bits + 7);
423*10465441SEvalZero                         DROPBITS(this.bits);
424*10465441SEvalZero                         len = 0;
425*10465441SEvalZero                         copy = 11 + BITS(7);
426*10465441SEvalZero                         DROPBITS(7);
427*10465441SEvalZero                     }
428*10465441SEvalZero                     if (state->have + copy > state->nlen + state->ndist) {
429*10465441SEvalZero                         strm->msg = (char *)"invalid bit length repeat";
430*10465441SEvalZero                         state->mode = BAD;
431*10465441SEvalZero                         break;
432*10465441SEvalZero                     }
433*10465441SEvalZero                     while (copy--)
434*10465441SEvalZero                         state->lens[state->have++] = (unsigned short)len;
435*10465441SEvalZero                 }
436*10465441SEvalZero             }
437*10465441SEvalZero 
438*10465441SEvalZero             /* handle error breaks in while */
439*10465441SEvalZero             if (state->mode == BAD) break;
440*10465441SEvalZero 
441*10465441SEvalZero             /* build code tables */
442*10465441SEvalZero             state->next = state->codes;
443*10465441SEvalZero             state->lencode = (code const FAR *)(state->next);
444*10465441SEvalZero             state->lenbits = 9;
445*10465441SEvalZero             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
446*10465441SEvalZero                                 &(state->lenbits), state->work);
447*10465441SEvalZero             if (ret) {
448*10465441SEvalZero                 strm->msg = (char *)"invalid literal/lengths set";
449*10465441SEvalZero                 state->mode = BAD;
450*10465441SEvalZero                 break;
451*10465441SEvalZero             }
452*10465441SEvalZero             state->distcode = (code const FAR *)(state->next);
453*10465441SEvalZero             state->distbits = 6;
454*10465441SEvalZero             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
455*10465441SEvalZero                             &(state->next), &(state->distbits), state->work);
456*10465441SEvalZero             if (ret) {
457*10465441SEvalZero                 strm->msg = (char *)"invalid distances set";
458*10465441SEvalZero                 state->mode = BAD;
459*10465441SEvalZero                 break;
460*10465441SEvalZero             }
461*10465441SEvalZero             Tracev((stderr, "inflate:       codes ok\n"));
462*10465441SEvalZero             state->mode = LEN;
463*10465441SEvalZero 
464*10465441SEvalZero         case LEN:
465*10465441SEvalZero             /* use inflate_fast() if we have enough input and output */
466*10465441SEvalZero             if (have >= 6 && left >= 258) {
467*10465441SEvalZero                 RESTORE();
468*10465441SEvalZero                 if (state->whave < state->wsize)
469*10465441SEvalZero                     state->whave = state->wsize - left;
470*10465441SEvalZero                 inflate_fast(strm, state->wsize);
471*10465441SEvalZero                 LOAD();
472*10465441SEvalZero                 break;
473*10465441SEvalZero             }
474*10465441SEvalZero 
475*10465441SEvalZero             /* get a literal, length, or end-of-block code */
476*10465441SEvalZero             for (;;) {
477*10465441SEvalZero                 this = state->lencode[BITS(state->lenbits)];
478*10465441SEvalZero                 if ((unsigned)(this.bits) <= bits) break;
479*10465441SEvalZero                 PULLBYTE();
480*10465441SEvalZero             }
481*10465441SEvalZero             if (this.op && (this.op & 0xf0) == 0) {
482*10465441SEvalZero                 last = this;
483*10465441SEvalZero                 for (;;) {
484*10465441SEvalZero                     this = state->lencode[last.val +
485*10465441SEvalZero                             (BITS(last.bits + last.op) >> last.bits)];
486*10465441SEvalZero                     if ((unsigned)(last.bits + this.bits) <= bits) break;
487*10465441SEvalZero                     PULLBYTE();
488*10465441SEvalZero                 }
489*10465441SEvalZero                 DROPBITS(last.bits);
490*10465441SEvalZero             }
491*10465441SEvalZero             DROPBITS(this.bits);
492*10465441SEvalZero             state->length = (unsigned)this.val;
493*10465441SEvalZero 
494*10465441SEvalZero             /* process literal */
495*10465441SEvalZero             if (this.op == 0) {
496*10465441SEvalZero                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
497*10465441SEvalZero                         "inflate:         literal '%c'\n" :
498*10465441SEvalZero                         "inflate:         literal 0x%02x\n", this.val));
499*10465441SEvalZero                 ROOM();
500*10465441SEvalZero                 *put++ = (unsigned char)(state->length);
501*10465441SEvalZero                 left--;
502*10465441SEvalZero                 state->mode = LEN;
503*10465441SEvalZero                 break;
504*10465441SEvalZero             }
505*10465441SEvalZero 
506*10465441SEvalZero             /* process end of block */
507*10465441SEvalZero             if (this.op & 32) {
508*10465441SEvalZero                 Tracevv((stderr, "inflate:         end of block\n"));
509*10465441SEvalZero                 state->mode = TYPE;
510*10465441SEvalZero                 break;
511*10465441SEvalZero             }
512*10465441SEvalZero 
513*10465441SEvalZero             /* invalid code */
514*10465441SEvalZero             if (this.op & 64) {
515*10465441SEvalZero                 strm->msg = (char *)"invalid literal/length code";
516*10465441SEvalZero                 state->mode = BAD;
517*10465441SEvalZero                 break;
518*10465441SEvalZero             }
519*10465441SEvalZero 
520*10465441SEvalZero             /* length code -- get extra bits, if any */
521*10465441SEvalZero             state->extra = (unsigned)(this.op) & 15;
522*10465441SEvalZero             if (state->extra != 0) {
523*10465441SEvalZero                 NEEDBITS(state->extra);
524*10465441SEvalZero                 state->length += BITS(state->extra);
525*10465441SEvalZero                 DROPBITS(state->extra);
526*10465441SEvalZero             }
527*10465441SEvalZero             Tracevv((stderr, "inflate:         length %u\n", state->length));
528*10465441SEvalZero 
529*10465441SEvalZero             /* get distance code */
530*10465441SEvalZero             for (;;) {
531*10465441SEvalZero                 this = state->distcode[BITS(state->distbits)];
532*10465441SEvalZero                 if ((unsigned)(this.bits) <= bits) break;
533*10465441SEvalZero                 PULLBYTE();
534*10465441SEvalZero             }
535*10465441SEvalZero             if ((this.op & 0xf0) == 0) {
536*10465441SEvalZero                 last = this;
537*10465441SEvalZero                 for (;;) {
538*10465441SEvalZero                     this = state->distcode[last.val +
539*10465441SEvalZero                             (BITS(last.bits + last.op) >> last.bits)];
540*10465441SEvalZero                     if ((unsigned)(last.bits + this.bits) <= bits) break;
541*10465441SEvalZero                     PULLBYTE();
542*10465441SEvalZero                 }
543*10465441SEvalZero                 DROPBITS(last.bits);
544*10465441SEvalZero             }
545*10465441SEvalZero             DROPBITS(this.bits);
546*10465441SEvalZero             if (this.op & 64) {
547*10465441SEvalZero                 strm->msg = (char *)"invalid distance code";
548*10465441SEvalZero                 state->mode = BAD;
549*10465441SEvalZero                 break;
550*10465441SEvalZero             }
551*10465441SEvalZero             state->offset = (unsigned)this.val;
552*10465441SEvalZero 
553*10465441SEvalZero             /* get distance extra bits, if any */
554*10465441SEvalZero             state->extra = (unsigned)(this.op) & 15;
555*10465441SEvalZero             if (state->extra != 0) {
556*10465441SEvalZero                 NEEDBITS(state->extra);
557*10465441SEvalZero                 state->offset += BITS(state->extra);
558*10465441SEvalZero                 DROPBITS(state->extra);
559*10465441SEvalZero             }
560*10465441SEvalZero             if (state->offset > state->wsize - (state->whave < state->wsize ?
561*10465441SEvalZero                                                 left : 0)) {
562*10465441SEvalZero                 strm->msg = (char *)"invalid distance too far back";
563*10465441SEvalZero                 state->mode = BAD;
564*10465441SEvalZero                 break;
565*10465441SEvalZero             }
566*10465441SEvalZero             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
567*10465441SEvalZero 
568*10465441SEvalZero             /* copy match from window to output */
569*10465441SEvalZero             do {
570*10465441SEvalZero                 ROOM();
571*10465441SEvalZero                 copy = state->wsize - state->offset;
572*10465441SEvalZero                 if (copy < left) {
573*10465441SEvalZero                     from = put + copy;
574*10465441SEvalZero                     copy = left - copy;
575*10465441SEvalZero                 }
576*10465441SEvalZero                 else {
577*10465441SEvalZero                     from = put - state->offset;
578*10465441SEvalZero                     copy = left;
579*10465441SEvalZero                 }
580*10465441SEvalZero                 if (copy > state->length) copy = state->length;
581*10465441SEvalZero                 state->length -= copy;
582*10465441SEvalZero                 left -= copy;
583*10465441SEvalZero                 do {
584*10465441SEvalZero                     *put++ = *from++;
585*10465441SEvalZero                 } while (--copy);
586*10465441SEvalZero             } while (state->length != 0);
587*10465441SEvalZero             break;
588*10465441SEvalZero 
589*10465441SEvalZero         case DONE:
590*10465441SEvalZero             /* inflate stream terminated properly -- write leftover output */
591*10465441SEvalZero             ret = Z_STREAM_END;
592*10465441SEvalZero             if (left < state->wsize) {
593*10465441SEvalZero                 if (out(out_desc, state->window, state->wsize - left))
594*10465441SEvalZero                     ret = Z_BUF_ERROR;
595*10465441SEvalZero             }
596*10465441SEvalZero             goto inf_leave;
597*10465441SEvalZero 
598*10465441SEvalZero         case BAD:
599*10465441SEvalZero             ret = Z_DATA_ERROR;
600*10465441SEvalZero             goto inf_leave;
601*10465441SEvalZero 
602*10465441SEvalZero         default:                /* can't happen, but makes compilers happy */
603*10465441SEvalZero             ret = Z_STREAM_ERROR;
604*10465441SEvalZero             goto inf_leave;
605*10465441SEvalZero         }
606*10465441SEvalZero 
607*10465441SEvalZero     /* Return unused input */
608*10465441SEvalZero   inf_leave:
609*10465441SEvalZero     strm->next_in = next;
610*10465441SEvalZero     strm->avail_in = have;
611*10465441SEvalZero     return ret;
612*10465441SEvalZero }
613*10465441SEvalZero 
inflateBackEnd(strm)614*10465441SEvalZero int ZEXPORT inflateBackEnd(strm)
615*10465441SEvalZero z_streamp strm;
616*10465441SEvalZero {
617*10465441SEvalZero     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
618*10465441SEvalZero         return Z_STREAM_ERROR;
619*10465441SEvalZero     ZFREE(strm, strm->state);
620*10465441SEvalZero     strm->state = Z_NULL;
621*10465441SEvalZero     Tracev((stderr, "inflate: end\n"));
622*10465441SEvalZero     return Z_OK;
623*10465441SEvalZero }
624