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