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