Home | History | Annotate | Line # | Download | only in zlib
inflate.c revision 1.2
      1 /*	$NetBSD: inflate.c,v 1.2 2006/01/27 00:45:27 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                         zmemcpy(state->head->extra + len, next,
    691                                 len + copy > state->head->extra_max ?
    692                                 state->head->extra_max - len : copy);
    693                     }
    694                     if (state->flags & 0x0200)
    695                         state->check = crc32(state->check, next, copy);
    696                     have -= copy;
    697                     next += copy;
    698                     state->length -= copy;
    699                 }
    700                 if (state->length) goto inf_leave;
    701             }
    702             state->length = 0;
    703             state->mode = NAME;
    704         case NAME:
    705             if (state->flags & 0x0800) {
    706                 if (have == 0) goto inf_leave;
    707                 copy = 0;
    708                 do {
    709                     len = (unsigned)(next[copy++]);
    710                     if (state->head != Z_NULL &&
    711                             state->head->name != Z_NULL &&
    712                             state->length < state->head->name_max)
    713                         state->head->name[state->length++] = len;
    714                 } while (len && copy < have);
    715                 if (state->flags & 0x0200)
    716                     state->check = crc32(state->check, next, copy);
    717                 have -= copy;
    718                 next += copy;
    719                 if (len) goto inf_leave;
    720             }
    721             else if (state->head != Z_NULL)
    722                 state->head->name = Z_NULL;
    723             state->length = 0;
    724             state->mode = COMMENT;
    725         case COMMENT:
    726             if (state->flags & 0x1000) {
    727                 if (have == 0) goto inf_leave;
    728                 copy = 0;
    729                 do {
    730                     len = (unsigned)(next[copy++]);
    731                     if (state->head != Z_NULL &&
    732                             state->head->comment != Z_NULL &&
    733                             state->length < state->head->comm_max)
    734                         state->head->comment[state->length++] = len;
    735                 } while (len && copy < have);
    736                 if (state->flags & 0x0200)
    737                     state->check = crc32(state->check, next, copy);
    738                 have -= copy;
    739                 next += copy;
    740                 if (len) goto inf_leave;
    741             }
    742             else if (state->head != Z_NULL)
    743                 state->head->comment = Z_NULL;
    744             state->mode = HCRC;
    745         case HCRC:
    746             if (state->flags & 0x0200) {
    747                 NEEDBITS(16);
    748                 if (hold != (state->check & 0xffff)) {
    749                     strm->msg = __UNCONST("header crc mismatch");
    750                     state->mode = BAD;
    751                     break;
    752                 }
    753                 INITBITS();
    754             }
    755             if (state->head != Z_NULL) {
    756                 state->head->hcrc = (int)((state->flags >> 9) & 1);
    757                 state->head->done = 1;
    758             }
    759             strm->adler = state->check = crc32(0L, Z_NULL, 0);
    760             state->mode = TYPE;
    761             break;
    762 #endif
    763         case DICTID:
    764             NEEDBITS(32);
    765             strm->adler = state->check = REVERSE(hold);
    766             INITBITS();
    767             state->mode = DICT;
    768         case DICT:
    769             if (state->havedict == 0) {
    770                 RESTORE();
    771                 return Z_NEED_DICT;
    772             }
    773             strm->adler = state->check = adler32(0L, Z_NULL, 0);
    774             state->mode = TYPE;
    775         case TYPE:
    776             if (flush == Z_BLOCK) goto inf_leave;
    777         case TYPEDO:
    778             if (state->last) {
    779                 BYTEBITS();
    780                 state->mode = CHECK;
    781                 break;
    782             }
    783             NEEDBITS(3);
    784             state->last = BITS(1);
    785             DROPBITS(1);
    786             switch (BITS(2)) {
    787             case 0:                             /* stored block */
    788                 Tracev((stderr, "inflate:     stored block%s\n",
    789                         state->last ? " (last)" : ""));
    790                 state->mode = STORED;
    791                 break;
    792             case 1:                             /* fixed block */
    793                 fixedtables(state);
    794                 Tracev((stderr, "inflate:     fixed codes block%s\n",
    795                         state->last ? " (last)" : ""));
    796                 state->mode = LEN;              /* decode codes */
    797                 break;
    798             case 2:                             /* dynamic block */
    799                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
    800                         state->last ? " (last)" : ""));
    801                 state->mode = TABLE;
    802                 break;
    803             case 3:
    804                 strm->msg = __UNCONST("invalid block type");
    805                 state->mode = BAD;
    806             }
    807             DROPBITS(2);
    808             break;
    809         case STORED:
    810             BYTEBITS();                         /* go to byte boundary */
    811             NEEDBITS(32);
    812             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
    813                 strm->msg = __UNCONST("invalid stored block lengths");
    814                 state->mode = BAD;
    815                 break;
    816             }
    817             state->length = (unsigned)hold & 0xffff;
    818             Tracev((stderr, "inflate:       stored length %u\n",
    819                     state->length));
    820             INITBITS();
    821             state->mode = COPY;
    822         case COPY:
    823             copy = state->length;
    824             if (copy) {
    825                 if (copy > have) copy = have;
    826                 if (copy > left) copy = left;
    827                 if (copy == 0) goto inf_leave;
    828                 zmemcpy(put, next, copy);
    829                 have -= copy;
    830                 next += copy;
    831                 left -= copy;
    832                 put += copy;
    833                 state->length -= copy;
    834                 break;
    835             }
    836             Tracev((stderr, "inflate:       stored end\n"));
    837             state->mode = TYPE;
    838             break;
    839         case TABLE:
    840             NEEDBITS(14);
    841             state->nlen = BITS(5) + 257;
    842             DROPBITS(5);
    843             state->ndist = BITS(5) + 1;
    844             DROPBITS(5);
    845             state->ncode = BITS(4) + 4;
    846             DROPBITS(4);
    847 #ifndef PKZIP_BUG_WORKAROUND
    848             if (state->nlen > 286 || state->ndist > 30) {
    849                 strm->msg = __UNCONST("too many length or distance symbols");
    850                 state->mode = BAD;
    851                 break;
    852             }
    853 #endif
    854             Tracev((stderr, "inflate:       table sizes ok\n"));
    855             state->have = 0;
    856             state->mode = LENLENS;
    857         case LENLENS:
    858             while (state->have < state->ncode) {
    859                 NEEDBITS(3);
    860                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
    861                 DROPBITS(3);
    862             }
    863             while (state->have < 19)
    864                 state->lens[order[state->have++]] = 0;
    865             state->next = state->codes;
    866             state->lencode = (code const FAR *)(state->next);
    867             state->lenbits = 7;
    868             ret = inflate_table(CODES, state->lens, 19, &(state->next),
    869                                 &(state->lenbits), state->work);
    870             if (ret) {
    871                 strm->msg = __UNCONST("invalid code lengths set");
    872                 state->mode = BAD;
    873                 break;
    874             }
    875             Tracev((stderr, "inflate:       code lengths ok\n"));
    876             state->have = 0;
    877             state->mode = CODELENS;
    878         case CODELENS:
    879             while (state->have < state->nlen + state->ndist) {
    880                 for (;;) {
    881                     this = state->lencode[BITS(state->lenbits)];
    882                     if ((unsigned)(this.bits) <= bits) break;
    883                     PULLBYTE();
    884                 }
    885                 if (this.val < 16) {
    886                     NEEDBITS(this.bits);
    887                     DROPBITS(this.bits);
    888                     state->lens[state->have++] = this.val;
    889                 }
    890                 else {
    891                     if (this.val == 16) {
    892                         NEEDBITS(this.bits + 2);
    893                         DROPBITS(this.bits);
    894                         if (state->have == 0) {
    895                             strm->msg = __UNCONST("invalid bit length repeat");
    896                             state->mode = BAD;
    897                             break;
    898                         }
    899                         len = state->lens[state->have - 1];
    900                         copy = 3 + BITS(2);
    901                         DROPBITS(2);
    902                     }
    903                     else if (this.val == 17) {
    904                         NEEDBITS(this.bits + 3);
    905                         DROPBITS(this.bits);
    906                         len = 0;
    907                         copy = 3 + BITS(3);
    908                         DROPBITS(3);
    909                     }
    910                     else {
    911                         NEEDBITS(this.bits + 7);
    912                         DROPBITS(this.bits);
    913                         len = 0;
    914                         copy = 11 + BITS(7);
    915                         DROPBITS(7);
    916                     }
    917                     if (state->have + copy > state->nlen + state->ndist) {
    918                         strm->msg = __UNCONST("invalid bit length repeat");
    919                         state->mode = BAD;
    920                         break;
    921                     }
    922                     while (copy--)
    923                         state->lens[state->have++] = (unsigned short)len;
    924                 }
    925             }
    926 
    927             /* handle error breaks in while */
    928             if (state->mode == BAD) break;
    929 
    930             /* build code tables */
    931             state->next = state->codes;
    932             state->lencode = (code const FAR *)(state->next);
    933             state->lenbits = 9;
    934             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
    935                                 &(state->lenbits), state->work);
    936             if (ret) {
    937                 strm->msg = __UNCONST("invalid literal/lengths set");
    938                 state->mode = BAD;
    939                 break;
    940             }
    941             state->distcode = (code const FAR *)(state->next);
    942             state->distbits = 6;
    943             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
    944                             &(state->next), &(state->distbits), state->work);
    945             if (ret) {
    946                 strm->msg = __UNCONST("invalid distances set");
    947                 state->mode = BAD;
    948                 break;
    949             }
    950             Tracev((stderr, "inflate:       codes ok\n"));
    951             state->mode = LEN;
    952         case LEN:
    953             if (have >= 6 && left >= 258) {
    954                 RESTORE();
    955                 inflate_fast(strm, out);
    956                 LOAD();
    957                 break;
    958             }
    959             for (;;) {
    960                 this = state->lencode[BITS(state->lenbits)];
    961                 if ((unsigned)(this.bits) <= bits) break;
    962                 PULLBYTE();
    963             }
    964             if (this.op && (this.op & 0xf0) == 0) {
    965                 last = this;
    966                 for (;;) {
    967                     this = state->lencode[last.val +
    968                             (BITS(last.bits + last.op) >> last.bits)];
    969                     if ((unsigned)(last.bits + this.bits) <= bits) break;
    970                     PULLBYTE();
    971                 }
    972                 DROPBITS(last.bits);
    973             }
    974             DROPBITS(this.bits);
    975             state->length = (unsigned)this.val;
    976             if ((int)(this.op) == 0) {
    977                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
    978                         "inflate:         literal '%c'\n" :
    979                         "inflate:         literal 0x%02x\n", this.val));
    980                 state->mode = LIT;
    981                 break;
    982             }
    983             if (this.op & 32) {
    984                 Tracevv((stderr, "inflate:         end of block\n"));
    985                 state->mode = TYPE;
    986                 break;
    987             }
    988             if (this.op & 64) {
    989                 strm->msg = __UNCONST("invalid literal/length code");
    990                 state->mode = BAD;
    991                 break;
    992             }
    993             state->extra = (unsigned)(this.op) & 15;
    994             state->mode = LENEXT;
    995         case LENEXT:
    996             if (state->extra) {
    997                 NEEDBITS(state->extra);
    998                 state->length += BITS(state->extra);
    999                 DROPBITS(state->extra);
   1000             }
   1001             Tracevv((stderr, "inflate:         length %u\n", state->length));
   1002             state->mode = DIST;
   1003         case DIST:
   1004             for (;;) {
   1005                 this = state->distcode[BITS(state->distbits)];
   1006                 if ((unsigned)(this.bits) <= bits) break;
   1007                 PULLBYTE();
   1008             }
   1009             if ((this.op & 0xf0) == 0) {
   1010                 last = this;
   1011                 for (;;) {
   1012                     this = state->distcode[last.val +
   1013                             (BITS(last.bits + last.op) >> last.bits)];
   1014                     if ((unsigned)(last.bits + this.bits) <= bits) break;
   1015                     PULLBYTE();
   1016                 }
   1017                 DROPBITS(last.bits);
   1018             }
   1019             DROPBITS(this.bits);
   1020             if (this.op & 64) {
   1021                 strm->msg = __UNCONST("invalid distance code");
   1022                 state->mode = BAD;
   1023                 break;
   1024             }
   1025             state->offset = (unsigned)this.val;
   1026             state->extra = (unsigned)(this.op) & 15;
   1027             state->mode = DISTEXT;
   1028         case DISTEXT:
   1029             if (state->extra) {
   1030                 NEEDBITS(state->extra);
   1031                 state->offset += BITS(state->extra);
   1032                 DROPBITS(state->extra);
   1033             }
   1034 #ifdef INFLATE_STRICT
   1035             if (state->offset > state->dmax) {
   1036                 strm->msg = __UNCONST("invalid distance too far back");
   1037                 state->mode = BAD;
   1038                 break;
   1039             }
   1040 #endif
   1041             if (state->offset > state->whave + out - left) {
   1042                 strm->msg = __UNCONST("invalid distance too far back");
   1043                 state->mode = BAD;
   1044                 break;
   1045             }
   1046             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
   1047             state->mode = MATCH;
   1048         case MATCH:
   1049             if (left == 0) goto inf_leave;
   1050             copy = out - left;
   1051             if (state->offset > copy) {         /* copy from window */
   1052                 copy = state->offset - copy;
   1053                 if (copy > state->write) {
   1054                     copy -= state->write;
   1055                     from = state->window + (state->wsize - copy);
   1056                 }
   1057                 else
   1058                     from = state->window + (state->write - copy);
   1059                 if (copy > state->length) copy = state->length;
   1060             }
   1061             else {                              /* copy from output */
   1062                 from = put - state->offset;
   1063                 copy = state->length;
   1064             }
   1065             if (copy > left) copy = left;
   1066             left -= copy;
   1067             state->length -= copy;
   1068             do {
   1069                 *put++ = *from++;
   1070             } while (--copy);
   1071             if (state->length == 0) state->mode = LEN;
   1072             break;
   1073         case LIT:
   1074             if (left == 0) goto inf_leave;
   1075             *put++ = (unsigned char)(state->length);
   1076             left--;
   1077             state->mode = LEN;
   1078             break;
   1079         case CHECK:
   1080             if (state->wrap) {
   1081                 NEEDBITS(32);
   1082                 out -= left;
   1083                 strm->total_out += out;
   1084                 state->total += out;
   1085                 if (out)
   1086                     strm->adler = state->check =
   1087                         UPDATE(state->check, put - out, out);
   1088                 out = left;
   1089                 if ((
   1090 #ifdef GUNZIP
   1091                      state->flags ? hold :
   1092 #endif
   1093                      REVERSE(hold)) != state->check) {
   1094                     strm->msg = __UNCONST("incorrect data check");
   1095                     state->mode = BAD;
   1096                     break;
   1097                 }
   1098                 INITBITS();
   1099                 Tracev((stderr, "inflate:   check matches trailer\n"));
   1100             }
   1101 #ifdef GUNZIP
   1102             state->mode = LENGTH;
   1103         case LENGTH:
   1104             if (state->wrap && state->flags) {
   1105                 NEEDBITS(32);
   1106                 if (hold != (state->total & 0xffffffffUL)) {
   1107                     strm->msg = __UNCONST("incorrect length check");
   1108                     state->mode = BAD;
   1109                     break;
   1110                 }
   1111                 INITBITS();
   1112                 Tracev((stderr, "inflate:   length matches trailer\n"));
   1113             }
   1114 #endif
   1115             state->mode = DONE;
   1116         case DONE:
   1117             ret = Z_STREAM_END;
   1118             goto inf_leave;
   1119         case BAD:
   1120             ret = Z_DATA_ERROR;
   1121             goto inf_leave;
   1122         case MEM:
   1123             return Z_MEM_ERROR;
   1124         case SYNC:
   1125         default:
   1126             return Z_STREAM_ERROR;
   1127         }
   1128 
   1129     /*
   1130        Return from inflate(), updating the total counts and the check value.
   1131        If there was no progress during the inflate() call, return a buffer
   1132        error.  Call updatewindow() to create and/or update the window state.
   1133        Note: a memory error from inflate() is non-recoverable.
   1134      */
   1135   inf_leave:
   1136     RESTORE();
   1137     if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
   1138         if (updatewindow(strm, out)) {
   1139             state->mode = MEM;
   1140             return Z_MEM_ERROR;
   1141         }
   1142     in -= strm->avail_in;
   1143     out -= strm->avail_out;
   1144     strm->total_in += in;
   1145     strm->total_out += out;
   1146     state->total += out;
   1147     if (state->wrap && out)
   1148         strm->adler = state->check =
   1149             UPDATE(state->check, strm->next_out - out, out);
   1150     strm->data_type = state->bits + (state->last ? 64 : 0) +
   1151                       (state->mode == TYPE ? 128 : 0);
   1152     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
   1153         ret = Z_BUF_ERROR;
   1154     return ret;
   1155 }
   1156 
   1157 int ZEXPORT inflateEnd(strm)
   1158 z_streamp strm;
   1159 {
   1160     struct inflate_state FAR *state;
   1161     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
   1162         return Z_STREAM_ERROR;
   1163     state = (struct inflate_state FAR *)strm->state;
   1164     if (state->window != Z_NULL) ZFREE(strm, state->window);
   1165     ZFREE(strm, strm->state);
   1166     strm->state = Z_NULL;
   1167     Tracev((stderr, "inflate: end\n"));
   1168     return Z_OK;
   1169 }
   1170 
   1171 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
   1172 z_streamp strm;
   1173 const Bytef *dictionary;
   1174 uInt dictLength;
   1175 {
   1176     struct inflate_state FAR *state;
   1177     unsigned long id;
   1178 
   1179     /* check state */
   1180     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
   1181     state = (struct inflate_state FAR *)strm->state;
   1182     if (state->wrap != 0 && state->mode != DICT)
   1183         return Z_STREAM_ERROR;
   1184 
   1185     /* check for correct dictionary id */
   1186     if (state->mode == DICT) {
   1187         id = adler32(0L, Z_NULL, 0);
   1188         id = adler32(id, dictionary, dictLength);
   1189         if (id != state->check)
   1190             return Z_DATA_ERROR;
   1191     }
   1192 
   1193     /* copy dictionary to window */
   1194     if (updatewindow(strm, strm->avail_out)) {
   1195         state->mode = MEM;
   1196         return Z_MEM_ERROR;
   1197     }
   1198     if (dictLength > state->wsize) {
   1199         zmemcpy(state->window, dictionary + dictLength - state->wsize,
   1200                 state->wsize);
   1201         state->whave = state->wsize;
   1202     }
   1203     else {
   1204         zmemcpy(state->window + state->wsize - dictLength, dictionary,
   1205                 dictLength);
   1206         state->whave = dictLength;
   1207     }
   1208     state->havedict = 1;
   1209     Tracev((stderr, "inflate:   dictionary set\n"));
   1210     return Z_OK;
   1211 }
   1212 
   1213 int ZEXPORT inflateGetHeader(strm, head)
   1214 z_streamp strm;
   1215 gz_headerp head;
   1216 {
   1217     struct inflate_state FAR *state;
   1218 
   1219     /* check state */
   1220     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
   1221     state = (struct inflate_state FAR *)strm->state;
   1222     if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
   1223 
   1224     /* save header structure */
   1225     state->head = head;
   1226     head->done = 0;
   1227     return Z_OK;
   1228 }
   1229 
   1230 /*
   1231    Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
   1232    or when out of input.  When called, *have is the number of pattern bytes
   1233    found in order so far, in 0..3.  On return *have is updated to the new
   1234    state.  If on return *have equals four, then the pattern was found and the
   1235    return value is how many bytes were read including the last byte of the
   1236    pattern.  If *have is less than four, then the pattern has not been found
   1237    yet and the return value is len.  In the latter case, syncsearch() can be
   1238    called again with more data and the *have state.  *have is initialized to
   1239    zero for the first call.
   1240  */
   1241 local unsigned syncsearch(have, buf, len)
   1242 unsigned FAR *have;
   1243 unsigned char FAR *buf;
   1244 unsigned len;
   1245 {
   1246     unsigned got;
   1247     unsigned next;
   1248 
   1249     got = *have;
   1250     next = 0;
   1251     while (next < len && got < 4) {
   1252         if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
   1253             got++;
   1254         else if (buf[next])
   1255             got = 0;
   1256         else
   1257             got = 4 - got;
   1258         next++;
   1259     }
   1260     *have = got;
   1261     return next;
   1262 }
   1263 
   1264 int ZEXPORT inflateSync(strm)
   1265 z_streamp strm;
   1266 {
   1267     unsigned len;               /* number of bytes to look at or looked at */
   1268     unsigned long in, out;      /* temporary to save total_in and total_out */
   1269     unsigned char buf[4];       /* to restore bit buffer to byte string */
   1270     struct inflate_state FAR *state;
   1271 
   1272     /* check parameters */
   1273     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
   1274     state = (struct inflate_state FAR *)strm->state;
   1275     if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
   1276 
   1277     /* if first time, start search in bit buffer */
   1278     if (state->mode != SYNC) {
   1279         state->mode = SYNC;
   1280         state->hold <<= state->bits & 7;
   1281         state->bits -= state->bits & 7;
   1282         len = 0;
   1283         while (state->bits >= 8) {
   1284             buf[len++] = (unsigned char)(state->hold);
   1285             state->hold >>= 8;
   1286             state->bits -= 8;
   1287         }
   1288         state->have = 0;
   1289         syncsearch(&(state->have), buf, len);
   1290     }
   1291 
   1292     /* search available input */
   1293     len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
   1294     strm->avail_in -= len;
   1295     strm->next_in += len;
   1296     strm->total_in += len;
   1297 
   1298     /* return no joy or set up to restart inflate() on a new block */
   1299     if (state->have != 4) return Z_DATA_ERROR;
   1300     in = strm->total_in;  out = strm->total_out;
   1301     inflateReset(strm);
   1302     strm->total_in = in;  strm->total_out = out;
   1303     state->mode = TYPE;
   1304     return Z_OK;
   1305 }
   1306 
   1307 /*
   1308    Returns true if inflate is currently at the end of a block generated by
   1309    Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
   1310    implementation to provide an additional safety check. PPP uses
   1311    Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
   1312    block. When decompressing, PPP checks that at the end of input packet,
   1313    inflate is waiting for these length bytes.
   1314  */
   1315 int ZEXPORT inflateSyncPoint(strm)
   1316 z_streamp strm;
   1317 {
   1318     struct inflate_state FAR *state;
   1319 
   1320     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
   1321     state = (struct inflate_state FAR *)strm->state;
   1322     return state->mode == STORED && state->bits == 0;
   1323 }
   1324 
   1325 int ZEXPORT inflateCopy(dest, source)
   1326 z_streamp dest;
   1327 z_streamp source;
   1328 {
   1329     struct inflate_state FAR *state;
   1330     struct inflate_state FAR *copy;
   1331     unsigned char FAR *window;
   1332     unsigned wsize;
   1333 
   1334     /* check input */
   1335     if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
   1336         source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
   1337         return Z_STREAM_ERROR;
   1338     state = (struct inflate_state FAR *)source->state;
   1339 
   1340     /* allocate space */
   1341     copy = (struct inflate_state FAR *)
   1342            ZALLOC(source, 1, sizeof(struct inflate_state));
   1343     if (copy == Z_NULL) return Z_MEM_ERROR;
   1344     window = Z_NULL;
   1345     if (state->window != Z_NULL) {
   1346         window = (unsigned char FAR *)
   1347                  ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
   1348         if (window == Z_NULL) {
   1349             ZFREE(source, copy);
   1350             return Z_MEM_ERROR;
   1351         }
   1352     }
   1353 
   1354     /* copy state */
   1355     zmemcpy(dest, source, sizeof(z_stream));
   1356     zmemcpy(copy, state, sizeof(struct inflate_state));
   1357     if (state->lencode >= state->codes &&
   1358         state->lencode <= state->codes + ENOUGH - 1) {
   1359         copy->lencode = copy->codes + (state->lencode - state->codes);
   1360         copy->distcode = copy->codes + (state->distcode - state->codes);
   1361     }
   1362     copy->next = copy->codes + (state->next - state->codes);
   1363     if (window != Z_NULL) {
   1364         wsize = 1U << state->wbits;
   1365         zmemcpy(window, state->window, wsize);
   1366     }
   1367     copy->window = window;
   1368     dest->state = (struct internal_state FAR *)copy;
   1369     return Z_OK;
   1370 }
   1371