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