xref: /xnu-8019.80.24/libkern/zlib/infback.c (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1*a325d9c4SApple OSS Distributions /*
2*a325d9c4SApple OSS Distributions  * Copyright (c) 2008-2016 Apple Inc. All rights reserved.
3*a325d9c4SApple OSS Distributions  *
4*a325d9c4SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*a325d9c4SApple OSS Distributions  *
6*a325d9c4SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*a325d9c4SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*a325d9c4SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*a325d9c4SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*a325d9c4SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*a325d9c4SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*a325d9c4SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*a325d9c4SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*a325d9c4SApple OSS Distributions  *
15*a325d9c4SApple OSS Distributions  * Please obtain a copy of the License at
16*a325d9c4SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*a325d9c4SApple OSS Distributions  *
18*a325d9c4SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*a325d9c4SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*a325d9c4SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*a325d9c4SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*a325d9c4SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*a325d9c4SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*a325d9c4SApple OSS Distributions  * limitations under the License.
25*a325d9c4SApple OSS Distributions  *
26*a325d9c4SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*a325d9c4SApple OSS Distributions  */
28*a325d9c4SApple OSS Distributions /* infback.c -- inflate using a call-back interface
29*a325d9c4SApple OSS Distributions  * Copyright (C) 1995-2005 Mark Adler
30*a325d9c4SApple OSS Distributions  * For conditions of distribution and use, see copyright notice in zlib.h
31*a325d9c4SApple OSS Distributions  */
32*a325d9c4SApple OSS Distributions 
33*a325d9c4SApple OSS Distributions /*
34*a325d9c4SApple OSS Distributions    This code is largely copied from inflate.c.  Normally either infback.o or
35*a325d9c4SApple OSS Distributions    inflate.o would be linked into an application--not both.  The interface
36*a325d9c4SApple OSS Distributions    with inffast.c is retained so that optimized assembler-coded versions of
37*a325d9c4SApple OSS Distributions    inflate_fast() can be used with either inflate.c or infback.c.
38*a325d9c4SApple OSS Distributions  */
39*a325d9c4SApple OSS Distributions 
40*a325d9c4SApple OSS Distributions #include "zutil.h"
41*a325d9c4SApple OSS Distributions #include "inftrees.h"
42*a325d9c4SApple OSS Distributions #include "inflate.h"
43*a325d9c4SApple OSS Distributions #include "inffast.h"
44*a325d9c4SApple OSS Distributions #include <os/base.h>
45*a325d9c4SApple OSS Distributions 
46*a325d9c4SApple OSS Distributions /* function prototypes */
47*a325d9c4SApple OSS Distributions local void fixedtables OF((struct inflate_state FAR *state));
48*a325d9c4SApple OSS Distributions 
49*a325d9c4SApple OSS Distributions /*
50*a325d9c4SApple OSS Distributions    strm provides memory allocation functions in zalloc and zfree, or
51*a325d9c4SApple OSS Distributions    Z_NULL to use the library memory allocation functions.
52*a325d9c4SApple OSS Distributions 
53*a325d9c4SApple OSS Distributions    windowBits is in the range 8..15, and window is a user-supplied
54*a325d9c4SApple OSS Distributions    window and output buffer that is 2**windowBits bytes.
55*a325d9c4SApple OSS Distributions  */
56*a325d9c4SApple OSS Distributions int ZEXPORT
inflateBackInit_(z_streamp strm,int windowBits,unsigned char FAR * window,const char * version,int stream_size)57*a325d9c4SApple OSS Distributions inflateBackInit_(z_streamp strm, int windowBits, unsigned char FAR *window,
58*a325d9c4SApple OSS Distributions 		 const char *version, int stream_size)
59*a325d9c4SApple OSS Distributions {
60*a325d9c4SApple OSS Distributions     struct inflate_state FAR *state;
61*a325d9c4SApple OSS Distributions 
62*a325d9c4SApple OSS Distributions     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
63*a325d9c4SApple OSS Distributions         stream_size != (int)(sizeof(z_stream)))
64*a325d9c4SApple OSS Distributions         return Z_VERSION_ERROR;
65*a325d9c4SApple OSS Distributions     if (strm == Z_NULL || window == Z_NULL ||
66*a325d9c4SApple OSS Distributions         windowBits < 8 || windowBits > 15)
67*a325d9c4SApple OSS Distributions         return Z_STREAM_ERROR;
68*a325d9c4SApple OSS Distributions     strm->msg = Z_NULL;                 /* in case we return an error */
69*a325d9c4SApple OSS Distributions #ifndef NO_ZCFUNCS
70*a325d9c4SApple OSS Distributions     if (strm->zalloc == (alloc_func)0) {
71*a325d9c4SApple OSS Distributions         strm->zalloc = zcalloc;
72*a325d9c4SApple OSS Distributions         strm->opaque = (voidpf)0;
73*a325d9c4SApple OSS Distributions     }
74*a325d9c4SApple OSS Distributions     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
75*a325d9c4SApple OSS Distributions #endif /* NO_ZCFUNCS */
76*a325d9c4SApple OSS Distributions     state = (struct inflate_state FAR *)ZALLOC(strm, 1,
77*a325d9c4SApple OSS Distributions                                                sizeof(struct inflate_state));
78*a325d9c4SApple OSS Distributions     if (state == Z_NULL) return Z_MEM_ERROR;
79*a325d9c4SApple OSS Distributions     Tracev((stderr, "inflate: allocated\n"));
80*a325d9c4SApple OSS Distributions     strm->state = (struct internal_state FAR *)state;
81*a325d9c4SApple OSS Distributions     state->dmax = 32768U;
82*a325d9c4SApple OSS Distributions     state->wbits = windowBits;
83*a325d9c4SApple OSS Distributions     state->wsize = 1U << windowBits;
84*a325d9c4SApple OSS Distributions     state->window = window;
85*a325d9c4SApple OSS Distributions     state->write = 0;
86*a325d9c4SApple OSS Distributions     state->whave = 0;
87*a325d9c4SApple OSS Distributions     return Z_OK;
88*a325d9c4SApple OSS Distributions }
89*a325d9c4SApple OSS Distributions 
90*a325d9c4SApple OSS Distributions /*
91*a325d9c4SApple OSS Distributions    Return state with length and distance decoding tables and index sizes set to
92*a325d9c4SApple OSS Distributions    fixed code decoding.  Normally this returns fixed tables from inffixed.h.
93*a325d9c4SApple OSS Distributions    If BUILDFIXED is defined, then instead this routine builds the tables the
94*a325d9c4SApple OSS Distributions    first time it's called, and returns those tables the first time and
95*a325d9c4SApple OSS Distributions    thereafter.  This reduces the size of the code by about 2K bytes, in
96*a325d9c4SApple OSS Distributions    exchange for a little execution time.  However, BUILDFIXED should not be
97*a325d9c4SApple OSS Distributions    used for threaded applications, since the rewriting of the tables and virgin
98*a325d9c4SApple OSS Distributions    may not be thread-safe.
99*a325d9c4SApple OSS Distributions  */
100*a325d9c4SApple OSS Distributions local void
fixedtables(struct inflate_state FAR * state)101*a325d9c4SApple OSS Distributions fixedtables(struct inflate_state FAR *state)
102*a325d9c4SApple OSS Distributions {
103*a325d9c4SApple OSS Distributions #ifdef BUILDFIXED
104*a325d9c4SApple OSS Distributions     static int virgin = 1;
105*a325d9c4SApple OSS Distributions     static code *lenfix, *distfix;
106*a325d9c4SApple OSS Distributions     static code fixed[544];
107*a325d9c4SApple OSS Distributions 
108*a325d9c4SApple OSS Distributions     /* build fixed huffman tables if first call (may not be thread safe) */
109*a325d9c4SApple OSS Distributions     if (virgin) {
110*a325d9c4SApple OSS Distributions         unsigned sym, bits;
111*a325d9c4SApple OSS Distributions         static code *next;
112*a325d9c4SApple OSS Distributions 
113*a325d9c4SApple OSS Distributions         /* literal/length table */
114*a325d9c4SApple OSS Distributions         sym = 0;
115*a325d9c4SApple OSS Distributions         while (sym < 144) state->lens[sym++] = 8;
116*a325d9c4SApple OSS Distributions         while (sym < 256) state->lens[sym++] = 9;
117*a325d9c4SApple OSS Distributions         while (sym < 280) state->lens[sym++] = 7;
118*a325d9c4SApple OSS Distributions         while (sym < 288) state->lens[sym++] = 8;
119*a325d9c4SApple OSS Distributions         next = fixed;
120*a325d9c4SApple OSS Distributions         lenfix = next;
121*a325d9c4SApple OSS Distributions         bits = 9;
122*a325d9c4SApple OSS Distributions         inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
123*a325d9c4SApple OSS Distributions 
124*a325d9c4SApple OSS Distributions         /* distance table */
125*a325d9c4SApple OSS Distributions         sym = 0;
126*a325d9c4SApple OSS Distributions         while (sym < 32) state->lens[sym++] = 5;
127*a325d9c4SApple OSS Distributions         distfix = next;
128*a325d9c4SApple OSS Distributions         bits = 5;
129*a325d9c4SApple OSS Distributions         inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
130*a325d9c4SApple OSS Distributions 
131*a325d9c4SApple OSS Distributions         /* do this just once */
132*a325d9c4SApple OSS Distributions         virgin = 0;
133*a325d9c4SApple OSS Distributions     }
134*a325d9c4SApple OSS Distributions #else /* !BUILDFIXED */
135*a325d9c4SApple OSS Distributions #   include "inffixed.h"
136*a325d9c4SApple OSS Distributions #endif /* BUILDFIXED */
137*a325d9c4SApple OSS Distributions     state->lencode = lenfix;
138*a325d9c4SApple OSS Distributions     state->lenbits = 9;
139*a325d9c4SApple OSS Distributions     state->distcode = distfix;
140*a325d9c4SApple OSS Distributions     state->distbits = 5;
141*a325d9c4SApple OSS Distributions }
142*a325d9c4SApple OSS Distributions 
143*a325d9c4SApple OSS Distributions /* Macros for inflateBack(): */
144*a325d9c4SApple OSS Distributions 
145*a325d9c4SApple OSS Distributions /* Load returned state from inflate_fast() */
146*a325d9c4SApple OSS Distributions #define LOAD() \
147*a325d9c4SApple OSS Distributions     do { \
148*a325d9c4SApple OSS Distributions         put = strm->next_out; \
149*a325d9c4SApple OSS Distributions         left = strm->avail_out; \
150*a325d9c4SApple OSS Distributions         next = strm->next_in; \
151*a325d9c4SApple OSS Distributions         have = strm->avail_in; \
152*a325d9c4SApple OSS Distributions         hold = state->hold; \
153*a325d9c4SApple OSS Distributions         bits = state->bits; \
154*a325d9c4SApple OSS Distributions     } while (0)
155*a325d9c4SApple OSS Distributions 
156*a325d9c4SApple OSS Distributions /* Set state from registers for inflate_fast() */
157*a325d9c4SApple OSS Distributions #define RESTORE() \
158*a325d9c4SApple OSS Distributions     do { \
159*a325d9c4SApple OSS Distributions         strm->next_out = put; \
160*a325d9c4SApple OSS Distributions         strm->avail_out = left; \
161*a325d9c4SApple OSS Distributions         strm->next_in = next; \
162*a325d9c4SApple OSS Distributions         strm->avail_in = have; \
163*a325d9c4SApple OSS Distributions         state->hold = hold; \
164*a325d9c4SApple OSS Distributions         state->bits = bits; \
165*a325d9c4SApple OSS Distributions     } while (0)
166*a325d9c4SApple OSS Distributions 
167*a325d9c4SApple OSS Distributions /* Clear the input bit accumulator */
168*a325d9c4SApple OSS Distributions #define INITBITS() \
169*a325d9c4SApple OSS Distributions     do { \
170*a325d9c4SApple OSS Distributions         hold = 0; \
171*a325d9c4SApple OSS Distributions         bits = 0; \
172*a325d9c4SApple OSS Distributions     } while (0)
173*a325d9c4SApple OSS Distributions 
174*a325d9c4SApple OSS Distributions /* Assure that some input is available.  If input is requested, but denied,
175*a325d9c4SApple OSS Distributions    then return a Z_BUF_ERROR from inflateBack(). */
176*a325d9c4SApple OSS Distributions #define PULL() \
177*a325d9c4SApple OSS Distributions     do { \
178*a325d9c4SApple OSS Distributions         if (have == 0) { \
179*a325d9c4SApple OSS Distributions             have = in(in_desc, &next); \
180*a325d9c4SApple OSS Distributions             if (have == 0) { \
181*a325d9c4SApple OSS Distributions                 next = Z_NULL; \
182*a325d9c4SApple OSS Distributions                 ret = Z_BUF_ERROR; \
183*a325d9c4SApple OSS Distributions                 goto inf_leave; \
184*a325d9c4SApple OSS Distributions             } \
185*a325d9c4SApple OSS Distributions         } \
186*a325d9c4SApple OSS Distributions     } while (0)
187*a325d9c4SApple OSS Distributions 
188*a325d9c4SApple OSS Distributions /* Get a byte of input into the bit accumulator, or return from inflateBack()
189*a325d9c4SApple OSS Distributions    with an error if there is no input available. */
190*a325d9c4SApple OSS Distributions #define PULLBYTE() \
191*a325d9c4SApple OSS Distributions     do { \
192*a325d9c4SApple OSS Distributions         PULL(); \
193*a325d9c4SApple OSS Distributions         have--; \
194*a325d9c4SApple OSS Distributions         hold += (unsigned long)(*next++) << bits; \
195*a325d9c4SApple OSS Distributions         bits += 8; \
196*a325d9c4SApple OSS Distributions     } while (0)
197*a325d9c4SApple OSS Distributions 
198*a325d9c4SApple OSS Distributions /* Assure that there are at least n bits in the bit accumulator.  If there is
199*a325d9c4SApple OSS Distributions    not enough available input to do that, then return from inflateBack() with
200*a325d9c4SApple OSS Distributions    an error. */
201*a325d9c4SApple OSS Distributions #define NEEDBITS(n) \
202*a325d9c4SApple OSS Distributions     do { \
203*a325d9c4SApple OSS Distributions         while (bits < (unsigned)(n)) \
204*a325d9c4SApple OSS Distributions             PULLBYTE(); \
205*a325d9c4SApple OSS Distributions     } while (0)
206*a325d9c4SApple OSS Distributions 
207*a325d9c4SApple OSS Distributions /* Return the low n bits of the bit accumulator (n < 16) */
208*a325d9c4SApple OSS Distributions #define BITS(n) \
209*a325d9c4SApple OSS Distributions     ((unsigned)hold & ((1U << (n)) - 1))
210*a325d9c4SApple OSS Distributions 
211*a325d9c4SApple OSS Distributions /* Remove n bits from the bit accumulator */
212*a325d9c4SApple OSS Distributions #define DROPBITS(n) \
213*a325d9c4SApple OSS Distributions     do { \
214*a325d9c4SApple OSS Distributions         hold >>= (n); \
215*a325d9c4SApple OSS Distributions         bits -= (unsigned)(n); \
216*a325d9c4SApple OSS Distributions     } while (0)
217*a325d9c4SApple OSS Distributions 
218*a325d9c4SApple OSS Distributions /* Remove zero to seven bits as needed to go to a byte boundary */
219*a325d9c4SApple OSS Distributions #define BYTEBITS() \
220*a325d9c4SApple OSS Distributions     do { \
221*a325d9c4SApple OSS Distributions         hold >>= bits & 7; \
222*a325d9c4SApple OSS Distributions         bits -= bits & 7; \
223*a325d9c4SApple OSS Distributions     } while (0)
224*a325d9c4SApple OSS Distributions 
225*a325d9c4SApple OSS Distributions /* Assure that some output space is available, by writing out the window
226*a325d9c4SApple OSS Distributions    if it's full.  If the write fails, return from inflateBack() with a
227*a325d9c4SApple OSS Distributions    Z_BUF_ERROR. */
228*a325d9c4SApple OSS Distributions #define ROOM() \
229*a325d9c4SApple OSS Distributions     do { \
230*a325d9c4SApple OSS Distributions         if (left == 0) { \
231*a325d9c4SApple OSS Distributions             put = state->window; \
232*a325d9c4SApple OSS Distributions             left = state->wsize; \
233*a325d9c4SApple OSS Distributions             state->whave = left; \
234*a325d9c4SApple OSS Distributions             if (out(out_desc, put, left)) { \
235*a325d9c4SApple OSS Distributions                 ret = Z_BUF_ERROR; \
236*a325d9c4SApple OSS Distributions                 goto inf_leave; \
237*a325d9c4SApple OSS Distributions             } \
238*a325d9c4SApple OSS Distributions         } \
239*a325d9c4SApple OSS Distributions     } while (0)
240*a325d9c4SApple OSS Distributions 
241*a325d9c4SApple OSS Distributions /*
242*a325d9c4SApple OSS Distributions    strm provides the memory allocation functions and window buffer on input,
243*a325d9c4SApple OSS Distributions    and provides information on the unused input on return.  For Z_DATA_ERROR
244*a325d9c4SApple OSS Distributions    returns, strm will also provide an error message.
245*a325d9c4SApple OSS Distributions 
246*a325d9c4SApple OSS Distributions    in() and out() are the call-back input and output functions.  When
247*a325d9c4SApple OSS Distributions    inflateBack() needs more input, it calls in().  When inflateBack() has
248*a325d9c4SApple OSS Distributions    filled the window with output, or when it completes with data in the
249*a325d9c4SApple OSS Distributions    window, it calls out() to write out the data.  The application must not
250*a325d9c4SApple OSS Distributions    change the provided input until in() is called again or inflateBack()
251*a325d9c4SApple OSS Distributions    returns.  The application must not change the window/output buffer until
252*a325d9c4SApple OSS Distributions    inflateBack() returns.
253*a325d9c4SApple OSS Distributions 
254*a325d9c4SApple OSS Distributions    in() and out() are called with a descriptor parameter provided in the
255*a325d9c4SApple OSS Distributions    inflateBack() call.  This parameter can be a structure that provides the
256*a325d9c4SApple OSS Distributions    information required to do the read or write, as well as accumulated
257*a325d9c4SApple OSS Distributions    information on the input and output such as totals and check values.
258*a325d9c4SApple OSS Distributions 
259*a325d9c4SApple OSS Distributions    in() should return zero on failure.  out() should return non-zero on
260*a325d9c4SApple OSS Distributions    failure.  If either in() or out() fails, than inflateBack() returns a
261*a325d9c4SApple OSS Distributions    Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
262*a325d9c4SApple OSS Distributions    was in() or out() that caused in the error.  Otherwise,  inflateBack()
263*a325d9c4SApple OSS Distributions    returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
264*a325d9c4SApple OSS Distributions    error, or Z_MEM_ERROR if it could not allocate memory for the state.
265*a325d9c4SApple OSS Distributions    inflateBack() can also return Z_STREAM_ERROR if the input parameters
266*a325d9c4SApple OSS Distributions    are not correct, i.e. strm is Z_NULL or the state was not initialized.
267*a325d9c4SApple OSS Distributions  */
268*a325d9c4SApple OSS Distributions int ZEXPORT
inflateBack(z_streamp strm,in_func in,void FAR * in_desc,out_func out,void FAR * out_desc)269*a325d9c4SApple OSS Distributions inflateBack(z_streamp strm, in_func in, void FAR *in_desc, out_func out,
270*a325d9c4SApple OSS Distributions 	    void FAR *out_desc)
271*a325d9c4SApple OSS Distributions {
272*a325d9c4SApple OSS Distributions     struct inflate_state FAR *state;
273*a325d9c4SApple OSS Distributions     unsigned char FAR *next;    /* next input */
274*a325d9c4SApple OSS Distributions     unsigned char FAR *put;     /* next output */
275*a325d9c4SApple OSS Distributions     unsigned have, left;        /* available input and output */
276*a325d9c4SApple OSS Distributions     unsigned long hold;         /* bit buffer */
277*a325d9c4SApple OSS Distributions     unsigned bits;              /* bits in bit buffer */
278*a325d9c4SApple OSS Distributions     unsigned copy;              /* number of stored or match bytes to copy */
279*a325d9c4SApple OSS Distributions     unsigned char FAR *from;    /* where to copy match bytes from */
280*a325d9c4SApple OSS Distributions     code this;                  /* current decoding table entry */
281*a325d9c4SApple OSS Distributions     code last;                  /* parent table entry */
282*a325d9c4SApple OSS Distributions     unsigned len;               /* length to copy for repeats, bits to drop */
283*a325d9c4SApple OSS Distributions     int ret;                    /* return code */
284*a325d9c4SApple OSS Distributions     static const unsigned short order[19] = /* permutation of code lengths */
285*a325d9c4SApple OSS Distributions         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
286*a325d9c4SApple OSS Distributions 
287*a325d9c4SApple OSS Distributions     /* Check that the strm exists and that the state was initialized */
288*a325d9c4SApple OSS Distributions     if (strm == Z_NULL || strm->state == Z_NULL)
289*a325d9c4SApple OSS Distributions         return Z_STREAM_ERROR;
290*a325d9c4SApple OSS Distributions     state = (struct inflate_state FAR *)strm->state;
291*a325d9c4SApple OSS Distributions 
292*a325d9c4SApple OSS Distributions     /* Reset the state */
293*a325d9c4SApple OSS Distributions     strm->msg = Z_NULL;
294*a325d9c4SApple OSS Distributions     state->mode = TYPE;
295*a325d9c4SApple OSS Distributions     state->last = 0;
296*a325d9c4SApple OSS Distributions     state->whave = 0;
297*a325d9c4SApple OSS Distributions     next = strm->next_in;
298*a325d9c4SApple OSS Distributions     have = next != Z_NULL ? strm->avail_in : 0;
299*a325d9c4SApple OSS Distributions     hold = 0;
300*a325d9c4SApple OSS Distributions     bits = 0;
301*a325d9c4SApple OSS Distributions     put = state->window;
302*a325d9c4SApple OSS Distributions     left = state->wsize;
303*a325d9c4SApple OSS Distributions 
304*a325d9c4SApple OSS Distributions     /* Inflate until end of block marked as last */
305*a325d9c4SApple OSS Distributions     for (;;)
306*a325d9c4SApple OSS Distributions         switch (state->mode) {
307*a325d9c4SApple OSS Distributions         case TYPE:
308*a325d9c4SApple OSS Distributions             /* determine and dispatch block type */
309*a325d9c4SApple OSS Distributions             if (state->last) {
310*a325d9c4SApple OSS Distributions                 BYTEBITS();
311*a325d9c4SApple OSS Distributions                 state->mode = DONE;
312*a325d9c4SApple OSS Distributions                 break;
313*a325d9c4SApple OSS Distributions             }
314*a325d9c4SApple OSS Distributions             NEEDBITS(3);
315*a325d9c4SApple OSS Distributions             state->last = BITS(1);
316*a325d9c4SApple OSS Distributions             DROPBITS(1);
317*a325d9c4SApple OSS Distributions             switch (BITS(2)) {
318*a325d9c4SApple OSS Distributions             case 0:                             /* stored block */
319*a325d9c4SApple OSS Distributions                 Tracev((stderr, "inflate:     stored block%s\n",
320*a325d9c4SApple OSS Distributions                         state->last ? " (last)" : ""));
321*a325d9c4SApple OSS Distributions                 state->mode = STORED;
322*a325d9c4SApple OSS Distributions                 break;
323*a325d9c4SApple OSS Distributions             case 1:                             /* fixed block */
324*a325d9c4SApple OSS Distributions                 fixedtables(state);
325*a325d9c4SApple OSS Distributions                 Tracev((stderr, "inflate:     fixed codes block%s\n",
326*a325d9c4SApple OSS Distributions                         state->last ? " (last)" : ""));
327*a325d9c4SApple OSS Distributions                 state->mode = LEN;              /* decode codes */
328*a325d9c4SApple OSS Distributions                 break;
329*a325d9c4SApple OSS Distributions             case 2:                             /* dynamic block */
330*a325d9c4SApple OSS Distributions                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
331*a325d9c4SApple OSS Distributions                         state->last ? " (last)" : ""));
332*a325d9c4SApple OSS Distributions                 state->mode = TABLE;
333*a325d9c4SApple OSS Distributions                 break;
334*a325d9c4SApple OSS Distributions             case 3:
335*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid block type";
336*a325d9c4SApple OSS Distributions                 state->mode = BAD;
337*a325d9c4SApple OSS Distributions             }
338*a325d9c4SApple OSS Distributions             DROPBITS(2);
339*a325d9c4SApple OSS Distributions             break;
340*a325d9c4SApple OSS Distributions 
341*a325d9c4SApple OSS Distributions         case STORED:
342*a325d9c4SApple OSS Distributions             /* get and verify stored block length */
343*a325d9c4SApple OSS Distributions             BYTEBITS();                         /* go to byte boundary */
344*a325d9c4SApple OSS Distributions             NEEDBITS(32);
345*a325d9c4SApple OSS Distributions             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
346*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid stored block lengths";
347*a325d9c4SApple OSS Distributions                 state->mode = BAD;
348*a325d9c4SApple OSS Distributions                 break;
349*a325d9c4SApple OSS Distributions             }
350*a325d9c4SApple OSS Distributions             state->length = (unsigned)hold & 0xffff;
351*a325d9c4SApple OSS Distributions             Tracev((stderr, "inflate:       stored length %u\n",
352*a325d9c4SApple OSS Distributions                     state->length));
353*a325d9c4SApple OSS Distributions             INITBITS();
354*a325d9c4SApple OSS Distributions 
355*a325d9c4SApple OSS Distributions             /* copy stored block from input to output */
356*a325d9c4SApple OSS Distributions             while (state->length != 0) {
357*a325d9c4SApple OSS Distributions                 copy = state->length;
358*a325d9c4SApple OSS Distributions                 PULL();
359*a325d9c4SApple OSS Distributions                 ROOM();
360*a325d9c4SApple OSS Distributions                 if (copy > have) copy = have;
361*a325d9c4SApple OSS Distributions                 if (copy > left) copy = left;
362*a325d9c4SApple OSS Distributions                 zmemcpy(put, next, copy);
363*a325d9c4SApple OSS Distributions                 have -= copy;
364*a325d9c4SApple OSS Distributions                 next += copy;
365*a325d9c4SApple OSS Distributions                 left -= copy;
366*a325d9c4SApple OSS Distributions                 put += copy;
367*a325d9c4SApple OSS Distributions                 state->length -= copy;
368*a325d9c4SApple OSS Distributions             }
369*a325d9c4SApple OSS Distributions             Tracev((stderr, "inflate:       stored end\n"));
370*a325d9c4SApple OSS Distributions             state->mode = TYPE;
371*a325d9c4SApple OSS Distributions             break;
372*a325d9c4SApple OSS Distributions 
373*a325d9c4SApple OSS Distributions         case TABLE:
374*a325d9c4SApple OSS Distributions             /* get dynamic table entries descriptor */
375*a325d9c4SApple OSS Distributions             NEEDBITS(14);
376*a325d9c4SApple OSS Distributions             state->nlen = BITS(5) + 257;
377*a325d9c4SApple OSS Distributions             DROPBITS(5);
378*a325d9c4SApple OSS Distributions             state->ndist = BITS(5) + 1;
379*a325d9c4SApple OSS Distributions             DROPBITS(5);
380*a325d9c4SApple OSS Distributions             state->ncode = BITS(4) + 4;
381*a325d9c4SApple OSS Distributions             DROPBITS(4);
382*a325d9c4SApple OSS Distributions #ifndef PKZIP_BUG_WORKAROUND
383*a325d9c4SApple OSS Distributions             if (state->nlen > 286 || state->ndist > 30) {
384*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"too many length or distance symbols";
385*a325d9c4SApple OSS Distributions                 state->mode = BAD;
386*a325d9c4SApple OSS Distributions                 break;
387*a325d9c4SApple OSS Distributions             }
388*a325d9c4SApple OSS Distributions #endif
389*a325d9c4SApple OSS Distributions             Tracev((stderr, "inflate:       table sizes ok\n"));
390*a325d9c4SApple OSS Distributions 
391*a325d9c4SApple OSS Distributions             /* get code length code lengths (not a typo) */
392*a325d9c4SApple OSS Distributions             state->have = 0;
393*a325d9c4SApple OSS Distributions             while (state->have < state->ncode) {
394*a325d9c4SApple OSS Distributions                 NEEDBITS(3);
395*a325d9c4SApple OSS Distributions                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
396*a325d9c4SApple OSS Distributions                 DROPBITS(3);
397*a325d9c4SApple OSS Distributions             }
398*a325d9c4SApple OSS Distributions             while (state->have < 19)
399*a325d9c4SApple OSS Distributions                 state->lens[order[state->have++]] = 0;
400*a325d9c4SApple OSS Distributions             state->next = state->codes;
401*a325d9c4SApple OSS Distributions             state->lencode = (code const FAR *)(state->next);
402*a325d9c4SApple OSS Distributions             state->lenbits = 7;
403*a325d9c4SApple OSS Distributions             ret = inflate_table(CODES, state->lens, 19, &(state->next),
404*a325d9c4SApple OSS Distributions                                 &(state->lenbits), state->work);
405*a325d9c4SApple OSS Distributions             if (ret) {
406*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid code lengths set";
407*a325d9c4SApple OSS Distributions                 state->mode = BAD;
408*a325d9c4SApple OSS Distributions                 break;
409*a325d9c4SApple OSS Distributions             }
410*a325d9c4SApple OSS Distributions             Tracev((stderr, "inflate:       code lengths ok\n"));
411*a325d9c4SApple OSS Distributions 
412*a325d9c4SApple OSS Distributions             /* get length and distance code code lengths */
413*a325d9c4SApple OSS Distributions             state->have = 0;
414*a325d9c4SApple OSS Distributions             while (state->have < state->nlen + state->ndist) {
415*a325d9c4SApple OSS Distributions                 for (;;) {
416*a325d9c4SApple OSS Distributions                     this = state->lencode[BITS(state->lenbits)];
417*a325d9c4SApple OSS Distributions                     if ((unsigned)(this.bits) <= bits) break;
418*a325d9c4SApple OSS Distributions                     PULLBYTE();
419*a325d9c4SApple OSS Distributions                 }
420*a325d9c4SApple OSS Distributions                 if (this.val < 16) {
421*a325d9c4SApple OSS Distributions                     NEEDBITS(this.bits);
422*a325d9c4SApple OSS Distributions                     DROPBITS(this.bits);
423*a325d9c4SApple OSS Distributions                     state->lens[state->have++] = this.val;
424*a325d9c4SApple OSS Distributions                 }
425*a325d9c4SApple OSS Distributions                 else {
426*a325d9c4SApple OSS Distributions                     if (this.val == 16) {
427*a325d9c4SApple OSS Distributions                         NEEDBITS(this.bits + 2);
428*a325d9c4SApple OSS Distributions                         DROPBITS(this.bits);
429*a325d9c4SApple OSS Distributions                         if (state->have == 0) {
430*a325d9c4SApple OSS Distributions                             strm->msg = (char *)"invalid bit length repeat";
431*a325d9c4SApple OSS Distributions                             state->mode = BAD;
432*a325d9c4SApple OSS Distributions                             break;
433*a325d9c4SApple OSS Distributions                         }
434*a325d9c4SApple OSS Distributions                         len = (unsigned)(state->lens[state->have - 1]);
435*a325d9c4SApple OSS Distributions                         copy = 3 + BITS(2);
436*a325d9c4SApple OSS Distributions                         DROPBITS(2);
437*a325d9c4SApple OSS Distributions                     }
438*a325d9c4SApple OSS Distributions                     else if (this.val == 17) {
439*a325d9c4SApple OSS Distributions                         NEEDBITS(this.bits + 3);
440*a325d9c4SApple OSS Distributions                         DROPBITS(this.bits);
441*a325d9c4SApple OSS Distributions                         len = 0;
442*a325d9c4SApple OSS Distributions                         copy = 3 + BITS(3);
443*a325d9c4SApple OSS Distributions                         DROPBITS(3);
444*a325d9c4SApple OSS Distributions                     }
445*a325d9c4SApple OSS Distributions                     else {
446*a325d9c4SApple OSS Distributions                         NEEDBITS(this.bits + 7);
447*a325d9c4SApple OSS Distributions                         DROPBITS(this.bits);
448*a325d9c4SApple OSS Distributions                         len = 0;
449*a325d9c4SApple OSS Distributions                         copy = 11 + BITS(7);
450*a325d9c4SApple OSS Distributions                         DROPBITS(7);
451*a325d9c4SApple OSS Distributions                     }
452*a325d9c4SApple OSS Distributions                     if (state->have + copy > state->nlen + state->ndist) {
453*a325d9c4SApple OSS Distributions                         strm->msg = (char *)"invalid bit length repeat";
454*a325d9c4SApple OSS Distributions                         state->mode = BAD;
455*a325d9c4SApple OSS Distributions                         break;
456*a325d9c4SApple OSS Distributions                     }
457*a325d9c4SApple OSS Distributions                     while (copy--)
458*a325d9c4SApple OSS Distributions                         state->lens[state->have++] = (unsigned short)len;
459*a325d9c4SApple OSS Distributions                 }
460*a325d9c4SApple OSS Distributions             }
461*a325d9c4SApple OSS Distributions 
462*a325d9c4SApple OSS Distributions             /* handle error breaks in while */
463*a325d9c4SApple OSS Distributions             if (state->mode == BAD) break;
464*a325d9c4SApple OSS Distributions 
465*a325d9c4SApple OSS Distributions             /* build code tables */
466*a325d9c4SApple OSS Distributions             state->next = state->codes;
467*a325d9c4SApple OSS Distributions             state->lencode = (code const FAR *)(state->next);
468*a325d9c4SApple OSS Distributions             state->lenbits = 9;
469*a325d9c4SApple OSS Distributions             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
470*a325d9c4SApple OSS Distributions                                 &(state->lenbits), state->work);
471*a325d9c4SApple OSS Distributions             if (ret) {
472*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid literal/lengths set";
473*a325d9c4SApple OSS Distributions                 state->mode = BAD;
474*a325d9c4SApple OSS Distributions                 break;
475*a325d9c4SApple OSS Distributions             }
476*a325d9c4SApple OSS Distributions             state->distcode = (code const FAR *)(state->next);
477*a325d9c4SApple OSS Distributions             state->distbits = 6;
478*a325d9c4SApple OSS Distributions             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
479*a325d9c4SApple OSS Distributions                             &(state->next), &(state->distbits), state->work);
480*a325d9c4SApple OSS Distributions             if (ret) {
481*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid distances set";
482*a325d9c4SApple OSS Distributions                 state->mode = BAD;
483*a325d9c4SApple OSS Distributions                 break;
484*a325d9c4SApple OSS Distributions             }
485*a325d9c4SApple OSS Distributions             Tracev((stderr, "inflate:       codes ok\n"));
486*a325d9c4SApple OSS Distributions             state->mode = LEN;
487*a325d9c4SApple OSS Distributions 
488*a325d9c4SApple OSS Distributions         OS_FALLTHROUGH;
489*a325d9c4SApple OSS Distributions         case LEN:
490*a325d9c4SApple OSS Distributions             /* use inflate_fast() if we have enough input and output */
491*a325d9c4SApple OSS Distributions             if (have >= 6 && left >= 258) {
492*a325d9c4SApple OSS Distributions                 RESTORE();
493*a325d9c4SApple OSS Distributions                 if (state->whave < state->wsize)
494*a325d9c4SApple OSS Distributions                     state->whave = state->wsize - left;
495*a325d9c4SApple OSS Distributions                 inflate_fast(strm, state->wsize);
496*a325d9c4SApple OSS Distributions                 LOAD();
497*a325d9c4SApple OSS Distributions                 break;
498*a325d9c4SApple OSS Distributions             }
499*a325d9c4SApple OSS Distributions 
500*a325d9c4SApple OSS Distributions             /* get a literal, length, or end-of-block code */
501*a325d9c4SApple OSS Distributions             for (;;) {
502*a325d9c4SApple OSS Distributions                 this = state->lencode[BITS(state->lenbits)];
503*a325d9c4SApple OSS Distributions                 if ((unsigned)(this.bits) <= bits) break;
504*a325d9c4SApple OSS Distributions                 PULLBYTE();
505*a325d9c4SApple OSS Distributions             }
506*a325d9c4SApple OSS Distributions             if (this.op && (this.op & 0xf0) == 0) {
507*a325d9c4SApple OSS Distributions                 last = this;
508*a325d9c4SApple OSS Distributions                 for (;;) {
509*a325d9c4SApple OSS Distributions                     this = state->lencode[last.val +
510*a325d9c4SApple OSS Distributions                             (BITS(last.bits + last.op) >> last.bits)];
511*a325d9c4SApple OSS Distributions                     if ((unsigned)(last.bits + this.bits) <= bits) break;
512*a325d9c4SApple OSS Distributions                     PULLBYTE();
513*a325d9c4SApple OSS Distributions                 }
514*a325d9c4SApple OSS Distributions                 DROPBITS(last.bits);
515*a325d9c4SApple OSS Distributions             }
516*a325d9c4SApple OSS Distributions             DROPBITS(this.bits);
517*a325d9c4SApple OSS Distributions             state->length = (unsigned)this.val;
518*a325d9c4SApple OSS Distributions 
519*a325d9c4SApple OSS Distributions             /* process literal */
520*a325d9c4SApple OSS Distributions             if (this.op == 0) {
521*a325d9c4SApple OSS Distributions                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
522*a325d9c4SApple OSS Distributions                         "inflate:         literal '%c'\n" :
523*a325d9c4SApple OSS Distributions                         "inflate:         literal 0x%02x\n", this.val));
524*a325d9c4SApple OSS Distributions                 ROOM();
525*a325d9c4SApple OSS Distributions                 *put++ = (unsigned char)(state->length);
526*a325d9c4SApple OSS Distributions                 left--;
527*a325d9c4SApple OSS Distributions                 state->mode = LEN;
528*a325d9c4SApple OSS Distributions                 break;
529*a325d9c4SApple OSS Distributions             }
530*a325d9c4SApple OSS Distributions 
531*a325d9c4SApple OSS Distributions             /* process end of block */
532*a325d9c4SApple OSS Distributions             if (this.op & 32) {
533*a325d9c4SApple OSS Distributions                 Tracevv((stderr, "inflate:         end of block\n"));
534*a325d9c4SApple OSS Distributions                 state->mode = TYPE;
535*a325d9c4SApple OSS Distributions                 break;
536*a325d9c4SApple OSS Distributions             }
537*a325d9c4SApple OSS Distributions 
538*a325d9c4SApple OSS Distributions             /* invalid code */
539*a325d9c4SApple OSS Distributions             if (this.op & 64) {
540*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid literal/length code";
541*a325d9c4SApple OSS Distributions                 state->mode = BAD;
542*a325d9c4SApple OSS Distributions                 break;
543*a325d9c4SApple OSS Distributions             }
544*a325d9c4SApple OSS Distributions 
545*a325d9c4SApple OSS Distributions             /* length code -- get extra bits, if any */
546*a325d9c4SApple OSS Distributions             state->extra = (unsigned)(this.op) & 15;
547*a325d9c4SApple OSS Distributions             if (state->extra != 0) {
548*a325d9c4SApple OSS Distributions                 NEEDBITS(state->extra);
549*a325d9c4SApple OSS Distributions                 state->length += BITS(state->extra);
550*a325d9c4SApple OSS Distributions                 DROPBITS(state->extra);
551*a325d9c4SApple OSS Distributions             }
552*a325d9c4SApple OSS Distributions             Tracevv((stderr, "inflate:         length %u\n", state->length));
553*a325d9c4SApple OSS Distributions 
554*a325d9c4SApple OSS Distributions             /* get distance code */
555*a325d9c4SApple OSS Distributions             for (;;) {
556*a325d9c4SApple OSS Distributions                 this = state->distcode[BITS(state->distbits)];
557*a325d9c4SApple OSS Distributions                 if ((unsigned)(this.bits) <= bits) break;
558*a325d9c4SApple OSS Distributions                 PULLBYTE();
559*a325d9c4SApple OSS Distributions             }
560*a325d9c4SApple OSS Distributions             if ((this.op & 0xf0) == 0) {
561*a325d9c4SApple OSS Distributions                 last = this;
562*a325d9c4SApple OSS Distributions                 for (;;) {
563*a325d9c4SApple OSS Distributions                     this = state->distcode[last.val +
564*a325d9c4SApple OSS Distributions                             (BITS(last.bits + last.op) >> last.bits)];
565*a325d9c4SApple OSS Distributions                     if ((unsigned)(last.bits + this.bits) <= bits) break;
566*a325d9c4SApple OSS Distributions                     PULLBYTE();
567*a325d9c4SApple OSS Distributions                 }
568*a325d9c4SApple OSS Distributions                 DROPBITS(last.bits);
569*a325d9c4SApple OSS Distributions             }
570*a325d9c4SApple OSS Distributions             DROPBITS(this.bits);
571*a325d9c4SApple OSS Distributions             if (this.op & 64) {
572*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid distance code";
573*a325d9c4SApple OSS Distributions                 state->mode = BAD;
574*a325d9c4SApple OSS Distributions                 break;
575*a325d9c4SApple OSS Distributions             }
576*a325d9c4SApple OSS Distributions             state->offset = (unsigned)this.val;
577*a325d9c4SApple OSS Distributions 
578*a325d9c4SApple OSS Distributions             /* get distance extra bits, if any */
579*a325d9c4SApple OSS Distributions             state->extra = (unsigned)(this.op) & 15;
580*a325d9c4SApple OSS Distributions             if (state->extra != 0) {
581*a325d9c4SApple OSS Distributions                 NEEDBITS(state->extra);
582*a325d9c4SApple OSS Distributions                 state->offset += BITS(state->extra);
583*a325d9c4SApple OSS Distributions                 DROPBITS(state->extra);
584*a325d9c4SApple OSS Distributions             }
585*a325d9c4SApple OSS Distributions             if (state->offset > state->wsize - (state->whave < state->wsize ?
586*a325d9c4SApple OSS Distributions                                                 left : 0)) {
587*a325d9c4SApple OSS Distributions                 strm->msg = (char *)"invalid distance too far back";
588*a325d9c4SApple OSS Distributions                 state->mode = BAD;
589*a325d9c4SApple OSS Distributions                 break;
590*a325d9c4SApple OSS Distributions             }
591*a325d9c4SApple OSS Distributions             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
592*a325d9c4SApple OSS Distributions 
593*a325d9c4SApple OSS Distributions             /* copy match from window to output */
594*a325d9c4SApple OSS Distributions             do {
595*a325d9c4SApple OSS Distributions                 ROOM();
596*a325d9c4SApple OSS Distributions                 copy = state->wsize - state->offset;
597*a325d9c4SApple OSS Distributions                 if (copy < left) {
598*a325d9c4SApple OSS Distributions                     from = put + copy;
599*a325d9c4SApple OSS Distributions                     copy = left - copy;
600*a325d9c4SApple OSS Distributions                 }
601*a325d9c4SApple OSS Distributions                 else {
602*a325d9c4SApple OSS Distributions                     from = put - state->offset;
603*a325d9c4SApple OSS Distributions                     copy = left;
604*a325d9c4SApple OSS Distributions                 }
605*a325d9c4SApple OSS Distributions                 if (copy > state->length) copy = state->length;
606*a325d9c4SApple OSS Distributions                 state->length -= copy;
607*a325d9c4SApple OSS Distributions                 left -= copy;
608*a325d9c4SApple OSS Distributions                 do {
609*a325d9c4SApple OSS Distributions                     *put++ = *from++;
610*a325d9c4SApple OSS Distributions                 } while (--copy);
611*a325d9c4SApple OSS Distributions             } while (state->length != 0);
612*a325d9c4SApple OSS Distributions             break;
613*a325d9c4SApple OSS Distributions 
614*a325d9c4SApple OSS Distributions         case DONE:
615*a325d9c4SApple OSS Distributions             /* inflate stream terminated properly -- write leftover output */
616*a325d9c4SApple OSS Distributions             ret = Z_STREAM_END;
617*a325d9c4SApple OSS Distributions             if (left < state->wsize) {
618*a325d9c4SApple OSS Distributions                 if (out(out_desc, state->window, state->wsize - left))
619*a325d9c4SApple OSS Distributions                     ret = Z_BUF_ERROR;
620*a325d9c4SApple OSS Distributions             }
621*a325d9c4SApple OSS Distributions             goto inf_leave;
622*a325d9c4SApple OSS Distributions 
623*a325d9c4SApple OSS Distributions         case BAD:
624*a325d9c4SApple OSS Distributions             ret = Z_DATA_ERROR;
625*a325d9c4SApple OSS Distributions             goto inf_leave;
626*a325d9c4SApple OSS Distributions 
627*a325d9c4SApple OSS Distributions         default:                /* can't happen, but makes compilers happy */
628*a325d9c4SApple OSS Distributions             ret = Z_STREAM_ERROR;
629*a325d9c4SApple OSS Distributions             goto inf_leave;
630*a325d9c4SApple OSS Distributions         }
631*a325d9c4SApple OSS Distributions 
632*a325d9c4SApple OSS Distributions     /* Return unused input */
633*a325d9c4SApple OSS Distributions   inf_leave:
634*a325d9c4SApple OSS Distributions     strm->next_in = next;
635*a325d9c4SApple OSS Distributions     strm->avail_in = have;
636*a325d9c4SApple OSS Distributions     return ret;
637*a325d9c4SApple OSS Distributions }
638*a325d9c4SApple OSS Distributions 
639*a325d9c4SApple OSS Distributions int ZEXPORT
inflateBackEnd(z_streamp strm)640*a325d9c4SApple OSS Distributions inflateBackEnd(z_streamp strm)
641*a325d9c4SApple OSS Distributions {
642*a325d9c4SApple OSS Distributions     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
643*a325d9c4SApple OSS Distributions         return Z_STREAM_ERROR;
644*a325d9c4SApple OSS Distributions     ZFREE(strm, strm->state);
645*a325d9c4SApple OSS Distributions     strm->state = Z_NULL;
646*a325d9c4SApple OSS Distributions     Tracev((stderr, "inflate: end\n"));
647*a325d9c4SApple OSS Distributions     return Z_OK;
648*a325d9c4SApple OSS Distributions }
649