xref: /rk3399_rockchip-uboot/lib/zlib/inflate.c (revision e89516f031dbf711b71e6ee4d131cdc8b9946fb0)
1*e89516f0SMike Frysinger /* inflate.c -- zlib decompression
2*e89516f0SMike Frysinger  * Copyright (C) 1995-2005 Mark Adler
3*e89516f0SMike Frysinger  * For conditions of distribution and use, see copyright notice in zlib.h
4*e89516f0SMike Frysinger  */
5*e89516f0SMike Frysinger local void fixedtables OF((struct inflate_state FAR *state));
6*e89516f0SMike Frysinger local int updatewindow OF((z_streamp strm, unsigned out));
7*e89516f0SMike Frysinger 
8*e89516f0SMike Frysinger int ZEXPORT inflateReset(strm)
9*e89516f0SMike Frysinger z_streamp strm;
10*e89516f0SMike Frysinger {
11*e89516f0SMike Frysinger     struct inflate_state FAR *state;
12*e89516f0SMike Frysinger 
13*e89516f0SMike Frysinger     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
14*e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
15*e89516f0SMike Frysinger     strm->total_in = strm->total_out = state->total = 0;
16*e89516f0SMike Frysinger     strm->msg = Z_NULL;
17*e89516f0SMike Frysinger     strm->adler = 1;        /* to support ill-conceived Java test suite */
18*e89516f0SMike Frysinger     state->mode = HEAD;
19*e89516f0SMike Frysinger     state->last = 0;
20*e89516f0SMike Frysinger     state->havedict = 0;
21*e89516f0SMike Frysinger     state->dmax = 32768U;
22*e89516f0SMike Frysinger     state->head = Z_NULL;
23*e89516f0SMike Frysinger     state->wsize = 0;
24*e89516f0SMike Frysinger     state->whave = 0;
25*e89516f0SMike Frysinger     state->write = 0;
26*e89516f0SMike Frysinger     state->hold = 0;
27*e89516f0SMike Frysinger     state->bits = 0;
28*e89516f0SMike Frysinger     state->lencode = state->distcode = state->next = state->codes;
29*e89516f0SMike Frysinger     WATCHDOG_RESET();
30*e89516f0SMike Frysinger     Tracev((stderr, "inflate: reset\n"));
31*e89516f0SMike Frysinger     return Z_OK;
32*e89516f0SMike Frysinger }
33*e89516f0SMike Frysinger 
34*e89516f0SMike Frysinger int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
35*e89516f0SMike Frysinger z_streamp strm;
36*e89516f0SMike Frysinger int windowBits;
37*e89516f0SMike Frysinger const char *version;
38*e89516f0SMike Frysinger int stream_size;
39*e89516f0SMike Frysinger {
40*e89516f0SMike Frysinger     struct inflate_state FAR *state;
41*e89516f0SMike Frysinger 
42*e89516f0SMike Frysinger     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
43*e89516f0SMike Frysinger         stream_size != (int)(sizeof(z_stream)))
44*e89516f0SMike Frysinger         return Z_VERSION_ERROR;
45*e89516f0SMike Frysinger     if (strm == Z_NULL) return Z_STREAM_ERROR;
46*e89516f0SMike Frysinger     strm->msg = Z_NULL;                 /* in case we return an error */
47*e89516f0SMike Frysinger     if (strm->zalloc == (alloc_func)0) {
48*e89516f0SMike Frysinger         strm->zalloc = zcalloc;
49*e89516f0SMike Frysinger         strm->opaque = (voidpf)0;
50*e89516f0SMike Frysinger     }
51*e89516f0SMike Frysinger     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
52*e89516f0SMike Frysinger     state = (struct inflate_state FAR *)
53*e89516f0SMike Frysinger             ZALLOC(strm, 1, sizeof(struct inflate_state));
54*e89516f0SMike Frysinger     if (state == Z_NULL) return Z_MEM_ERROR;
55*e89516f0SMike Frysinger     Tracev((stderr, "inflate: allocated\n"));
56*e89516f0SMike Frysinger     strm->state = (struct internal_state FAR *)state;
57*e89516f0SMike Frysinger     if (windowBits < 0) {
58*e89516f0SMike Frysinger         state->wrap = 0;
59*e89516f0SMike Frysinger         windowBits = -windowBits;
60*e89516f0SMike Frysinger     }
61*e89516f0SMike Frysinger     else {
62*e89516f0SMike Frysinger         state->wrap = (windowBits >> 4) + 1;
63*e89516f0SMike Frysinger #ifdef GUNZIP
64*e89516f0SMike Frysinger         if (windowBits < 48) windowBits &= 15;
65*e89516f0SMike Frysinger #endif
66*e89516f0SMike Frysinger     }
67*e89516f0SMike Frysinger     if (windowBits < 8 || windowBits > 15) {
68*e89516f0SMike Frysinger         ZFREE(strm, state);
69*e89516f0SMike Frysinger         strm->state = Z_NULL;
70*e89516f0SMike Frysinger         return Z_STREAM_ERROR;
71*e89516f0SMike Frysinger     }
72*e89516f0SMike Frysinger     state->wbits = (unsigned)windowBits;
73*e89516f0SMike Frysinger     state->window = Z_NULL;
74*e89516f0SMike Frysinger     return inflateReset(strm);
75*e89516f0SMike Frysinger }
76*e89516f0SMike Frysinger 
77*e89516f0SMike Frysinger int ZEXPORT inflateInit_(strm, version, stream_size)
78*e89516f0SMike Frysinger z_streamp strm;
79*e89516f0SMike Frysinger const char *version;
80*e89516f0SMike Frysinger int stream_size;
81*e89516f0SMike Frysinger {
82*e89516f0SMike Frysinger     return inflateInit2_(strm, DEF_WBITS, version, stream_size);
83*e89516f0SMike Frysinger }
84*e89516f0SMike Frysinger 
85*e89516f0SMike Frysinger local void fixedtables(state)
86*e89516f0SMike Frysinger struct inflate_state FAR *state;
87*e89516f0SMike Frysinger {
88*e89516f0SMike Frysinger     state->lencode = lenfix;
89*e89516f0SMike Frysinger     state->lenbits = 9;
90*e89516f0SMike Frysinger     state->distcode = distfix;
91*e89516f0SMike Frysinger     state->distbits = 5;
92*e89516f0SMike Frysinger }
93*e89516f0SMike Frysinger 
94*e89516f0SMike Frysinger /*
95*e89516f0SMike Frysinger    Update the window with the last wsize (normally 32K) bytes written before
96*e89516f0SMike Frysinger    returning.  If window does not exist yet, create it.  This is only called
97*e89516f0SMike Frysinger    when a window is already in use, or when output has been written during this
98*e89516f0SMike Frysinger    inflate call, but the end of the deflate stream has not been reached yet.
99*e89516f0SMike Frysinger    It is also called to create a window for dictionary data when a dictionary
100*e89516f0SMike Frysinger    is loaded.
101*e89516f0SMike Frysinger 
102*e89516f0SMike Frysinger    Providing output buffers larger than 32K to inflate() should provide a speed
103*e89516f0SMike Frysinger    advantage, since only the last 32K of output is copied to the sliding window
104*e89516f0SMike Frysinger    upon return from inflate(), and since all distances after the first 32K of
105*e89516f0SMike Frysinger    output will fall in the output data, making match copies simpler and faster.
106*e89516f0SMike Frysinger    The advantage may be dependent on the size of the processor's data caches.
107*e89516f0SMike Frysinger  */
108*e89516f0SMike Frysinger local int updatewindow(strm, out)
109*e89516f0SMike Frysinger z_streamp strm;
110*e89516f0SMike Frysinger unsigned out;
111*e89516f0SMike Frysinger {
112*e89516f0SMike Frysinger     struct inflate_state FAR *state;
113*e89516f0SMike Frysinger     unsigned copy, dist;
114*e89516f0SMike Frysinger 
115*e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
116*e89516f0SMike Frysinger 
117*e89516f0SMike Frysinger     /* if it hasn't been done already, allocate space for the window */
118*e89516f0SMike Frysinger     if (state->window == Z_NULL) {
119*e89516f0SMike Frysinger         state->window = (unsigned char FAR *)
120*e89516f0SMike Frysinger                         ZALLOC(strm, 1U << state->wbits,
121*e89516f0SMike Frysinger                                sizeof(unsigned char));
122*e89516f0SMike Frysinger         if (state->window == Z_NULL) return 1;
123*e89516f0SMike Frysinger     }
124*e89516f0SMike Frysinger 
125*e89516f0SMike Frysinger     /* if window not in use yet, initialize */
126*e89516f0SMike Frysinger     if (state->wsize == 0) {
127*e89516f0SMike Frysinger         state->wsize = 1U << state->wbits;
128*e89516f0SMike Frysinger         state->write = 0;
129*e89516f0SMike Frysinger         state->whave = 0;
130*e89516f0SMike Frysinger     }
131*e89516f0SMike Frysinger 
132*e89516f0SMike Frysinger     /* copy state->wsize or less output bytes into the circular window */
133*e89516f0SMike Frysinger     copy = out - strm->avail_out;
134*e89516f0SMike Frysinger     if (copy >= state->wsize) {
135*e89516f0SMike Frysinger         zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
136*e89516f0SMike Frysinger         state->write = 0;
137*e89516f0SMike Frysinger         state->whave = state->wsize;
138*e89516f0SMike Frysinger     }
139*e89516f0SMike Frysinger     else {
140*e89516f0SMike Frysinger         dist = state->wsize - state->write;
141*e89516f0SMike Frysinger         if (dist > copy) dist = copy;
142*e89516f0SMike Frysinger         zmemcpy(state->window + state->write, strm->next_out - copy, dist);
143*e89516f0SMike Frysinger         copy -= dist;
144*e89516f0SMike Frysinger         if (copy) {
145*e89516f0SMike Frysinger             zmemcpy(state->window, strm->next_out - copy, copy);
146*e89516f0SMike Frysinger             state->write = copy;
147*e89516f0SMike Frysinger             state->whave = state->wsize;
148*e89516f0SMike Frysinger         }
149*e89516f0SMike Frysinger         else {
150*e89516f0SMike Frysinger             state->write += dist;
151*e89516f0SMike Frysinger             if (state->write == state->wsize) state->write = 0;
152*e89516f0SMike Frysinger             if (state->whave < state->wsize) state->whave += dist;
153*e89516f0SMike Frysinger         }
154*e89516f0SMike Frysinger     }
155*e89516f0SMike Frysinger     return 0;
156*e89516f0SMike Frysinger }
157*e89516f0SMike Frysinger 
158*e89516f0SMike Frysinger /* Macros for inflate(): */
159*e89516f0SMike Frysinger 
160*e89516f0SMike Frysinger /* check function to use adler32() for zlib or crc32() for gzip */
161*e89516f0SMike Frysinger #ifdef GUNZIP
162*e89516f0SMike Frysinger #  define UPDATE(check, buf, len) \
163*e89516f0SMike Frysinger     (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
164*e89516f0SMike Frysinger #else
165*e89516f0SMike Frysinger #  define UPDATE(check, buf, len) adler32(check, buf, len)
166*e89516f0SMike Frysinger #endif
167*e89516f0SMike Frysinger 
168*e89516f0SMike Frysinger /* check macros for header crc */
169*e89516f0SMike Frysinger #ifdef GUNZIP
170*e89516f0SMike Frysinger #  define CRC2(check, word) \
171*e89516f0SMike Frysinger     do { \
172*e89516f0SMike Frysinger         hbuf[0] = (unsigned char)(word); \
173*e89516f0SMike Frysinger         hbuf[1] = (unsigned char)((word) >> 8); \
174*e89516f0SMike Frysinger         check = crc32(check, hbuf, 2); \
175*e89516f0SMike Frysinger     } while (0)
176*e89516f0SMike Frysinger 
177*e89516f0SMike Frysinger #  define CRC4(check, word) \
178*e89516f0SMike Frysinger     do { \
179*e89516f0SMike Frysinger         hbuf[0] = (unsigned char)(word); \
180*e89516f0SMike Frysinger         hbuf[1] = (unsigned char)((word) >> 8); \
181*e89516f0SMike Frysinger         hbuf[2] = (unsigned char)((word) >> 16); \
182*e89516f0SMike Frysinger         hbuf[3] = (unsigned char)((word) >> 24); \
183*e89516f0SMike Frysinger         check = crc32(check, hbuf, 4); \
184*e89516f0SMike Frysinger     } while (0)
185*e89516f0SMike Frysinger #endif
186*e89516f0SMike Frysinger 
187*e89516f0SMike Frysinger /* Load registers with state in inflate() for speed */
188*e89516f0SMike Frysinger #define LOAD() \
189*e89516f0SMike Frysinger     do { \
190*e89516f0SMike Frysinger         put = strm->next_out; \
191*e89516f0SMike Frysinger         left = strm->avail_out; \
192*e89516f0SMike Frysinger         next = strm->next_in; \
193*e89516f0SMike Frysinger         have = strm->avail_in; \
194*e89516f0SMike Frysinger         hold = state->hold; \
195*e89516f0SMike Frysinger         bits = state->bits; \
196*e89516f0SMike Frysinger     } while (0)
197*e89516f0SMike Frysinger 
198*e89516f0SMike Frysinger /* Restore state from registers in inflate() */
199*e89516f0SMike Frysinger #define RESTORE() \
200*e89516f0SMike Frysinger     do { \
201*e89516f0SMike Frysinger         strm->next_out = put; \
202*e89516f0SMike Frysinger         strm->avail_out = left; \
203*e89516f0SMike Frysinger         strm->next_in = next; \
204*e89516f0SMike Frysinger         strm->avail_in = have; \
205*e89516f0SMike Frysinger         state->hold = hold; \
206*e89516f0SMike Frysinger         state->bits = bits; \
207*e89516f0SMike Frysinger     } while (0)
208*e89516f0SMike Frysinger 
209*e89516f0SMike Frysinger /* Clear the input bit accumulator */
210*e89516f0SMike Frysinger #define INITBITS() \
211*e89516f0SMike Frysinger     do { \
212*e89516f0SMike Frysinger         hold = 0; \
213*e89516f0SMike Frysinger         bits = 0; \
214*e89516f0SMike Frysinger     } while (0)
215*e89516f0SMike Frysinger 
216*e89516f0SMike Frysinger /* Get a byte of input into the bit accumulator, or return from inflate()
217*e89516f0SMike Frysinger    if there is no input available. */
218*e89516f0SMike Frysinger #define PULLBYTE() \
219*e89516f0SMike Frysinger     do { \
220*e89516f0SMike Frysinger         if (have == 0) goto inf_leave; \
221*e89516f0SMike Frysinger         have--; \
222*e89516f0SMike Frysinger         hold += (unsigned long)(*next++) << bits; \
223*e89516f0SMike Frysinger         bits += 8; \
224*e89516f0SMike Frysinger     } while (0)
225*e89516f0SMike Frysinger 
226*e89516f0SMike Frysinger /* Assure that there are at least n bits in the bit accumulator.  If there is
227*e89516f0SMike Frysinger    not enough available input to do that, then return from inflate(). */
228*e89516f0SMike Frysinger #define NEEDBITS(n) \
229*e89516f0SMike Frysinger     do { \
230*e89516f0SMike Frysinger         while (bits < (unsigned)(n)) \
231*e89516f0SMike Frysinger             PULLBYTE(); \
232*e89516f0SMike Frysinger     } while (0)
233*e89516f0SMike Frysinger 
234*e89516f0SMike Frysinger /* Return the low n bits of the bit accumulator (n < 16) */
235*e89516f0SMike Frysinger #define BITS(n) \
236*e89516f0SMike Frysinger     ((unsigned)hold & ((1U << (n)) - 1))
237*e89516f0SMike Frysinger 
238*e89516f0SMike Frysinger /* Remove n bits from the bit accumulator */
239*e89516f0SMike Frysinger #define DROPBITS(n) \
240*e89516f0SMike Frysinger     do { \
241*e89516f0SMike Frysinger         hold >>= (n); \
242*e89516f0SMike Frysinger         bits -= (unsigned)(n); \
243*e89516f0SMike Frysinger     } while (0)
244*e89516f0SMike Frysinger 
245*e89516f0SMike Frysinger /* Remove zero to seven bits as needed to go to a byte boundary */
246*e89516f0SMike Frysinger #define BYTEBITS() \
247*e89516f0SMike Frysinger     do { \
248*e89516f0SMike Frysinger         hold >>= bits & 7; \
249*e89516f0SMike Frysinger         bits -= bits & 7; \
250*e89516f0SMike Frysinger     } while (0)
251*e89516f0SMike Frysinger 
252*e89516f0SMike Frysinger /* Reverse the bytes in a 32-bit value */
253*e89516f0SMike Frysinger #define REVERSE(q) \
254*e89516f0SMike Frysinger     ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
255*e89516f0SMike Frysinger      (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
256*e89516f0SMike Frysinger 
257*e89516f0SMike Frysinger /*
258*e89516f0SMike Frysinger    inflate() uses a state machine to process as much input data and generate as
259*e89516f0SMike Frysinger    much output data as possible before returning.  The state machine is
260*e89516f0SMike Frysinger    structured roughly as follows:
261*e89516f0SMike Frysinger 
262*e89516f0SMike Frysinger     for (;;) switch (state) {
263*e89516f0SMike Frysinger     ...
264*e89516f0SMike Frysinger     case STATEn:
265*e89516f0SMike Frysinger         if (not enough input data or output space to make progress)
266*e89516f0SMike Frysinger             return;
267*e89516f0SMike Frysinger         ... make progress ...
268*e89516f0SMike Frysinger         state = STATEm;
269*e89516f0SMike Frysinger         break;
270*e89516f0SMike Frysinger     ...
271*e89516f0SMike Frysinger     }
272*e89516f0SMike Frysinger 
273*e89516f0SMike Frysinger    so when inflate() is called again, the same case is attempted again, and
274*e89516f0SMike Frysinger    if the appropriate resources are provided, the machine proceeds to the
275*e89516f0SMike Frysinger    next state.  The NEEDBITS() macro is usually the way the state evaluates
276*e89516f0SMike Frysinger    whether it can proceed or should return.  NEEDBITS() does the return if
277*e89516f0SMike Frysinger    the requested bits are not available.  The typical use of the BITS macros
278*e89516f0SMike Frysinger    is:
279*e89516f0SMike Frysinger 
280*e89516f0SMike Frysinger         NEEDBITS(n);
281*e89516f0SMike Frysinger         ... do something with BITS(n) ...
282*e89516f0SMike Frysinger         DROPBITS(n);
283*e89516f0SMike Frysinger 
284*e89516f0SMike Frysinger    where NEEDBITS(n) either returns from inflate() if there isn't enough
285*e89516f0SMike Frysinger    input left to load n bits into the accumulator, or it continues.  BITS(n)
286*e89516f0SMike Frysinger    gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
287*e89516f0SMike Frysinger    the low n bits off the accumulator.  INITBITS() clears the accumulator
288*e89516f0SMike Frysinger    and sets the number of available bits to zero.  BYTEBITS() discards just
289*e89516f0SMike Frysinger    enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
290*e89516f0SMike Frysinger    and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
291*e89516f0SMike Frysinger 
292*e89516f0SMike Frysinger    NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
293*e89516f0SMike Frysinger    if there is no input available.  The decoding of variable length codes uses
294*e89516f0SMike Frysinger    PULLBYTE() directly in order to pull just enough bytes to decode the next
295*e89516f0SMike Frysinger    code, and no more.
296*e89516f0SMike Frysinger 
297*e89516f0SMike Frysinger    Some states loop until they get enough input, making sure that enough
298*e89516f0SMike Frysinger    state information is maintained to continue the loop where it left off
299*e89516f0SMike Frysinger    if NEEDBITS() returns in the loop.  For example, want, need, and keep
300*e89516f0SMike Frysinger    would all have to actually be part of the saved state in case NEEDBITS()
301*e89516f0SMike Frysinger    returns:
302*e89516f0SMike Frysinger 
303*e89516f0SMike Frysinger     case STATEw:
304*e89516f0SMike Frysinger         while (want < need) {
305*e89516f0SMike Frysinger             NEEDBITS(n);
306*e89516f0SMike Frysinger             keep[want++] = BITS(n);
307*e89516f0SMike Frysinger             DROPBITS(n);
308*e89516f0SMike Frysinger         }
309*e89516f0SMike Frysinger         state = STATEx;
310*e89516f0SMike Frysinger     case STATEx:
311*e89516f0SMike Frysinger 
312*e89516f0SMike Frysinger    As shown above, if the next state is also the next case, then the break
313*e89516f0SMike Frysinger    is omitted.
314*e89516f0SMike Frysinger 
315*e89516f0SMike Frysinger    A state may also return if there is not enough output space available to
316*e89516f0SMike Frysinger    complete that state.  Those states are copying stored data, writing a
317*e89516f0SMike Frysinger    literal byte, and copying a matching string.
318*e89516f0SMike Frysinger 
319*e89516f0SMike Frysinger    When returning, a "goto inf_leave" is used to update the total counters,
320*e89516f0SMike Frysinger    update the check value, and determine whether any progress has been made
321*e89516f0SMike Frysinger    during that inflate() call in order to return the proper return code.
322*e89516f0SMike Frysinger    Progress is defined as a change in either strm->avail_in or strm->avail_out.
323*e89516f0SMike Frysinger    When there is a window, goto inf_leave will update the window with the last
324*e89516f0SMike Frysinger    output written.  If a goto inf_leave occurs in the middle of decompression
325*e89516f0SMike Frysinger    and there is no window currently, goto inf_leave will create one and copy
326*e89516f0SMike Frysinger    output to the window for the next call of inflate().
327*e89516f0SMike Frysinger 
328*e89516f0SMike Frysinger    In this implementation, the flush parameter of inflate() only affects the
329*e89516f0SMike Frysinger    return code (per zlib.h).  inflate() always writes as much as possible to
330*e89516f0SMike Frysinger    strm->next_out, given the space available and the provided input--the effect
331*e89516f0SMike Frysinger    documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
332*e89516f0SMike Frysinger    the allocation of and copying into a sliding window until necessary, which
333*e89516f0SMike Frysinger    provides the effect documented in zlib.h for Z_FINISH when the entire input
334*e89516f0SMike Frysinger    stream available.  So the only thing the flush parameter actually does is:
335*e89516f0SMike Frysinger    when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
336*e89516f0SMike Frysinger    will return Z_BUF_ERROR if it has not reached the end of the stream.
337*e89516f0SMike Frysinger  */
338*e89516f0SMike Frysinger int ZEXPORT inflate(strm, flush)
339*e89516f0SMike Frysinger z_streamp strm;
340*e89516f0SMike Frysinger int flush;
341*e89516f0SMike Frysinger {
342*e89516f0SMike Frysinger     struct inflate_state FAR *state;
343*e89516f0SMike Frysinger     unsigned char FAR *next;    /* next input */
344*e89516f0SMike Frysinger     unsigned char FAR *put;     /* next output */
345*e89516f0SMike Frysinger     unsigned have, left;        /* available input and output */
346*e89516f0SMike Frysinger     unsigned long hold;         /* bit buffer */
347*e89516f0SMike Frysinger     unsigned bits;              /* bits in bit buffer */
348*e89516f0SMike Frysinger     unsigned in, out;           /* save starting available input and output */
349*e89516f0SMike Frysinger     unsigned copy;              /* number of stored or match bytes to copy */
350*e89516f0SMike Frysinger     unsigned char FAR *from;    /* where to copy match bytes from */
351*e89516f0SMike Frysinger     code this;                  /* current decoding table entry */
352*e89516f0SMike Frysinger     code last;                  /* parent table entry */
353*e89516f0SMike Frysinger     unsigned len;               /* length to copy for repeats, bits to drop */
354*e89516f0SMike Frysinger     int ret;                    /* return code */
355*e89516f0SMike Frysinger #ifdef GUNZIP
356*e89516f0SMike Frysinger     unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
357*e89516f0SMike Frysinger #endif
358*e89516f0SMike Frysinger     static const unsigned short order[19] = /* permutation of code lengths */
359*e89516f0SMike Frysinger         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
360*e89516f0SMike Frysinger 
361*e89516f0SMike Frysinger     if (strm == Z_NULL || strm->state == Z_NULL ||
362*e89516f0SMike Frysinger         (strm->next_in == Z_NULL && strm->avail_in != 0))
363*e89516f0SMike Frysinger         return Z_STREAM_ERROR;
364*e89516f0SMike Frysinger 
365*e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
366*e89516f0SMike Frysinger     if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
367*e89516f0SMike Frysinger     LOAD();
368*e89516f0SMike Frysinger     in = have;
369*e89516f0SMike Frysinger     out = left;
370*e89516f0SMike Frysinger     ret = Z_OK;
371*e89516f0SMike Frysinger     for (;;)
372*e89516f0SMike Frysinger         switch (state->mode) {
373*e89516f0SMike Frysinger         case HEAD:
374*e89516f0SMike Frysinger             if (state->wrap == 0) {
375*e89516f0SMike Frysinger                 state->mode = TYPEDO;
376*e89516f0SMike Frysinger                 break;
377*e89516f0SMike Frysinger             }
378*e89516f0SMike Frysinger             NEEDBITS(16);
379*e89516f0SMike Frysinger #ifdef GUNZIP
380*e89516f0SMike Frysinger             if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
381*e89516f0SMike Frysinger                 state->check = crc32(0L, Z_NULL, 0);
382*e89516f0SMike Frysinger                 CRC2(state->check, hold);
383*e89516f0SMike Frysinger                 INITBITS();
384*e89516f0SMike Frysinger                 state->mode = FLAGS;
385*e89516f0SMike Frysinger                 break;
386*e89516f0SMike Frysinger             }
387*e89516f0SMike Frysinger             state->flags = 0;           /* expect zlib header */
388*e89516f0SMike Frysinger             if (state->head != Z_NULL)
389*e89516f0SMike Frysinger                 state->head->done = -1;
390*e89516f0SMike Frysinger             if (!(state->wrap & 1) ||   /* check if zlib header allowed */
391*e89516f0SMike Frysinger #else
392*e89516f0SMike Frysinger             if (
393*e89516f0SMike Frysinger #endif
394*e89516f0SMike Frysinger                 ((BITS(8) << 8) + (hold >> 8)) % 31) {
395*e89516f0SMike Frysinger                 strm->msg = (char *)"incorrect header check";
396*e89516f0SMike Frysinger                 state->mode = BAD;
397*e89516f0SMike Frysinger                 break;
398*e89516f0SMike Frysinger             }
399*e89516f0SMike Frysinger             if (BITS(4) != Z_DEFLATED) {
400*e89516f0SMike Frysinger                 strm->msg = (char *)"unknown compression method";
401*e89516f0SMike Frysinger                 state->mode = BAD;
402*e89516f0SMike Frysinger                 break;
403*e89516f0SMike Frysinger             }
404*e89516f0SMike Frysinger             DROPBITS(4);
405*e89516f0SMike Frysinger             len = BITS(4) + 8;
406*e89516f0SMike Frysinger             if (len > state->wbits) {
407*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid window size";
408*e89516f0SMike Frysinger                 state->mode = BAD;
409*e89516f0SMike Frysinger                 break;
410*e89516f0SMike Frysinger             }
411*e89516f0SMike Frysinger             state->dmax = 1U << len;
412*e89516f0SMike Frysinger             Tracev((stderr, "inflate:   zlib header ok\n"));
413*e89516f0SMike Frysinger             strm->adler = state->check = adler32(0L, Z_NULL, 0);
414*e89516f0SMike Frysinger             state->mode = hold & 0x200 ? DICTID : TYPE;
415*e89516f0SMike Frysinger             INITBITS();
416*e89516f0SMike Frysinger             break;
417*e89516f0SMike Frysinger #ifdef GUNZIP
418*e89516f0SMike Frysinger         case FLAGS:
419*e89516f0SMike Frysinger             NEEDBITS(16);
420*e89516f0SMike Frysinger             state->flags = (int)(hold);
421*e89516f0SMike Frysinger             if ((state->flags & 0xff) != Z_DEFLATED) {
422*e89516f0SMike Frysinger                 strm->msg = (char *)"unknown compression method";
423*e89516f0SMike Frysinger                 state->mode = BAD;
424*e89516f0SMike Frysinger                 break;
425*e89516f0SMike Frysinger             }
426*e89516f0SMike Frysinger             if (state->flags & 0xe000) {
427*e89516f0SMike Frysinger                 strm->msg = (char *)"unknown header flags set";
428*e89516f0SMike Frysinger                 state->mode = BAD;
429*e89516f0SMike Frysinger                 break;
430*e89516f0SMike Frysinger             }
431*e89516f0SMike Frysinger             if (state->head != Z_NULL)
432*e89516f0SMike Frysinger                 state->head->text = (int)((hold >> 8) & 1);
433*e89516f0SMike Frysinger             if (state->flags & 0x0200) CRC2(state->check, hold);
434*e89516f0SMike Frysinger             INITBITS();
435*e89516f0SMike Frysinger             state->mode = TIME;
436*e89516f0SMike Frysinger         case TIME:
437*e89516f0SMike Frysinger             NEEDBITS(32);
438*e89516f0SMike Frysinger             if (state->head != Z_NULL)
439*e89516f0SMike Frysinger                 state->head->time = hold;
440*e89516f0SMike Frysinger             if (state->flags & 0x0200) CRC4(state->check, hold);
441*e89516f0SMike Frysinger             INITBITS();
442*e89516f0SMike Frysinger             state->mode = OS;
443*e89516f0SMike Frysinger         case OS:
444*e89516f0SMike Frysinger             NEEDBITS(16);
445*e89516f0SMike Frysinger             if (state->head != Z_NULL) {
446*e89516f0SMike Frysinger                 state->head->xflags = (int)(hold & 0xff);
447*e89516f0SMike Frysinger                 state->head->os = (int)(hold >> 8);
448*e89516f0SMike Frysinger             }
449*e89516f0SMike Frysinger             if (state->flags & 0x0200) CRC2(state->check, hold);
450*e89516f0SMike Frysinger             INITBITS();
451*e89516f0SMike Frysinger             state->mode = EXLEN;
452*e89516f0SMike Frysinger         case EXLEN:
453*e89516f0SMike Frysinger             if (state->flags & 0x0400) {
454*e89516f0SMike Frysinger                 NEEDBITS(16);
455*e89516f0SMike Frysinger                 state->length = (unsigned)(hold);
456*e89516f0SMike Frysinger                 if (state->head != Z_NULL)
457*e89516f0SMike Frysinger                     state->head->extra_len = (unsigned)hold;
458*e89516f0SMike Frysinger                 if (state->flags & 0x0200) CRC2(state->check, hold);
459*e89516f0SMike Frysinger                 INITBITS();
460*e89516f0SMike Frysinger             }
461*e89516f0SMike Frysinger             else if (state->head != Z_NULL)
462*e89516f0SMike Frysinger                 state->head->extra = Z_NULL;
463*e89516f0SMike Frysinger             state->mode = EXTRA;
464*e89516f0SMike Frysinger         case EXTRA:
465*e89516f0SMike Frysinger             if (state->flags & 0x0400) {
466*e89516f0SMike Frysinger                 copy = state->length;
467*e89516f0SMike Frysinger                 if (copy > have) copy = have;
468*e89516f0SMike Frysinger                 if (copy) {
469*e89516f0SMike Frysinger                     if (state->head != Z_NULL &&
470*e89516f0SMike Frysinger                         state->head->extra != Z_NULL) {
471*e89516f0SMike Frysinger                         len = state->head->extra_len - state->length;
472*e89516f0SMike Frysinger                         zmemcpy(state->head->extra + len, next,
473*e89516f0SMike Frysinger                                 len + copy > state->head->extra_max ?
474*e89516f0SMike Frysinger                                 state->head->extra_max - len : copy);
475*e89516f0SMike Frysinger                     }
476*e89516f0SMike Frysinger                     if (state->flags & 0x0200)
477*e89516f0SMike Frysinger                         state->check = crc32(state->check, next, copy);
478*e89516f0SMike Frysinger                     have -= copy;
479*e89516f0SMike Frysinger                     next += copy;
480*e89516f0SMike Frysinger                     state->length -= copy;
481*e89516f0SMike Frysinger                 }
482*e89516f0SMike Frysinger                 if (state->length) goto inf_leave;
483*e89516f0SMike Frysinger             }
484*e89516f0SMike Frysinger             state->length = 0;
485*e89516f0SMike Frysinger             state->mode = NAME;
486*e89516f0SMike Frysinger         case NAME:
487*e89516f0SMike Frysinger             if (state->flags & 0x0800) {
488*e89516f0SMike Frysinger                 if (have == 0) goto inf_leave;
489*e89516f0SMike Frysinger                 copy = 0;
490*e89516f0SMike Frysinger                 do {
491*e89516f0SMike Frysinger                     len = (unsigned)(next[copy++]);
492*e89516f0SMike Frysinger                     if (state->head != Z_NULL &&
493*e89516f0SMike Frysinger                             state->head->name != Z_NULL &&
494*e89516f0SMike Frysinger                             state->length < state->head->name_max)
495*e89516f0SMike Frysinger                         state->head->name[state->length++] = len;
496*e89516f0SMike Frysinger                 } while (len && copy < have);
497*e89516f0SMike Frysinger                 if (state->flags & 0x0200)
498*e89516f0SMike Frysinger                     state->check = crc32(state->check, next, copy);
499*e89516f0SMike Frysinger                 have -= copy;
500*e89516f0SMike Frysinger                 next += copy;
501*e89516f0SMike Frysinger                 if (len) goto inf_leave;
502*e89516f0SMike Frysinger             }
503*e89516f0SMike Frysinger             else if (state->head != Z_NULL)
504*e89516f0SMike Frysinger                 state->head->name = Z_NULL;
505*e89516f0SMike Frysinger             state->length = 0;
506*e89516f0SMike Frysinger             state->mode = COMMENT;
507*e89516f0SMike Frysinger         case COMMENT:
508*e89516f0SMike Frysinger             if (state->flags & 0x1000) {
509*e89516f0SMike Frysinger                 if (have == 0) goto inf_leave;
510*e89516f0SMike Frysinger                 copy = 0;
511*e89516f0SMike Frysinger                 do {
512*e89516f0SMike Frysinger                     len = (unsigned)(next[copy++]);
513*e89516f0SMike Frysinger                     if (state->head != Z_NULL &&
514*e89516f0SMike Frysinger                             state->head->comment != Z_NULL &&
515*e89516f0SMike Frysinger                             state->length < state->head->comm_max)
516*e89516f0SMike Frysinger                         state->head->comment[state->length++] = len;
517*e89516f0SMike Frysinger                 } while (len && copy < have);
518*e89516f0SMike Frysinger                 if (state->flags & 0x0200)
519*e89516f0SMike Frysinger                     state->check = crc32(state->check, next, copy);
520*e89516f0SMike Frysinger                 have -= copy;
521*e89516f0SMike Frysinger                 next += copy;
522*e89516f0SMike Frysinger                 if (len) goto inf_leave;
523*e89516f0SMike Frysinger             }
524*e89516f0SMike Frysinger             else if (state->head != Z_NULL)
525*e89516f0SMike Frysinger                 state->head->comment = Z_NULL;
526*e89516f0SMike Frysinger             state->mode = HCRC;
527*e89516f0SMike Frysinger         case HCRC:
528*e89516f0SMike Frysinger             if (state->flags & 0x0200) {
529*e89516f0SMike Frysinger                 NEEDBITS(16);
530*e89516f0SMike Frysinger                 if (hold != (state->check & 0xffff)) {
531*e89516f0SMike Frysinger                     strm->msg = (char *)"header crc mismatch";
532*e89516f0SMike Frysinger                     state->mode = BAD;
533*e89516f0SMike Frysinger                     break;
534*e89516f0SMike Frysinger                 }
535*e89516f0SMike Frysinger                 INITBITS();
536*e89516f0SMike Frysinger             }
537*e89516f0SMike Frysinger             if (state->head != Z_NULL) {
538*e89516f0SMike Frysinger                 state->head->hcrc = (int)((state->flags >> 9) & 1);
539*e89516f0SMike Frysinger                 state->head->done = 1;
540*e89516f0SMike Frysinger             }
541*e89516f0SMike Frysinger             strm->adler = state->check = crc32(0L, Z_NULL, 0);
542*e89516f0SMike Frysinger             state->mode = TYPE;
543*e89516f0SMike Frysinger             break;
544*e89516f0SMike Frysinger #endif
545*e89516f0SMike Frysinger         case DICTID:
546*e89516f0SMike Frysinger             NEEDBITS(32);
547*e89516f0SMike Frysinger             strm->adler = state->check = REVERSE(hold);
548*e89516f0SMike Frysinger             INITBITS();
549*e89516f0SMike Frysinger             state->mode = DICT;
550*e89516f0SMike Frysinger         case DICT:
551*e89516f0SMike Frysinger             if (state->havedict == 0) {
552*e89516f0SMike Frysinger                 RESTORE();
553*e89516f0SMike Frysinger                 return Z_NEED_DICT;
554*e89516f0SMike Frysinger             }
555*e89516f0SMike Frysinger             strm->adler = state->check = adler32(0L, Z_NULL, 0);
556*e89516f0SMike Frysinger             state->mode = TYPE;
557*e89516f0SMike Frysinger         case TYPE:
558*e89516f0SMike Frysinger 	    WATCHDOG_RESET();
559*e89516f0SMike Frysinger             if (flush == Z_BLOCK) goto inf_leave;
560*e89516f0SMike Frysinger         case TYPEDO:
561*e89516f0SMike Frysinger             if (state->last) {
562*e89516f0SMike Frysinger                 BYTEBITS();
563*e89516f0SMike Frysinger                 state->mode = CHECK;
564*e89516f0SMike Frysinger                 break;
565*e89516f0SMike Frysinger             }
566*e89516f0SMike Frysinger             NEEDBITS(3);
567*e89516f0SMike Frysinger             state->last = BITS(1);
568*e89516f0SMike Frysinger             DROPBITS(1);
569*e89516f0SMike Frysinger             switch (BITS(2)) {
570*e89516f0SMike Frysinger             case 0:                             /* stored block */
571*e89516f0SMike Frysinger                 Tracev((stderr, "inflate:     stored block%s\n",
572*e89516f0SMike Frysinger                         state->last ? " (last)" : ""));
573*e89516f0SMike Frysinger                 state->mode = STORED;
574*e89516f0SMike Frysinger                 break;
575*e89516f0SMike Frysinger             case 1:                             /* fixed block */
576*e89516f0SMike Frysinger                 fixedtables(state);
577*e89516f0SMike Frysinger                 Tracev((stderr, "inflate:     fixed codes block%s\n",
578*e89516f0SMike Frysinger                         state->last ? " (last)" : ""));
579*e89516f0SMike Frysinger                 state->mode = LEN;              /* decode codes */
580*e89516f0SMike Frysinger                 break;
581*e89516f0SMike Frysinger             case 2:                             /* dynamic block */
582*e89516f0SMike Frysinger                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
583*e89516f0SMike Frysinger                         state->last ? " (last)" : ""));
584*e89516f0SMike Frysinger                 state->mode = TABLE;
585*e89516f0SMike Frysinger                 break;
586*e89516f0SMike Frysinger             case 3:
587*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid block type";
588*e89516f0SMike Frysinger                 state->mode = BAD;
589*e89516f0SMike Frysinger             }
590*e89516f0SMike Frysinger             DROPBITS(2);
591*e89516f0SMike Frysinger             break;
592*e89516f0SMike Frysinger         case STORED:
593*e89516f0SMike Frysinger             BYTEBITS();                         /* go to byte boundary */
594*e89516f0SMike Frysinger             NEEDBITS(32);
595*e89516f0SMike Frysinger             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
596*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid stored block lengths";
597*e89516f0SMike Frysinger                 state->mode = BAD;
598*e89516f0SMike Frysinger                 break;
599*e89516f0SMike Frysinger             }
600*e89516f0SMike Frysinger             state->length = (unsigned)hold & 0xffff;
601*e89516f0SMike Frysinger             Tracev((stderr, "inflate:       stored length %u\n",
602*e89516f0SMike Frysinger                     state->length));
603*e89516f0SMike Frysinger             INITBITS();
604*e89516f0SMike Frysinger             state->mode = COPY;
605*e89516f0SMike Frysinger         case COPY:
606*e89516f0SMike Frysinger             copy = state->length;
607*e89516f0SMike Frysinger             if (copy) {
608*e89516f0SMike Frysinger                 if (copy > have) copy = have;
609*e89516f0SMike Frysinger                 if (copy > left) copy = left;
610*e89516f0SMike Frysinger                 if (copy == 0) goto inf_leave;
611*e89516f0SMike Frysinger                 zmemcpy(put, next, copy);
612*e89516f0SMike Frysinger                 have -= copy;
613*e89516f0SMike Frysinger                 next += copy;
614*e89516f0SMike Frysinger                 left -= copy;
615*e89516f0SMike Frysinger                 put += copy;
616*e89516f0SMike Frysinger                 state->length -= copy;
617*e89516f0SMike Frysinger                 break;
618*e89516f0SMike Frysinger             }
619*e89516f0SMike Frysinger             Tracev((stderr, "inflate:       stored end\n"));
620*e89516f0SMike Frysinger             state->mode = TYPE;
621*e89516f0SMike Frysinger             break;
622*e89516f0SMike Frysinger         case TABLE:
623*e89516f0SMike Frysinger             NEEDBITS(14);
624*e89516f0SMike Frysinger             state->nlen = BITS(5) + 257;
625*e89516f0SMike Frysinger             DROPBITS(5);
626*e89516f0SMike Frysinger             state->ndist = BITS(5) + 1;
627*e89516f0SMike Frysinger             DROPBITS(5);
628*e89516f0SMike Frysinger             state->ncode = BITS(4) + 4;
629*e89516f0SMike Frysinger             DROPBITS(4);
630*e89516f0SMike Frysinger #ifndef PKZIP_BUG_WORKAROUND
631*e89516f0SMike Frysinger             if (state->nlen > 286 || state->ndist > 30) {
632*e89516f0SMike Frysinger                 strm->msg = (char *)"too many length or distance symbols";
633*e89516f0SMike Frysinger                 state->mode = BAD;
634*e89516f0SMike Frysinger                 break;
635*e89516f0SMike Frysinger             }
636*e89516f0SMike Frysinger #endif
637*e89516f0SMike Frysinger             Tracev((stderr, "inflate:       table sizes ok\n"));
638*e89516f0SMike Frysinger             state->have = 0;
639*e89516f0SMike Frysinger             state->mode = LENLENS;
640*e89516f0SMike Frysinger         case LENLENS:
641*e89516f0SMike Frysinger             while (state->have < state->ncode) {
642*e89516f0SMike Frysinger                 NEEDBITS(3);
643*e89516f0SMike Frysinger                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
644*e89516f0SMike Frysinger                 DROPBITS(3);
645*e89516f0SMike Frysinger             }
646*e89516f0SMike Frysinger             while (state->have < 19)
647*e89516f0SMike Frysinger                 state->lens[order[state->have++]] = 0;
648*e89516f0SMike Frysinger             state->next = state->codes;
649*e89516f0SMike Frysinger             state->lencode = (code const FAR *)(state->next);
650*e89516f0SMike Frysinger             state->lenbits = 7;
651*e89516f0SMike Frysinger             ret = inflate_table(CODES, state->lens, 19, &(state->next),
652*e89516f0SMike Frysinger                                 &(state->lenbits), state->work);
653*e89516f0SMike Frysinger             if (ret) {
654*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid code lengths set";
655*e89516f0SMike Frysinger                 state->mode = BAD;
656*e89516f0SMike Frysinger                 break;
657*e89516f0SMike Frysinger             }
658*e89516f0SMike Frysinger             Tracev((stderr, "inflate:       code lengths ok\n"));
659*e89516f0SMike Frysinger             state->have = 0;
660*e89516f0SMike Frysinger             state->mode = CODELENS;
661*e89516f0SMike Frysinger         case CODELENS:
662*e89516f0SMike Frysinger             while (state->have < state->nlen + state->ndist) {
663*e89516f0SMike Frysinger                 for (;;) {
664*e89516f0SMike Frysinger                     this = state->lencode[BITS(state->lenbits)];
665*e89516f0SMike Frysinger                     if ((unsigned)(this.bits) <= bits) break;
666*e89516f0SMike Frysinger                     PULLBYTE();
667*e89516f0SMike Frysinger                 }
668*e89516f0SMike Frysinger                 if (this.val < 16) {
669*e89516f0SMike Frysinger                     NEEDBITS(this.bits);
670*e89516f0SMike Frysinger                     DROPBITS(this.bits);
671*e89516f0SMike Frysinger                     state->lens[state->have++] = this.val;
672*e89516f0SMike Frysinger                 }
673*e89516f0SMike Frysinger                 else {
674*e89516f0SMike Frysinger                     if (this.val == 16) {
675*e89516f0SMike Frysinger                         NEEDBITS(this.bits + 2);
676*e89516f0SMike Frysinger                         DROPBITS(this.bits);
677*e89516f0SMike Frysinger                         if (state->have == 0) {
678*e89516f0SMike Frysinger                             strm->msg = (char *)"invalid bit length repeat";
679*e89516f0SMike Frysinger                             state->mode = BAD;
680*e89516f0SMike Frysinger                             break;
681*e89516f0SMike Frysinger                         }
682*e89516f0SMike Frysinger                         len = state->lens[state->have - 1];
683*e89516f0SMike Frysinger                         copy = 3 + BITS(2);
684*e89516f0SMike Frysinger                         DROPBITS(2);
685*e89516f0SMike Frysinger                     }
686*e89516f0SMike Frysinger                     else if (this.val == 17) {
687*e89516f0SMike Frysinger                         NEEDBITS(this.bits + 3);
688*e89516f0SMike Frysinger                         DROPBITS(this.bits);
689*e89516f0SMike Frysinger                         len = 0;
690*e89516f0SMike Frysinger                         copy = 3 + BITS(3);
691*e89516f0SMike Frysinger                         DROPBITS(3);
692*e89516f0SMike Frysinger                     }
693*e89516f0SMike Frysinger                     else {
694*e89516f0SMike Frysinger                         NEEDBITS(this.bits + 7);
695*e89516f0SMike Frysinger                         DROPBITS(this.bits);
696*e89516f0SMike Frysinger                         len = 0;
697*e89516f0SMike Frysinger                         copy = 11 + BITS(7);
698*e89516f0SMike Frysinger                         DROPBITS(7);
699*e89516f0SMike Frysinger                     }
700*e89516f0SMike Frysinger                     if (state->have + copy > state->nlen + state->ndist) {
701*e89516f0SMike Frysinger                         strm->msg = (char *)"invalid bit length repeat";
702*e89516f0SMike Frysinger                         state->mode = BAD;
703*e89516f0SMike Frysinger                         break;
704*e89516f0SMike Frysinger                     }
705*e89516f0SMike Frysinger                     while (copy--)
706*e89516f0SMike Frysinger                         state->lens[state->have++] = (unsigned short)len;
707*e89516f0SMike Frysinger                 }
708*e89516f0SMike Frysinger             }
709*e89516f0SMike Frysinger 
710*e89516f0SMike Frysinger             /* handle error breaks in while */
711*e89516f0SMike Frysinger             if (state->mode == BAD) break;
712*e89516f0SMike Frysinger 
713*e89516f0SMike Frysinger             /* build code tables */
714*e89516f0SMike Frysinger             state->next = state->codes;
715*e89516f0SMike Frysinger             state->lencode = (code const FAR *)(state->next);
716*e89516f0SMike Frysinger             state->lenbits = 9;
717*e89516f0SMike Frysinger             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
718*e89516f0SMike Frysinger                                 &(state->lenbits), state->work);
719*e89516f0SMike Frysinger             if (ret) {
720*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid literal/lengths set";
721*e89516f0SMike Frysinger                 state->mode = BAD;
722*e89516f0SMike Frysinger                 break;
723*e89516f0SMike Frysinger             }
724*e89516f0SMike Frysinger             state->distcode = (code const FAR *)(state->next);
725*e89516f0SMike Frysinger             state->distbits = 6;
726*e89516f0SMike Frysinger             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
727*e89516f0SMike Frysinger                             &(state->next), &(state->distbits), state->work);
728*e89516f0SMike Frysinger             if (ret) {
729*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distances set";
730*e89516f0SMike Frysinger                 state->mode = BAD;
731*e89516f0SMike Frysinger                 break;
732*e89516f0SMike Frysinger             }
733*e89516f0SMike Frysinger             Tracev((stderr, "inflate:       codes ok\n"));
734*e89516f0SMike Frysinger             state->mode = LEN;
735*e89516f0SMike Frysinger         case LEN:
736*e89516f0SMike Frysinger 	    WATCHDOG_RESET();
737*e89516f0SMike Frysinger             if (have >= 6 && left >= 258) {
738*e89516f0SMike Frysinger                 RESTORE();
739*e89516f0SMike Frysinger                 inflate_fast(strm, out);
740*e89516f0SMike Frysinger                 LOAD();
741*e89516f0SMike Frysinger                 break;
742*e89516f0SMike Frysinger             }
743*e89516f0SMike Frysinger             for (;;) {
744*e89516f0SMike Frysinger                 this = state->lencode[BITS(state->lenbits)];
745*e89516f0SMike Frysinger                 if ((unsigned)(this.bits) <= bits) break;
746*e89516f0SMike Frysinger                 PULLBYTE();
747*e89516f0SMike Frysinger             }
748*e89516f0SMike Frysinger             if (this.op && (this.op & 0xf0) == 0) {
749*e89516f0SMike Frysinger                 last = this;
750*e89516f0SMike Frysinger                 for (;;) {
751*e89516f0SMike Frysinger                     this = state->lencode[last.val +
752*e89516f0SMike Frysinger                             (BITS(last.bits + last.op) >> last.bits)];
753*e89516f0SMike Frysinger                     if ((unsigned)(last.bits + this.bits) <= bits) break;
754*e89516f0SMike Frysinger                     PULLBYTE();
755*e89516f0SMike Frysinger                 }
756*e89516f0SMike Frysinger                 DROPBITS(last.bits);
757*e89516f0SMike Frysinger             }
758*e89516f0SMike Frysinger             DROPBITS(this.bits);
759*e89516f0SMike Frysinger             state->length = (unsigned)this.val;
760*e89516f0SMike Frysinger             if ((int)(this.op) == 0) {
761*e89516f0SMike Frysinger                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
762*e89516f0SMike Frysinger                         "inflate:         literal '%c'\n" :
763*e89516f0SMike Frysinger                         "inflate:         literal 0x%02x\n", this.val));
764*e89516f0SMike Frysinger                 state->mode = LIT;
765*e89516f0SMike Frysinger                 break;
766*e89516f0SMike Frysinger             }
767*e89516f0SMike Frysinger             if (this.op & 32) {
768*e89516f0SMike Frysinger                 Tracevv((stderr, "inflate:         end of block\n"));
769*e89516f0SMike Frysinger                 state->mode = TYPE;
770*e89516f0SMike Frysinger                 break;
771*e89516f0SMike Frysinger             }
772*e89516f0SMike Frysinger             if (this.op & 64) {
773*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid literal/length code";
774*e89516f0SMike Frysinger                 state->mode = BAD;
775*e89516f0SMike Frysinger                 break;
776*e89516f0SMike Frysinger             }
777*e89516f0SMike Frysinger             state->extra = (unsigned)(this.op) & 15;
778*e89516f0SMike Frysinger             state->mode = LENEXT;
779*e89516f0SMike Frysinger         case LENEXT:
780*e89516f0SMike Frysinger             if (state->extra) {
781*e89516f0SMike Frysinger                 NEEDBITS(state->extra);
782*e89516f0SMike Frysinger                 state->length += BITS(state->extra);
783*e89516f0SMike Frysinger                 DROPBITS(state->extra);
784*e89516f0SMike Frysinger             }
785*e89516f0SMike Frysinger             Tracevv((stderr, "inflate:         length %u\n", state->length));
786*e89516f0SMike Frysinger             state->mode = DIST;
787*e89516f0SMike Frysinger         case DIST:
788*e89516f0SMike Frysinger             for (;;) {
789*e89516f0SMike Frysinger                 this = state->distcode[BITS(state->distbits)];
790*e89516f0SMike Frysinger                 if ((unsigned)(this.bits) <= bits) break;
791*e89516f0SMike Frysinger                 PULLBYTE();
792*e89516f0SMike Frysinger             }
793*e89516f0SMike Frysinger             if ((this.op & 0xf0) == 0) {
794*e89516f0SMike Frysinger                 last = this;
795*e89516f0SMike Frysinger                 for (;;) {
796*e89516f0SMike Frysinger                     this = state->distcode[last.val +
797*e89516f0SMike Frysinger                             (BITS(last.bits + last.op) >> last.bits)];
798*e89516f0SMike Frysinger                     if ((unsigned)(last.bits + this.bits) <= bits) break;
799*e89516f0SMike Frysinger                     PULLBYTE();
800*e89516f0SMike Frysinger                 }
801*e89516f0SMike Frysinger                 DROPBITS(last.bits);
802*e89516f0SMike Frysinger             }
803*e89516f0SMike Frysinger             DROPBITS(this.bits);
804*e89516f0SMike Frysinger             if (this.op & 64) {
805*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distance code";
806*e89516f0SMike Frysinger                 state->mode = BAD;
807*e89516f0SMike Frysinger                 break;
808*e89516f0SMike Frysinger             }
809*e89516f0SMike Frysinger             state->offset = (unsigned)this.val;
810*e89516f0SMike Frysinger             state->extra = (unsigned)(this.op) & 15;
811*e89516f0SMike Frysinger             state->mode = DISTEXT;
812*e89516f0SMike Frysinger         case DISTEXT:
813*e89516f0SMike Frysinger             if (state->extra) {
814*e89516f0SMike Frysinger                 NEEDBITS(state->extra);
815*e89516f0SMike Frysinger                 state->offset += BITS(state->extra);
816*e89516f0SMike Frysinger                 DROPBITS(state->extra);
817*e89516f0SMike Frysinger             }
818*e89516f0SMike Frysinger #ifdef INFLATE_STRICT
819*e89516f0SMike Frysinger             if (state->offset > state->dmax) {
820*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distance too far back";
821*e89516f0SMike Frysinger                 state->mode = BAD;
822*e89516f0SMike Frysinger                 break;
823*e89516f0SMike Frysinger             }
824*e89516f0SMike Frysinger #endif
825*e89516f0SMike Frysinger             if (state->offset > state->whave + out - left) {
826*e89516f0SMike Frysinger                 strm->msg = (char *)"invalid distance too far back";
827*e89516f0SMike Frysinger                 state->mode = BAD;
828*e89516f0SMike Frysinger                 break;
829*e89516f0SMike Frysinger             }
830*e89516f0SMike Frysinger             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
831*e89516f0SMike Frysinger             state->mode = MATCH;
832*e89516f0SMike Frysinger         case MATCH:
833*e89516f0SMike Frysinger             if (left == 0) goto inf_leave;
834*e89516f0SMike Frysinger             copy = out - left;
835*e89516f0SMike Frysinger             if (state->offset > copy) {         /* copy from window */
836*e89516f0SMike Frysinger                 copy = state->offset - copy;
837*e89516f0SMike Frysinger                 if (copy > state->write) {
838*e89516f0SMike Frysinger                     copy -= state->write;
839*e89516f0SMike Frysinger                     from = state->window + (state->wsize - copy);
840*e89516f0SMike Frysinger                 }
841*e89516f0SMike Frysinger                 else
842*e89516f0SMike Frysinger                     from = state->window + (state->write - copy);
843*e89516f0SMike Frysinger                 if (copy > state->length) copy = state->length;
844*e89516f0SMike Frysinger             }
845*e89516f0SMike Frysinger             else {                              /* copy from output */
846*e89516f0SMike Frysinger                 from = put - state->offset;
847*e89516f0SMike Frysinger                 copy = state->length;
848*e89516f0SMike Frysinger             }
849*e89516f0SMike Frysinger             if (copy > left) copy = left;
850*e89516f0SMike Frysinger             left -= copy;
851*e89516f0SMike Frysinger             state->length -= copy;
852*e89516f0SMike Frysinger             do {
853*e89516f0SMike Frysinger                 *put++ = *from++;
854*e89516f0SMike Frysinger             } while (--copy);
855*e89516f0SMike Frysinger             if (state->length == 0) state->mode = LEN;
856*e89516f0SMike Frysinger             break;
857*e89516f0SMike Frysinger         case LIT:
858*e89516f0SMike Frysinger             if (left == 0) goto inf_leave;
859*e89516f0SMike Frysinger             *put++ = (unsigned char)(state->length);
860*e89516f0SMike Frysinger             left--;
861*e89516f0SMike Frysinger             state->mode = LEN;
862*e89516f0SMike Frysinger             break;
863*e89516f0SMike Frysinger         case CHECK:
864*e89516f0SMike Frysinger             if (state->wrap) {
865*e89516f0SMike Frysinger                 NEEDBITS(32);
866*e89516f0SMike Frysinger                 out -= left;
867*e89516f0SMike Frysinger                 strm->total_out += out;
868*e89516f0SMike Frysinger                 state->total += out;
869*e89516f0SMike Frysinger                 if (out)
870*e89516f0SMike Frysinger                     strm->adler = state->check =
871*e89516f0SMike Frysinger                         UPDATE(state->check, put - out, out);
872*e89516f0SMike Frysinger                 out = left;
873*e89516f0SMike Frysinger                 if ((
874*e89516f0SMike Frysinger #ifdef GUNZIP
875*e89516f0SMike Frysinger                      state->flags ? hold :
876*e89516f0SMike Frysinger #endif
877*e89516f0SMike Frysinger                      REVERSE(hold)) != state->check) {
878*e89516f0SMike Frysinger                     strm->msg = (char *)"incorrect data check";
879*e89516f0SMike Frysinger                     state->mode = BAD;
880*e89516f0SMike Frysinger                     break;
881*e89516f0SMike Frysinger                 }
882*e89516f0SMike Frysinger                 INITBITS();
883*e89516f0SMike Frysinger                 Tracev((stderr, "inflate:   check matches trailer\n"));
884*e89516f0SMike Frysinger             }
885*e89516f0SMike Frysinger #ifdef GUNZIP
886*e89516f0SMike Frysinger             state->mode = LENGTH;
887*e89516f0SMike Frysinger         case LENGTH:
888*e89516f0SMike Frysinger             if (state->wrap && state->flags) {
889*e89516f0SMike Frysinger                 NEEDBITS(32);
890*e89516f0SMike Frysinger                 if (hold != (state->total & 0xffffffffUL)) {
891*e89516f0SMike Frysinger                     strm->msg = (char *)"incorrect length check";
892*e89516f0SMike Frysinger                     state->mode = BAD;
893*e89516f0SMike Frysinger                     break;
894*e89516f0SMike Frysinger                 }
895*e89516f0SMike Frysinger                 INITBITS();
896*e89516f0SMike Frysinger                 Tracev((stderr, "inflate:   length matches trailer\n"));
897*e89516f0SMike Frysinger             }
898*e89516f0SMike Frysinger #endif
899*e89516f0SMike Frysinger             state->mode = DONE;
900*e89516f0SMike Frysinger         case DONE:
901*e89516f0SMike Frysinger             ret = Z_STREAM_END;
902*e89516f0SMike Frysinger             goto inf_leave;
903*e89516f0SMike Frysinger         case BAD:
904*e89516f0SMike Frysinger             ret = Z_DATA_ERROR;
905*e89516f0SMike Frysinger             goto inf_leave;
906*e89516f0SMike Frysinger         case MEM:
907*e89516f0SMike Frysinger             return Z_MEM_ERROR;
908*e89516f0SMike Frysinger         case SYNC:
909*e89516f0SMike Frysinger         default:
910*e89516f0SMike Frysinger             return Z_STREAM_ERROR;
911*e89516f0SMike Frysinger         }
912*e89516f0SMike Frysinger 
913*e89516f0SMike Frysinger     /*
914*e89516f0SMike Frysinger        Return from inflate(), updating the total counts and the check value.
915*e89516f0SMike Frysinger        If there was no progress during the inflate() call, return a buffer
916*e89516f0SMike Frysinger        error.  Call updatewindow() to create and/or update the window state.
917*e89516f0SMike Frysinger        Note: a memory error from inflate() is non-recoverable.
918*e89516f0SMike Frysinger      */
919*e89516f0SMike Frysinger   inf_leave:
920*e89516f0SMike Frysinger     RESTORE();
921*e89516f0SMike Frysinger     if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
922*e89516f0SMike Frysinger         if (updatewindow(strm, out)) {
923*e89516f0SMike Frysinger             state->mode = MEM;
924*e89516f0SMike Frysinger             return Z_MEM_ERROR;
925*e89516f0SMike Frysinger         }
926*e89516f0SMike Frysinger     in -= strm->avail_in;
927*e89516f0SMike Frysinger     out -= strm->avail_out;
928*e89516f0SMike Frysinger     strm->total_in += in;
929*e89516f0SMike Frysinger     strm->total_out += out;
930*e89516f0SMike Frysinger     state->total += out;
931*e89516f0SMike Frysinger     if (state->wrap && out)
932*e89516f0SMike Frysinger         strm->adler = state->check =
933*e89516f0SMike Frysinger             UPDATE(state->check, strm->next_out - out, out);
934*e89516f0SMike Frysinger     strm->data_type = state->bits + (state->last ? 64 : 0) +
935*e89516f0SMike Frysinger                       (state->mode == TYPE ? 128 : 0);
936*e89516f0SMike Frysinger     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
937*e89516f0SMike Frysinger         ret = Z_BUF_ERROR;
938*e89516f0SMike Frysinger     return ret;
939*e89516f0SMike Frysinger }
940*e89516f0SMike Frysinger 
941*e89516f0SMike Frysinger int ZEXPORT inflateEnd(strm)
942*e89516f0SMike Frysinger z_streamp strm;
943*e89516f0SMike Frysinger {
944*e89516f0SMike Frysinger     struct inflate_state FAR *state;
945*e89516f0SMike Frysinger     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
946*e89516f0SMike Frysinger         return Z_STREAM_ERROR;
947*e89516f0SMike Frysinger     state = (struct inflate_state FAR *)strm->state;
948*e89516f0SMike Frysinger     if (state->window != Z_NULL) {
949*e89516f0SMike Frysinger 	WATCHDOG_RESET();
950*e89516f0SMike Frysinger 	ZFREE(strm, state->window);
951*e89516f0SMike Frysinger     }
952*e89516f0SMike Frysinger     ZFREE(strm, strm->state);
953*e89516f0SMike Frysinger     strm->state = Z_NULL;
954*e89516f0SMike Frysinger     Tracev((stderr, "inflate: end\n"));
955*e89516f0SMike Frysinger     return Z_OK;
956*e89516f0SMike Frysinger }
957