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