xref: /netbsd-src/common/dist/zlib/inflate.c (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1 /*	$NetBSD: inflate.c,v 1.3 2006/05/13 22:05:04 christos Exp $	*/
2 
3 /* inflate.c -- zlib decompression
4  * Copyright (C) 1995-2005 Mark Adler
5  * For conditions of distribution and use, see copyright notice in zlib.h
6  */
7 
8 /*
9  * Change history:
10  *
11  * 1.2.beta0    24 Nov 2002
12  * - First version -- complete rewrite of inflate to simplify code, avoid
13  *   creation of window when not needed, minimize use of window when it is
14  *   needed, make inffast.c even faster, implement gzip decoding, and to
15  *   improve code readability and style over the previous zlib inflate code
16  *
17  * 1.2.beta1    25 Nov 2002
18  * - Use pointers for available input and output checking in inffast.c
19  * - Remove input and output counters in inffast.c
20  * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
21  * - Remove unnecessary second byte pull from length extra in inffast.c
22  * - Unroll direct copy to three copies per loop in inffast.c
23  *
24  * 1.2.beta2    4 Dec 2002
25  * - Change external routine names to reduce potential conflicts
26  * - Correct filename to inffixed.h for fixed tables in inflate.c
27  * - Make hbuf[] unsigned char to match parameter type in inflate.c
28  * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
29  *   to avoid negation problem on Alphas (64 bit) in inflate.c
30  *
31  * 1.2.beta3    22 Dec 2002
32  * - Add comments on state->bits assertion in inffast.c
33  * - Add comments on op field in inftrees.h
34  * - Fix bug in reuse of allocated window after inflateReset()
35  * - Remove bit fields--back to byte structure for speed
36  * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
37  * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
38  * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
39  * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
40  * - Use local copies of stream next and avail values, as well as local bit
41  *   buffer and bit count in inflate()--for speed when inflate_fast() not used
42  *
43  * 1.2.beta4    1 Jan 2003
44  * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
45  * - Move a comment on output buffer sizes from inffast.c to inflate.c
46  * - Add comments in inffast.c to introduce the inflate_fast() routine
47  * - Rearrange window copies in inflate_fast() for speed and simplification
48  * - Unroll last copy for window match in inflate_fast()
49  * - Use local copies of window variables in inflate_fast() for speed
50  * - Pull out common write == 0 case for speed in inflate_fast()
51  * - Make op and len in inflate_fast() unsigned for consistency
52  * - Add FAR to lcode and dcode declarations in inflate_fast()
53  * - Simplified bad distance check in inflate_fast()
54  * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
55  *   source file infback.c to provide a call-back interface to inflate for
56  *   programs like gzip and unzip -- uses window as output buffer to avoid
57  *   window copying
58  *
59  * 1.2.beta5    1 Jan 2003
60  * - Improved inflateBack() interface to allow the caller to provide initial
61  *   input in strm.
62  * - Fixed stored blocks bug in inflateBack()
63  *
64  * 1.2.beta6    4 Jan 2003
65  * - Added comments in inffast.c on effectiveness of POSTINC
66  * - Typecasting all around to reduce compiler warnings
67  * - Changed loops from while (1) or do {} while (1) to for (;;), again to
68  *   make compilers happy
69  * - Changed type of window in inflateBackInit() to unsigned char *
70  *
71  * 1.2.beta7    27 Jan 2003
72  * - Changed many types to unsigned or unsigned short to avoid warnings
73  * - Added inflateCopy() function
74  *
75  * 1.2.0        9 Mar 2003
76  * - Changed inflateBack() interface to provide separate opaque descriptors
77  *   for the in() and out() functions
78  * - Changed inflateBack() argument and in_func typedef to swap the length
79  *   and buffer address return values for the input function
80  * - Check next_in and next_out for Z_NULL on entry to inflate()
81  *
82  * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
83  */
84 
85 #include "zutil.h"
86 #include "inftrees.h"
87 #include "inflate.h"
88 #include "inffast.h"
89 
90 #ifdef MAKEFIXED
91 #  ifndef BUILDFIXED
92 #    define BUILDFIXED
93 #  endif
94 #endif
95 
96 /* function prototypes */
97 local void fixedtables OF((struct inflate_state FAR *state));
98 local int updatewindow OF((z_streamp strm, unsigned out));
99 #ifdef BUILDFIXED
100    void makefixed OF((void));
101 #endif
102 local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
103                               unsigned len));
104 
105 int ZEXPORT inflateReset(strm)
106 z_streamp strm;
107 {
108     struct inflate_state FAR *state;
109 
110     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
111     state = (struct inflate_state FAR *)strm->state;
112     strm->total_in = strm->total_out = state->total = 0;
113     strm->msg = Z_NULL;
114     strm->adler = 1;        /* to support ill-conceived Java test suite */
115     state->mode = HEAD;
116     state->last = 0;
117     state->havedict = 0;
118     state->dmax = 32768U;
119     state->head = Z_NULL;
120     state->wsize = 0;
121     state->whave = 0;
122     state->write = 0;
123     state->hold = 0;
124     state->bits = 0;
125     state->lencode = state->distcode = state->next = state->codes;
126     Tracev((stderr, "inflate: reset\n"));
127     return Z_OK;
128 }
129 
130 int ZEXPORT inflatePrime(strm, bits, value)
131 z_streamp strm;
132 int bits;
133 int value;
134 {
135     struct inflate_state FAR *state;
136 
137     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
138     state = (struct inflate_state FAR *)strm->state;
139     if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
140     value &= (1L << bits) - 1;
141     state->hold += value << state->bits;
142     state->bits += bits;
143     return Z_OK;
144 }
145 
146 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
147 z_streamp strm;
148 int windowBits;
149 const char *version;
150 int stream_size;
151 {
152     struct inflate_state FAR *state;
153 
154     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
155         stream_size != (int)(sizeof(z_stream)))
156         return Z_VERSION_ERROR;
157     if (strm == Z_NULL) return Z_STREAM_ERROR;
158     strm->msg = Z_NULL;                 /* in case we return an error */
159     if (strm->zalloc == (alloc_func)0) {
160         strm->zalloc = zcalloc;
161         strm->opaque = (voidpf)0;
162     }
163     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
164     state = (struct inflate_state FAR *)
165             ZALLOC(strm, 1, sizeof(struct inflate_state));
166     if (state == Z_NULL) return Z_MEM_ERROR;
167     Tracev((stderr, "inflate: allocated\n"));
168     strm->state = (struct internal_state FAR *)state;
169     if (windowBits < 0) {
170         state->wrap = 0;
171         windowBits = -windowBits;
172     }
173     else {
174         state->wrap = (windowBits >> 4) + 1;
175 #ifdef GUNZIP
176         if (windowBits < 48) windowBits &= 15;
177 #endif
178     }
179     if (windowBits < 8 || windowBits > 15) {
180         ZFREE(strm, state);
181         strm->state = Z_NULL;
182         return Z_STREAM_ERROR;
183     }
184     state->wbits = (unsigned)windowBits;
185     state->window = Z_NULL;
186     return inflateReset(strm);
187 }
188 
189 int ZEXPORT inflateInit_(strm, version, stream_size)
190 z_streamp strm;
191 const char *version;
192 int stream_size;
193 {
194     return inflateInit2_(strm, DEF_WBITS, version, stream_size);
195 }
196 
197 /*
198    Return state with length and distance decoding tables and index sizes set to
199    fixed code decoding.  Normally this returns fixed tables from inffixed.h.
200    If BUILDFIXED is defined, then instead this routine builds the tables the
201    first time it's called, and returns those tables the first time and
202    thereafter.  This reduces the size of the code by about 2K bytes, in
203    exchange for a little execution time.  However, BUILDFIXED should not be
204    used for threaded applications, since the rewriting of the tables and virgin
205    may not be thread-safe.
206  */
207 local void fixedtables(state)
208 struct inflate_state FAR *state;
209 {
210 #ifdef BUILDFIXED
211     static int virgin = 1;
212     static code *lenfix, *distfix;
213     static code fixed[544];
214 
215     /* build fixed huffman tables if first call (may not be thread safe) */
216     if (virgin) {
217         unsigned sym, bits;
218         static code *next;
219 
220         /* literal/length table */
221         sym = 0;
222         while (sym < 144) state->lens[sym++] = 8;
223         while (sym < 256) state->lens[sym++] = 9;
224         while (sym < 280) state->lens[sym++] = 7;
225         while (sym < 288) state->lens[sym++] = 8;
226         next = fixed;
227         lenfix = next;
228         bits = 9;
229         inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
230 
231         /* distance table */
232         sym = 0;
233         while (sym < 32) state->lens[sym++] = 5;
234         distfix = next;
235         bits = 5;
236         inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
237 
238         /* do this just once */
239         virgin = 0;
240     }
241 #else /* !BUILDFIXED */
242 #   include "inffixed.h"
243 #endif /* BUILDFIXED */
244     state->lencode = lenfix;
245     state->lenbits = 9;
246     state->distcode = distfix;
247     state->distbits = 5;
248 }
249 
250 #ifdef MAKEFIXED
251 #include <stdio.h>
252 
253 /*
254    Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also
255    defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes
256    those tables to stdout, which would be piped to inffixed.h.  A small program
257    can simply call makefixed to do this:
258 
259     void makefixed(void);
260 
261     int main(void)
262     {
263         makefixed();
264         return 0;
265     }
266 
267    Then that can be linked with zlib built with MAKEFIXED defined and run:
268 
269     a.out > inffixed.h
270  */
271 void makefixed()
272 {
273     unsigned low, size;
274     struct inflate_state state;
275 
276     fixedtables(&state);
277     puts("    /* inffixed.h -- table for decoding fixed codes");
278     puts("     * Generated automatically by makefixed().");
279     puts("     */");
280     puts("");
281     puts("    /* WARNING: this file should *not* be used by applications.");
282     puts("       It is part of the implementation of this library and is");
283     puts("       subject to change. Applications should only use zlib.h.");
284     puts("     */");
285     puts("");
286     size = 1U << 9;
287     printf("    static const code lenfix[%u] = {", size);
288     low = 0;
289     for (;;) {
290         if ((low % 7) == 0) printf("\n        ");
291         printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
292                state.lencode[low].val);
293         if (++low == size) break;
294         putchar(',');
295     }
296     puts("\n    };");
297     size = 1U << 5;
298     printf("\n    static const code distfix[%u] = {", size);
299     low = 0;
300     for (;;) {
301         if ((low % 6) == 0) printf("\n        ");
302         printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
303                state.distcode[low].val);
304         if (++low == size) break;
305         putchar(',');
306     }
307     puts("\n    };");
308 }
309 #endif /* MAKEFIXED */
310 
311 /*
312    Update the window with the last wsize (normally 32K) bytes written before
313    returning.  If window does not exist yet, create it.  This is only called
314    when a window is already in use, or when output has been written during this
315    inflate call, but the end of the deflate stream has not been reached yet.
316    It is also called to create a window for dictionary data when a dictionary
317    is loaded.
318 
319    Providing output buffers larger than 32K to inflate() should provide a speed
320    advantage, since only the last 32K of output is copied to the sliding window
321    upon return from inflate(), and since all distances after the first 32K of
322    output will fall in the output data, making match copies simpler and faster.
323    The advantage may be dependent on the size of the processor's data caches.
324  */
325 local int updatewindow(strm, out)
326 z_streamp strm;
327 unsigned out;
328 {
329     struct inflate_state FAR *state;
330     unsigned copy, dist;
331 
332     state = (struct inflate_state FAR *)strm->state;
333 
334     /* if it hasn't been done already, allocate space for the window */
335     if (state->window == Z_NULL) {
336         state->window = (unsigned char FAR *)
337                         ZALLOC(strm, 1U << state->wbits,
338                                sizeof(unsigned char));
339         if (state->window == Z_NULL) return 1;
340     }
341 
342     /* if window not in use yet, initialize */
343     if (state->wsize == 0) {
344         state->wsize = 1U << state->wbits;
345         state->write = 0;
346         state->whave = 0;
347     }
348 
349     /* copy state->wsize or less output bytes into the circular window */
350     copy = out - strm->avail_out;
351     if (copy >= state->wsize) {
352         zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
353         state->write = 0;
354         state->whave = state->wsize;
355     }
356     else {
357         dist = state->wsize - state->write;
358         if (dist > copy) dist = copy;
359         zmemcpy(state->window + state->write, strm->next_out - copy, dist);
360         copy -= dist;
361         if (copy) {
362             zmemcpy(state->window, strm->next_out - copy, copy);
363             state->write = copy;
364             state->whave = state->wsize;
365         }
366         else {
367             state->write += dist;
368             if (state->write == state->wsize) state->write = 0;
369             if (state->whave < state->wsize) state->whave += dist;
370         }
371     }
372     return 0;
373 }
374 
375 /* Macros for inflate(): */
376 
377 /* check function to use adler32() for zlib or crc32() for gzip */
378 #ifdef GUNZIP
379 #  define UPDATE(check, buf, len) \
380     (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
381 #else
382 #  define UPDATE(check, buf, len) adler32(check, buf, len)
383 #endif
384 
385 /* check macros for header crc */
386 #ifdef GUNZIP
387 #  define CRC2(check, word) \
388     do { \
389         hbuf[0] = (unsigned char)(word); \
390         hbuf[1] = (unsigned char)((word) >> 8); \
391         check = crc32(check, hbuf, 2); \
392     } while (0)
393 
394 #  define CRC4(check, word) \
395     do { \
396         hbuf[0] = (unsigned char)(word); \
397         hbuf[1] = (unsigned char)((word) >> 8); \
398         hbuf[2] = (unsigned char)((word) >> 16); \
399         hbuf[3] = (unsigned char)((word) >> 24); \
400         check = crc32(check, hbuf, 4); \
401     } while (0)
402 #endif
403 
404 /* Load registers with state in inflate() for speed */
405 #define LOAD() \
406     do { \
407         put = strm->next_out; \
408         left = strm->avail_out; \
409         next = strm->next_in; \
410         have = strm->avail_in; \
411         hold = state->hold; \
412         bits = state->bits; \
413     } while (0)
414 
415 /* Restore state from registers in inflate() */
416 #define RESTORE() \
417     do { \
418         strm->next_out = put; \
419         strm->avail_out = left; \
420         strm->next_in = next; \
421         strm->avail_in = have; \
422         state->hold = hold; \
423         state->bits = bits; \
424     } while (0)
425 
426 /* Clear the input bit accumulator */
427 #define INITBITS() \
428     do { \
429         hold = 0; \
430         bits = 0; \
431     } while (0)
432 
433 /* Get a byte of input into the bit accumulator, or return from inflate()
434    if there is no input available. */
435 #define PULLBYTE() \
436     do { \
437         if (have == 0) goto inf_leave; \
438         have--; \
439         hold += (unsigned long)(*next++) << bits; \
440         bits += 8; \
441     } while (0)
442 
443 /* Assure that there are at least n bits in the bit accumulator.  If there is
444    not enough available input to do that, then return from inflate(). */
445 #define NEEDBITS(n) \
446     do { \
447         while (bits < (unsigned)(n)) \
448             PULLBYTE(); \
449     } while (0)
450 
451 /* Return the low n bits of the bit accumulator (n < 16) */
452 #define BITS(n) \
453     ((unsigned)hold & ((1U << (n)) - 1))
454 
455 /* Remove n bits from the bit accumulator */
456 #define DROPBITS(n) \
457     do { \
458         hold >>= (n); \
459         bits -= (unsigned)(n); \
460     } while (0)
461 
462 /* Remove zero to seven bits as needed to go to a byte boundary */
463 #define BYTEBITS() \
464     do { \
465         hold >>= bits & 7; \
466         bits -= bits & 7; \
467     } while (0)
468 
469 /* Reverse the bytes in a 32-bit value */
470 #define REVERSE(q) \
471     ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
472      (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
473 
474 /*
475    inflate() uses a state machine to process as much input data and generate as
476    much output data as possible before returning.  The state machine is
477    structured roughly as follows:
478 
479     for (;;) switch (state) {
480     ...
481     case STATEn:
482         if (not enough input data or output space to make progress)
483             return;
484         ... make progress ...
485         state = STATEm;
486         break;
487     ...
488     }
489 
490    so when inflate() is called again, the same case is attempted again, and
491    if the appropriate resources are provided, the machine proceeds to the
492    next state.  The NEEDBITS() macro is usually the way the state evaluates
493    whether it can proceed or should return.  NEEDBITS() does the return if
494    the requested bits are not available.  The typical use of the BITS macros
495    is:
496 
497         NEEDBITS(n);
498         ... do something with BITS(n) ...
499         DROPBITS(n);
500 
501    where NEEDBITS(n) either returns from inflate() if there isn't enough
502    input left to load n bits into the accumulator, or it continues.  BITS(n)
503    gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
504    the low n bits off the accumulator.  INITBITS() clears the accumulator
505    and sets the number of available bits to zero.  BYTEBITS() discards just
506    enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
507    and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
508 
509    NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
510    if there is no input available.  The decoding of variable length codes uses
511    PULLBYTE() directly in order to pull just enough bytes to decode the next
512    code, and no more.
513 
514    Some states loop until they get enough input, making sure that enough
515    state information is maintained to continue the loop where it left off
516    if NEEDBITS() returns in the loop.  For example, want, need, and keep
517    would all have to actually be part of the saved state in case NEEDBITS()
518    returns:
519 
520     case STATEw:
521         while (want < need) {
522             NEEDBITS(n);
523             keep[want++] = BITS(n);
524             DROPBITS(n);
525         }
526         state = STATEx;
527     case STATEx:
528 
529    As shown above, if the next state is also the next case, then the break
530    is omitted.
531 
532    A state may also return if there is not enough output space available to
533    complete that state.  Those states are copying stored data, writing a
534    literal byte, and copying a matching string.
535 
536    When returning, a "goto inf_leave" is used to update the total counters,
537    update the check value, and determine whether any progress has been made
538    during that inflate() call in order to return the proper return code.
539    Progress is defined as a change in either strm->avail_in or strm->avail_out.
540    When there is a window, goto inf_leave will update the window with the last
541    output written.  If a goto inf_leave occurs in the middle of decompression
542    and there is no window currently, goto inf_leave will create one and copy
543    output to the window for the next call of inflate().
544 
545    In this implementation, the flush parameter of inflate() only affects the
546    return code (per zlib.h).  inflate() always writes as much as possible to
547    strm->next_out, given the space available and the provided input--the effect
548    documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
549    the allocation of and copying into a sliding window until necessary, which
550    provides the effect documented in zlib.h for Z_FINISH when the entire input
551    stream available.  So the only thing the flush parameter actually does is:
552    when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
553    will return Z_BUF_ERROR if it has not reached the end of the stream.
554  */
555 
556 int ZEXPORT inflate(strm, flush)
557 z_streamp strm;
558 int flush;
559 {
560     struct inflate_state FAR *state;
561     unsigned char FAR *next;    /* next input */
562     unsigned char FAR *put;     /* next output */
563     unsigned have, left;        /* available input and output */
564     unsigned long hold;         /* bit buffer */
565     unsigned bits;              /* bits in bit buffer */
566     unsigned in, out;           /* save starting available input and output */
567     unsigned copy;              /* number of stored or match bytes to copy */
568     unsigned char FAR *from;    /* where to copy match bytes from */
569     code this;                  /* current decoding table entry */
570     code last;                  /* parent table entry */
571     unsigned len;               /* length to copy for repeats, bits to drop */
572     int ret;                    /* return code */
573 #ifdef GUNZIP
574     unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
575 #endif
576     static const unsigned short order[19] = /* permutation of code lengths */
577         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
578 
579     if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
580         (strm->next_in == Z_NULL && strm->avail_in != 0))
581         return Z_STREAM_ERROR;
582 
583     state = (struct inflate_state FAR *)strm->state;
584     if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
585     LOAD();
586     in = have;
587     out = left;
588     ret = Z_OK;
589     for (;;)
590         switch (state->mode) {
591         case HEAD:
592             if (state->wrap == 0) {
593                 state->mode = TYPEDO;
594                 break;
595             }
596             NEEDBITS(16);
597 #ifdef GUNZIP
598             if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
599                 state->check = crc32(0L, Z_NULL, 0);
600                 CRC2(state->check, hold);
601                 INITBITS();
602                 state->mode = FLAGS;
603                 break;
604             }
605             state->flags = 0;           /* expect zlib header */
606             if (state->head != Z_NULL)
607                 state->head->done = -1;
608             if (!(state->wrap & 1) ||   /* check if zlib header allowed */
609 #else
610             if (
611 #endif
612                 ((BITS(8) << 8) + (hold >> 8)) % 31) {
613                 strm->msg = __UNCONST("incorrect header check");
614                 state->mode = BAD;
615                 break;
616             }
617             if (BITS(4) != Z_DEFLATED) {
618                 strm->msg = __UNCONST("unknown compression method");
619                 state->mode = BAD;
620                 break;
621             }
622             DROPBITS(4);
623             len = BITS(4) + 8;
624             if (len > state->wbits) {
625                 strm->msg = __UNCONST("invalid window size");
626                 state->mode = BAD;
627                 break;
628             }
629             state->dmax = 1U << len;
630             Tracev((stderr, "inflate:   zlib header ok\n"));
631             strm->adler = state->check = adler32(0L, Z_NULL, 0);
632             state->mode = hold & 0x200 ? DICTID : TYPE;
633             INITBITS();
634             break;
635 #ifdef GUNZIP
636         case FLAGS:
637             NEEDBITS(16);
638             state->flags = (int)(hold);
639             if ((state->flags & 0xff) != Z_DEFLATED) {
640                 strm->msg = __UNCONST("unknown compression method");
641                 state->mode = BAD;
642                 break;
643             }
644             if (state->flags & 0xe000) {
645                 strm->msg = __UNCONST("unknown header flags set");
646                 state->mode = BAD;
647                 break;
648             }
649             if (state->head != Z_NULL)
650                 state->head->text = (int)((hold >> 8) & 1);
651             if (state->flags & 0x0200) CRC2(state->check, hold);
652             INITBITS();
653             state->mode = TIME;
654         case TIME:
655             NEEDBITS(32);
656             if (state->head != Z_NULL)
657                 state->head->time = hold;
658             if (state->flags & 0x0200) CRC4(state->check, hold);
659             INITBITS();
660             state->mode = OS;
661         case OS:
662             NEEDBITS(16);
663             if (state->head != Z_NULL) {
664                 state->head->xflags = (int)(hold & 0xff);
665                 state->head->os = (int)(hold >> 8);
666             }
667             if (state->flags & 0x0200) CRC2(state->check, hold);
668             INITBITS();
669             state->mode = EXLEN;
670         case EXLEN:
671             if (state->flags & 0x0400) {
672                 NEEDBITS(16);
673                 state->length = (unsigned)(hold);
674                 if (state->head != Z_NULL)
675                     state->head->extra_len = (unsigned)hold;
676                 if (state->flags & 0x0200) CRC2(state->check, hold);
677                 INITBITS();
678             }
679             else if (state->head != Z_NULL)
680                 state->head->extra = Z_NULL;
681             state->mode = EXTRA;
682         case EXTRA:
683             if (state->flags & 0x0400) {
684                 copy = state->length;
685                 if (copy > have) copy = have;
686                 if (copy) {
687                     if (state->head != Z_NULL &&
688                         state->head->extra != Z_NULL) {
689                         len = state->head->extra_len - state->length;
690 			Assert (next != NULL, "next is null");
691                         zmemcpy(state->head->extra + len, next,
692                                 len + copy > state->head->extra_max ?
693                                 state->head->extra_max - len : copy);
694                     }
695                     if (state->flags & 0x0200)
696                         state->check = crc32(state->check, next, copy);
697                     have -= copy;
698                     next += copy;
699                     state->length -= copy;
700                 }
701                 if (state->length) goto inf_leave;
702             }
703             state->length = 0;
704             state->mode = NAME;
705         case NAME:
706             if (state->flags & 0x0800) {
707                 if (have == 0) goto inf_leave;
708                 copy = 0;
709                 do {
710                     len = (unsigned)(next[copy++]);
711                     if (state->head != Z_NULL &&
712                             state->head->name != Z_NULL &&
713                             state->length < state->head->name_max)
714                         state->head->name[state->length++] = len;
715                 } while (len && copy < have);
716                 if (state->flags & 0x0200)
717                     state->check = crc32(state->check, next, copy);
718                 have -= copy;
719                 next += copy;
720                 if (len) goto inf_leave;
721             }
722             else if (state->head != Z_NULL)
723                 state->head->name = Z_NULL;
724             state->length = 0;
725             state->mode = COMMENT;
726         case COMMENT:
727             if (state->flags & 0x1000) {
728                 if (have == 0) goto inf_leave;
729                 copy = 0;
730                 do {
731                     len = (unsigned)(next[copy++]);
732                     if (state->head != Z_NULL &&
733                             state->head->comment != Z_NULL &&
734                             state->length < state->head->comm_max)
735                         state->head->comment[state->length++] = len;
736                 } while (len && copy < have);
737                 if (state->flags & 0x0200)
738                     state->check = crc32(state->check, next, copy);
739                 have -= copy;
740                 next += copy;
741                 if (len) goto inf_leave;
742             }
743             else if (state->head != Z_NULL)
744                 state->head->comment = Z_NULL;
745             state->mode = HCRC;
746         case HCRC:
747             if (state->flags & 0x0200) {
748                 NEEDBITS(16);
749                 if (hold != (state->check & 0xffff)) {
750                     strm->msg = __UNCONST("header crc mismatch");
751                     state->mode = BAD;
752                     break;
753                 }
754                 INITBITS();
755             }
756             if (state->head != Z_NULL) {
757                 state->head->hcrc = (int)((state->flags >> 9) & 1);
758                 state->head->done = 1;
759             }
760             strm->adler = state->check = crc32(0L, Z_NULL, 0);
761             state->mode = TYPE;
762             break;
763 #endif
764         case DICTID:
765             NEEDBITS(32);
766             strm->adler = state->check = REVERSE(hold);
767             INITBITS();
768             state->mode = DICT;
769         case DICT:
770             if (state->havedict == 0) {
771                 RESTORE();
772                 return Z_NEED_DICT;
773             }
774             strm->adler = state->check = adler32(0L, Z_NULL, 0);
775             state->mode = TYPE;
776         case TYPE:
777             if (flush == Z_BLOCK) goto inf_leave;
778         case TYPEDO:
779             if (state->last) {
780                 BYTEBITS();
781                 state->mode = CHECK;
782                 break;
783             }
784             NEEDBITS(3);
785             state->last = BITS(1);
786             DROPBITS(1);
787             switch (BITS(2)) {
788             case 0:                             /* stored block */
789                 Tracev((stderr, "inflate:     stored block%s\n",
790                         state->last ? " (last)" : ""));
791                 state->mode = STORED;
792                 break;
793             case 1:                             /* fixed block */
794                 fixedtables(state);
795                 Tracev((stderr, "inflate:     fixed codes block%s\n",
796                         state->last ? " (last)" : ""));
797                 state->mode = LEN;              /* decode codes */
798                 break;
799             case 2:                             /* dynamic block */
800                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
801                         state->last ? " (last)" : ""));
802                 state->mode = TABLE;
803                 break;
804             case 3:
805                 strm->msg = __UNCONST("invalid block type");
806                 state->mode = BAD;
807             }
808             DROPBITS(2);
809             break;
810         case STORED:
811             BYTEBITS();                         /* go to byte boundary */
812             NEEDBITS(32);
813             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
814                 strm->msg = __UNCONST("invalid stored block lengths");
815                 state->mode = BAD;
816                 break;
817             }
818             state->length = (unsigned)hold & 0xffff;
819             Tracev((stderr, "inflate:       stored length %u\n",
820                     state->length));
821             INITBITS();
822             state->mode = COPY;
823         case COPY:
824             copy = state->length;
825             if (copy) {
826                 if (copy > have) copy = have;
827                 if (copy > left) copy = left;
828                 if (copy == 0) goto inf_leave;
829                 zmemcpy(put, next, copy);
830                 have -= copy;
831                 next += copy;
832                 left -= copy;
833                 put += copy;
834                 state->length -= copy;
835                 break;
836             }
837             Tracev((stderr, "inflate:       stored end\n"));
838             state->mode = TYPE;
839             break;
840         case TABLE:
841             NEEDBITS(14);
842             state->nlen = BITS(5) + 257;
843             DROPBITS(5);
844             state->ndist = BITS(5) + 1;
845             DROPBITS(5);
846             state->ncode = BITS(4) + 4;
847             DROPBITS(4);
848 #ifndef PKZIP_BUG_WORKAROUND
849             if (state->nlen > 286 || state->ndist > 30) {
850                 strm->msg = __UNCONST("too many length or distance symbols");
851                 state->mode = BAD;
852                 break;
853             }
854 #endif
855             Tracev((stderr, "inflate:       table sizes ok\n"));
856             state->have = 0;
857             state->mode = LENLENS;
858         case LENLENS:
859             while (state->have < state->ncode) {
860                 NEEDBITS(3);
861                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
862                 DROPBITS(3);
863             }
864             while (state->have < 19)
865                 state->lens[order[state->have++]] = 0;
866             state->next = state->codes;
867             state->lencode = (code const FAR *)(state->next);
868             state->lenbits = 7;
869             ret = inflate_table(CODES, state->lens, 19, &(state->next),
870                                 &(state->lenbits), state->work);
871             if (ret) {
872                 strm->msg = __UNCONST("invalid code lengths set");
873                 state->mode = BAD;
874                 break;
875             }
876             Tracev((stderr, "inflate:       code lengths ok\n"));
877             state->have = 0;
878             state->mode = CODELENS;
879         case CODELENS:
880             while (state->have < state->nlen + state->ndist) {
881                 for (;;) {
882                     this = state->lencode[BITS(state->lenbits)];
883                     if ((unsigned)(this.bits) <= bits) break;
884                     PULLBYTE();
885                 }
886                 if (this.val < 16) {
887                     NEEDBITS(this.bits);
888                     DROPBITS(this.bits);
889                     state->lens[state->have++] = this.val;
890                 }
891                 else {
892                     if (this.val == 16) {
893                         NEEDBITS(this.bits + 2);
894                         DROPBITS(this.bits);
895                         if (state->have == 0) {
896                             strm->msg = __UNCONST("invalid bit length repeat");
897                             state->mode = BAD;
898                             break;
899                         }
900                         len = state->lens[state->have - 1];
901                         copy = 3 + BITS(2);
902                         DROPBITS(2);
903                     }
904                     else if (this.val == 17) {
905                         NEEDBITS(this.bits + 3);
906                         DROPBITS(this.bits);
907                         len = 0;
908                         copy = 3 + BITS(3);
909                         DROPBITS(3);
910                     }
911                     else {
912                         NEEDBITS(this.bits + 7);
913                         DROPBITS(this.bits);
914                         len = 0;
915                         copy = 11 + BITS(7);
916                         DROPBITS(7);
917                     }
918                     if (state->have + copy > state->nlen + state->ndist) {
919                         strm->msg = __UNCONST("invalid bit length repeat");
920                         state->mode = BAD;
921                         break;
922                     }
923                     while (copy--)
924                         state->lens[state->have++] = (unsigned short)len;
925                 }
926             }
927 
928             /* handle error breaks in while */
929             if (state->mode == BAD) break;
930 
931             /* build code tables */
932             state->next = state->codes;
933             state->lencode = (code const FAR *)(state->next);
934             state->lenbits = 9;
935             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
936                                 &(state->lenbits), state->work);
937             if (ret) {
938                 strm->msg = __UNCONST("invalid literal/lengths set");
939                 state->mode = BAD;
940                 break;
941             }
942             state->distcode = (code const FAR *)(state->next);
943             state->distbits = 6;
944             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
945                             &(state->next), &(state->distbits), state->work);
946             if (ret) {
947                 strm->msg = __UNCONST("invalid distances set");
948                 state->mode = BAD;
949                 break;
950             }
951             Tracev((stderr, "inflate:       codes ok\n"));
952             state->mode = LEN;
953         case LEN:
954             if (have >= 6 && left >= 258) {
955                 RESTORE();
956                 inflate_fast(strm, out);
957                 LOAD();
958                 break;
959             }
960             for (;;) {
961                 this = state->lencode[BITS(state->lenbits)];
962                 if ((unsigned)(this.bits) <= bits) break;
963                 PULLBYTE();
964             }
965             if (this.op && (this.op & 0xf0) == 0) {
966                 last = this;
967                 for (;;) {
968                     this = state->lencode[last.val +
969                             (BITS(last.bits + last.op) >> last.bits)];
970                     if ((unsigned)(last.bits + this.bits) <= bits) break;
971                     PULLBYTE();
972                 }
973                 DROPBITS(last.bits);
974             }
975             DROPBITS(this.bits);
976             state->length = (unsigned)this.val;
977             if ((int)(this.op) == 0) {
978                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
979                         "inflate:         literal '%c'\n" :
980                         "inflate:         literal 0x%02x\n", this.val));
981                 state->mode = LIT;
982                 break;
983             }
984             if (this.op & 32) {
985                 Tracevv((stderr, "inflate:         end of block\n"));
986                 state->mode = TYPE;
987                 break;
988             }
989             if (this.op & 64) {
990                 strm->msg = __UNCONST("invalid literal/length code");
991                 state->mode = BAD;
992                 break;
993             }
994             state->extra = (unsigned)(this.op) & 15;
995             state->mode = LENEXT;
996         case LENEXT:
997             if (state->extra) {
998                 NEEDBITS(state->extra);
999                 state->length += BITS(state->extra);
1000                 DROPBITS(state->extra);
1001             }
1002             Tracevv((stderr, "inflate:         length %u\n", state->length));
1003             state->mode = DIST;
1004         case DIST:
1005             for (;;) {
1006                 this = state->distcode[BITS(state->distbits)];
1007                 if ((unsigned)(this.bits) <= bits) break;
1008                 PULLBYTE();
1009             }
1010             if ((this.op & 0xf0) == 0) {
1011                 last = this;
1012                 for (;;) {
1013                     this = state->distcode[last.val +
1014                             (BITS(last.bits + last.op) >> last.bits)];
1015                     if ((unsigned)(last.bits + this.bits) <= bits) break;
1016                     PULLBYTE();
1017                 }
1018                 DROPBITS(last.bits);
1019             }
1020             DROPBITS(this.bits);
1021             if (this.op & 64) {
1022                 strm->msg = __UNCONST("invalid distance code");
1023                 state->mode = BAD;
1024                 break;
1025             }
1026             state->offset = (unsigned)this.val;
1027             state->extra = (unsigned)(this.op) & 15;
1028             state->mode = DISTEXT;
1029         case DISTEXT:
1030             if (state->extra) {
1031                 NEEDBITS(state->extra);
1032                 state->offset += BITS(state->extra);
1033                 DROPBITS(state->extra);
1034             }
1035 #ifdef INFLATE_STRICT
1036             if (state->offset > state->dmax) {
1037                 strm->msg = __UNCONST("invalid distance too far back");
1038                 state->mode = BAD;
1039                 break;
1040             }
1041 #endif
1042             if (state->offset > state->whave + out - left) {
1043                 strm->msg = __UNCONST("invalid distance too far back");
1044                 state->mode = BAD;
1045                 break;
1046             }
1047             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
1048             state->mode = MATCH;
1049         case MATCH:
1050             if (left == 0) goto inf_leave;
1051             copy = out - left;
1052             if (state->offset > copy) {         /* copy from window */
1053                 copy = state->offset - copy;
1054                 if (copy > state->write) {
1055                     copy -= state->write;
1056                     from = state->window + (state->wsize - copy);
1057                 }
1058                 else
1059                     from = state->window + (state->write - copy);
1060                 if (copy > state->length) copy = state->length;
1061             }
1062             else {                              /* copy from output */
1063                 from = put - state->offset;
1064                 copy = state->length;
1065             }
1066             if (copy > left) copy = left;
1067             left -= copy;
1068             state->length -= copy;
1069             do {
1070                 *put++ = *from++;
1071             } while (--copy);
1072             if (state->length == 0) state->mode = LEN;
1073             break;
1074         case LIT:
1075             if (left == 0) goto inf_leave;
1076             *put++ = (unsigned char)(state->length);
1077             left--;
1078             state->mode = LEN;
1079             break;
1080         case CHECK:
1081             if (state->wrap) {
1082                 NEEDBITS(32);
1083                 out -= left;
1084                 strm->total_out += out;
1085                 state->total += out;
1086                 if (out)
1087                     strm->adler = state->check =
1088                         UPDATE(state->check, put - out, out);
1089                 out = left;
1090                 if ((
1091 #ifdef GUNZIP
1092                      state->flags ? hold :
1093 #endif
1094                      REVERSE(hold)) != state->check) {
1095                     strm->msg = __UNCONST("incorrect data check");
1096                     state->mode = BAD;
1097                     break;
1098                 }
1099                 INITBITS();
1100                 Tracev((stderr, "inflate:   check matches trailer\n"));
1101             }
1102 #ifdef GUNZIP
1103             state->mode = LENGTH;
1104         case LENGTH:
1105             if (state->wrap && state->flags) {
1106                 NEEDBITS(32);
1107                 if (hold != (state->total & 0xffffffffUL)) {
1108                     strm->msg = __UNCONST("incorrect length check");
1109                     state->mode = BAD;
1110                     break;
1111                 }
1112                 INITBITS();
1113                 Tracev((stderr, "inflate:   length matches trailer\n"));
1114             }
1115 #endif
1116             state->mode = DONE;
1117         case DONE:
1118             ret = Z_STREAM_END;
1119             goto inf_leave;
1120         case BAD:
1121             ret = Z_DATA_ERROR;
1122             goto inf_leave;
1123         case MEM:
1124             return Z_MEM_ERROR;
1125         case SYNC:
1126         default:
1127             return Z_STREAM_ERROR;
1128         }
1129 
1130     /*
1131        Return from inflate(), updating the total counts and the check value.
1132        If there was no progress during the inflate() call, return a buffer
1133        error.  Call updatewindow() to create and/or update the window state.
1134        Note: a memory error from inflate() is non-recoverable.
1135      */
1136   inf_leave:
1137     RESTORE();
1138     if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
1139         if (updatewindow(strm, out)) {
1140             state->mode = MEM;
1141             return Z_MEM_ERROR;
1142         }
1143     in -= strm->avail_in;
1144     out -= strm->avail_out;
1145     strm->total_in += in;
1146     strm->total_out += out;
1147     state->total += out;
1148     if (state->wrap && out)
1149         strm->adler = state->check =
1150             UPDATE(state->check, strm->next_out - out, out);
1151     strm->data_type = state->bits + (state->last ? 64 : 0) +
1152                       (state->mode == TYPE ? 128 : 0);
1153     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1154         ret = Z_BUF_ERROR;
1155     return ret;
1156 }
1157 
1158 int ZEXPORT inflateEnd(strm)
1159 z_streamp strm;
1160 {
1161     struct inflate_state FAR *state;
1162     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
1163         return Z_STREAM_ERROR;
1164     state = (struct inflate_state FAR *)strm->state;
1165     if (state->window != Z_NULL) ZFREE(strm, state->window);
1166     ZFREE(strm, strm->state);
1167     strm->state = Z_NULL;
1168     Tracev((stderr, "inflate: end\n"));
1169     return Z_OK;
1170 }
1171 
1172 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1173 z_streamp strm;
1174 const Bytef *dictionary;
1175 uInt dictLength;
1176 {
1177     struct inflate_state FAR *state;
1178     unsigned long id;
1179 
1180     /* check state */
1181     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1182     state = (struct inflate_state FAR *)strm->state;
1183     if (state->wrap != 0 && state->mode != DICT)
1184         return Z_STREAM_ERROR;
1185 
1186     /* check for correct dictionary id */
1187     if (state->mode == DICT) {
1188         id = adler32(0L, Z_NULL, 0);
1189         id = adler32(id, dictionary, dictLength);
1190         if (id != state->check)
1191             return Z_DATA_ERROR;
1192     }
1193 
1194     /* copy dictionary to window */
1195     if (updatewindow(strm, strm->avail_out)) {
1196         state->mode = MEM;
1197         return Z_MEM_ERROR;
1198     }
1199     if (dictLength > state->wsize) {
1200         zmemcpy(state->window, dictionary + dictLength - state->wsize,
1201                 state->wsize);
1202         state->whave = state->wsize;
1203     }
1204     else {
1205         zmemcpy(state->window + state->wsize - dictLength, dictionary,
1206                 dictLength);
1207         state->whave = dictLength;
1208     }
1209     state->havedict = 1;
1210     Tracev((stderr, "inflate:   dictionary set\n"));
1211     return Z_OK;
1212 }
1213 
1214 int ZEXPORT inflateGetHeader(strm, head)
1215 z_streamp strm;
1216 gz_headerp head;
1217 {
1218     struct inflate_state FAR *state;
1219 
1220     /* check state */
1221     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1222     state = (struct inflate_state FAR *)strm->state;
1223     if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1224 
1225     /* save header structure */
1226     state->head = head;
1227     head->done = 0;
1228     return Z_OK;
1229 }
1230 
1231 /*
1232    Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
1233    or when out of input.  When called, *have is the number of pattern bytes
1234    found in order so far, in 0..3.  On return *have is updated to the new
1235    state.  If on return *have equals four, then the pattern was found and the
1236    return value is how many bytes were read including the last byte of the
1237    pattern.  If *have is less than four, then the pattern has not been found
1238    yet and the return value is len.  In the latter case, syncsearch() can be
1239    called again with more data and the *have state.  *have is initialized to
1240    zero for the first call.
1241  */
1242 local unsigned syncsearch(have, buf, len)
1243 unsigned FAR *have;
1244 unsigned char FAR *buf;
1245 unsigned len;
1246 {
1247     unsigned got;
1248     unsigned next;
1249 
1250     got = *have;
1251     next = 0;
1252     while (next < len && got < 4) {
1253         if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1254             got++;
1255         else if (buf[next])
1256             got = 0;
1257         else
1258             got = 4 - got;
1259         next++;
1260     }
1261     *have = got;
1262     return next;
1263 }
1264 
1265 int ZEXPORT inflateSync(strm)
1266 z_streamp strm;
1267 {
1268     unsigned len;               /* number of bytes to look at or looked at */
1269     unsigned long in, out;      /* temporary to save total_in and total_out */
1270     unsigned char buf[4];       /* to restore bit buffer to byte string */
1271     struct inflate_state FAR *state;
1272 
1273     /* check parameters */
1274     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1275     state = (struct inflate_state FAR *)strm->state;
1276     if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1277 
1278     /* if first time, start search in bit buffer */
1279     if (state->mode != SYNC) {
1280         state->mode = SYNC;
1281         state->hold <<= state->bits & 7;
1282         state->bits -= state->bits & 7;
1283         len = 0;
1284         while (state->bits >= 8) {
1285             buf[len++] = (unsigned char)(state->hold);
1286             state->hold >>= 8;
1287             state->bits -= 8;
1288         }
1289         state->have = 0;
1290         syncsearch(&(state->have), buf, len);
1291     }
1292 
1293     /* search available input */
1294     len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1295     strm->avail_in -= len;
1296     strm->next_in += len;
1297     strm->total_in += len;
1298 
1299     /* return no joy or set up to restart inflate() on a new block */
1300     if (state->have != 4) return Z_DATA_ERROR;
1301     in = strm->total_in;  out = strm->total_out;
1302     inflateReset(strm);
1303     strm->total_in = in;  strm->total_out = out;
1304     state->mode = TYPE;
1305     return Z_OK;
1306 }
1307 
1308 /*
1309    Returns true if inflate is currently at the end of a block generated by
1310    Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1311    implementation to provide an additional safety check. PPP uses
1312    Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1313    block. When decompressing, PPP checks that at the end of input packet,
1314    inflate is waiting for these length bytes.
1315  */
1316 int ZEXPORT inflateSyncPoint(strm)
1317 z_streamp strm;
1318 {
1319     struct inflate_state FAR *state;
1320 
1321     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1322     state = (struct inflate_state FAR *)strm->state;
1323     return state->mode == STORED && state->bits == 0;
1324 }
1325 
1326 int ZEXPORT inflateCopy(dest, source)
1327 z_streamp dest;
1328 z_streamp source;
1329 {
1330     struct inflate_state FAR *state;
1331     struct inflate_state FAR *copy;
1332     unsigned char FAR *window;
1333     unsigned wsize;
1334 
1335     /* check input */
1336     if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
1337         source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
1338         return Z_STREAM_ERROR;
1339     state = (struct inflate_state FAR *)source->state;
1340 
1341     /* allocate space */
1342     copy = (struct inflate_state FAR *)
1343            ZALLOC(source, 1, sizeof(struct inflate_state));
1344     if (copy == Z_NULL) return Z_MEM_ERROR;
1345     window = Z_NULL;
1346     if (state->window != Z_NULL) {
1347         window = (unsigned char FAR *)
1348                  ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1349         if (window == Z_NULL) {
1350             ZFREE(source, copy);
1351             return Z_MEM_ERROR;
1352         }
1353     }
1354 
1355     /* copy state */
1356     zmemcpy(dest, source, sizeof(z_stream));
1357     zmemcpy(copy, state, sizeof(struct inflate_state));
1358     if (state->lencode >= state->codes &&
1359         state->lencode <= state->codes + ENOUGH - 1) {
1360         copy->lencode = copy->codes + (state->lencode - state->codes);
1361         copy->distcode = copy->codes + (state->distcode - state->codes);
1362     }
1363     copy->next = copy->codes + (state->next - state->codes);
1364     if (window != Z_NULL) {
1365         wsize = 1U << state->wbits;
1366         zmemcpy(window, state->window, wsize);
1367     }
1368     copy->window = window;
1369     dest->state = (struct internal_state FAR *)copy;
1370     return Z_OK;
1371 }
1372