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