infback9.c revision 1.1.1.2 1 1.1 christos /* infback9.c -- inflate deflate64 data using a call-back interface
2 1.1.1.2 christos * Copyright (C) 1995-2008 Mark Adler
3 1.1 christos * For conditions of distribution and use, see copyright notice in zlib.h
4 1.1 christos */
5 1.1 christos
6 1.1 christos #include "zutil.h"
7 1.1 christos #include "infback9.h"
8 1.1 christos #include "inftree9.h"
9 1.1 christos #include "inflate9.h"
10 1.1 christos
11 1.1 christos #define WSIZE 65536UL
12 1.1 christos
13 1.1 christos /*
14 1.1 christos strm provides memory allocation functions in zalloc and zfree, or
15 1.1 christos Z_NULL to use the library memory allocation functions.
16 1.1 christos
17 1.1 christos window is a user-supplied window and output buffer that is 64K bytes.
18 1.1 christos */
19 1.1 christos int ZEXPORT inflateBack9Init_(strm, window, version, stream_size)
20 1.1 christos z_stream FAR *strm;
21 1.1 christos unsigned char FAR *window;
22 1.1 christos const char *version;
23 1.1 christos int stream_size;
24 1.1 christos {
25 1.1 christos struct inflate_state FAR *state;
26 1.1 christos
27 1.1 christos if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
28 1.1 christos stream_size != (int)(sizeof(z_stream)))
29 1.1 christos return Z_VERSION_ERROR;
30 1.1 christos if (strm == Z_NULL || window == Z_NULL)
31 1.1 christos return Z_STREAM_ERROR;
32 1.1 christos strm->msg = Z_NULL; /* in case we return an error */
33 1.1 christos if (strm->zalloc == (alloc_func)0) {
34 1.1 christos strm->zalloc = zcalloc;
35 1.1 christos strm->opaque = (voidpf)0;
36 1.1 christos }
37 1.1 christos if (strm->zfree == (free_func)0) strm->zfree = zcfree;
38 1.1 christos state = (struct inflate_state FAR *)ZALLOC(strm, 1,
39 1.1 christos sizeof(struct inflate_state));
40 1.1 christos if (state == Z_NULL) return Z_MEM_ERROR;
41 1.1 christos Tracev((stderr, "inflate: allocated\n"));
42 1.1 christos strm->state = (voidpf)state;
43 1.1 christos state->window = window;
44 1.1 christos return Z_OK;
45 1.1 christos }
46 1.1 christos
47 1.1 christos /*
48 1.1 christos Build and output length and distance decoding tables for fixed code
49 1.1 christos decoding.
50 1.1 christos */
51 1.1 christos #ifdef MAKEFIXED
52 1.1 christos #include <stdio.h>
53 1.1 christos
54 1.1 christos void makefixed9(void)
55 1.1 christos {
56 1.1 christos unsigned sym, bits, low, size;
57 1.1 christos code *next, *lenfix, *distfix;
58 1.1 christos struct inflate_state state;
59 1.1 christos code fixed[544];
60 1.1 christos
61 1.1 christos /* literal/length table */
62 1.1 christos sym = 0;
63 1.1 christos while (sym < 144) state.lens[sym++] = 8;
64 1.1 christos while (sym < 256) state.lens[sym++] = 9;
65 1.1 christos while (sym < 280) state.lens[sym++] = 7;
66 1.1 christos while (sym < 288) state.lens[sym++] = 8;
67 1.1 christos next = fixed;
68 1.1 christos lenfix = next;
69 1.1 christos bits = 9;
70 1.1 christos inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work);
71 1.1 christos
72 1.1 christos /* distance table */
73 1.1 christos sym = 0;
74 1.1 christos while (sym < 32) state.lens[sym++] = 5;
75 1.1 christos distfix = next;
76 1.1 christos bits = 5;
77 1.1 christos inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work);
78 1.1 christos
79 1.1 christos /* write tables */
80 1.1 christos puts(" /* inffix9.h -- table for decoding deflate64 fixed codes");
81 1.1 christos puts(" * Generated automatically by makefixed9().");
82 1.1 christos puts(" */");
83 1.1 christos puts("");
84 1.1 christos puts(" /* WARNING: this file should *not* be used by applications.");
85 1.1 christos puts(" It is part of the implementation of this library and is");
86 1.1 christos puts(" subject to change. Applications should only use zlib.h.");
87 1.1 christos puts(" */");
88 1.1 christos puts("");
89 1.1 christos size = 1U << 9;
90 1.1 christos printf(" static const code lenfix[%u] = {", size);
91 1.1 christos low = 0;
92 1.1 christos for (;;) {
93 1.1 christos if ((low % 6) == 0) printf("\n ");
94 1.1 christos printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits,
95 1.1 christos lenfix[low].val);
96 1.1 christos if (++low == size) break;
97 1.1 christos putchar(',');
98 1.1 christos }
99 1.1 christos puts("\n };");
100 1.1 christos size = 1U << 5;
101 1.1 christos printf("\n static const code distfix[%u] = {", size);
102 1.1 christos low = 0;
103 1.1 christos for (;;) {
104 1.1 christos if ((low % 5) == 0) printf("\n ");
105 1.1 christos printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits,
106 1.1 christos distfix[low].val);
107 1.1 christos if (++low == size) break;
108 1.1 christos putchar(',');
109 1.1 christos }
110 1.1 christos puts("\n };");
111 1.1 christos }
112 1.1 christos #endif /* MAKEFIXED */
113 1.1 christos
114 1.1 christos /* Macros for inflateBack(): */
115 1.1 christos
116 1.1 christos /* Clear the input bit accumulator */
117 1.1 christos #define INITBITS() \
118 1.1 christos do { \
119 1.1 christos hold = 0; \
120 1.1 christos bits = 0; \
121 1.1 christos } while (0)
122 1.1 christos
123 1.1 christos /* Assure that some input is available. If input is requested, but denied,
124 1.1 christos then return a Z_BUF_ERROR from inflateBack(). */
125 1.1 christos #define PULL() \
126 1.1 christos do { \
127 1.1 christos if (have == 0) { \
128 1.1 christos have = in(in_desc, &next); \
129 1.1 christos if (have == 0) { \
130 1.1 christos next = Z_NULL; \
131 1.1 christos ret = Z_BUF_ERROR; \
132 1.1 christos goto inf_leave; \
133 1.1 christos } \
134 1.1 christos } \
135 1.1 christos } while (0)
136 1.1 christos
137 1.1 christos /* Get a byte of input into the bit accumulator, or return from inflateBack()
138 1.1 christos with an error if there is no input available. */
139 1.1 christos #define PULLBYTE() \
140 1.1 christos do { \
141 1.1 christos PULL(); \
142 1.1 christos have--; \
143 1.1 christos hold += (unsigned long)(*next++) << bits; \
144 1.1 christos bits += 8; \
145 1.1 christos } while (0)
146 1.1 christos
147 1.1 christos /* Assure that there are at least n bits in the bit accumulator. If there is
148 1.1 christos not enough available input to do that, then return from inflateBack() with
149 1.1 christos an error. */
150 1.1 christos #define NEEDBITS(n) \
151 1.1 christos do { \
152 1.1 christos while (bits < (unsigned)(n)) \
153 1.1 christos PULLBYTE(); \
154 1.1 christos } while (0)
155 1.1 christos
156 1.1 christos /* Return the low n bits of the bit accumulator (n <= 16) */
157 1.1 christos #define BITS(n) \
158 1.1 christos ((unsigned)hold & ((1U << (n)) - 1))
159 1.1 christos
160 1.1 christos /* Remove n bits from the bit accumulator */
161 1.1 christos #define DROPBITS(n) \
162 1.1 christos do { \
163 1.1 christos hold >>= (n); \
164 1.1 christos bits -= (unsigned)(n); \
165 1.1 christos } while (0)
166 1.1 christos
167 1.1 christos /* Remove zero to seven bits as needed to go to a byte boundary */
168 1.1 christos #define BYTEBITS() \
169 1.1 christos do { \
170 1.1 christos hold >>= bits & 7; \
171 1.1 christos bits -= bits & 7; \
172 1.1 christos } while (0)
173 1.1 christos
174 1.1 christos /* Assure that some output space is available, by writing out the window
175 1.1 christos if it's full. If the write fails, return from inflateBack() with a
176 1.1 christos Z_BUF_ERROR. */
177 1.1 christos #define ROOM() \
178 1.1 christos do { \
179 1.1 christos if (left == 0) { \
180 1.1 christos put = window; \
181 1.1 christos left = WSIZE; \
182 1.1 christos wrap = 1; \
183 1.1 christos if (out(out_desc, put, (unsigned)left)) { \
184 1.1 christos ret = Z_BUF_ERROR; \
185 1.1 christos goto inf_leave; \
186 1.1 christos } \
187 1.1 christos } \
188 1.1 christos } while (0)
189 1.1 christos
190 1.1 christos /*
191 1.1 christos strm provides the memory allocation functions and window buffer on input,
192 1.1 christos and provides information on the unused input on return. For Z_DATA_ERROR
193 1.1 christos returns, strm will also provide an error message.
194 1.1 christos
195 1.1 christos in() and out() are the call-back input and output functions. When
196 1.1 christos inflateBack() needs more input, it calls in(). When inflateBack() has
197 1.1 christos filled the window with output, or when it completes with data in the
198 1.1 christos window, it calls out() to write out the data. The application must not
199 1.1 christos change the provided input until in() is called again or inflateBack()
200 1.1 christos returns. The application must not change the window/output buffer until
201 1.1 christos inflateBack() returns.
202 1.1 christos
203 1.1 christos in() and out() are called with a descriptor parameter provided in the
204 1.1 christos inflateBack() call. This parameter can be a structure that provides the
205 1.1 christos information required to do the read or write, as well as accumulated
206 1.1 christos information on the input and output such as totals and check values.
207 1.1 christos
208 1.1 christos in() should return zero on failure. out() should return non-zero on
209 1.1 christos failure. If either in() or out() fails, than inflateBack() returns a
210 1.1 christos Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
211 1.1 christos was in() or out() that caused in the error. Otherwise, inflateBack()
212 1.1 christos returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
213 1.1 christos error, or Z_MEM_ERROR if it could not allocate memory for the state.
214 1.1 christos inflateBack() can also return Z_STREAM_ERROR if the input parameters
215 1.1 christos are not correct, i.e. strm is Z_NULL or the state was not initialized.
216 1.1 christos */
217 1.1 christos int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc)
218 1.1 christos z_stream FAR *strm;
219 1.1 christos in_func in;
220 1.1 christos void FAR *in_desc;
221 1.1 christos out_func out;
222 1.1 christos void FAR *out_desc;
223 1.1 christos {
224 1.1 christos struct inflate_state FAR *state;
225 1.1.1.2 christos z_const unsigned char FAR *next; /* next input */
226 1.1 christos unsigned char FAR *put; /* next output */
227 1.1 christos unsigned have; /* available input */
228 1.1 christos unsigned long left; /* available output */
229 1.1 christos inflate_mode mode; /* current inflate mode */
230 1.1 christos int lastblock; /* true if processing last block */
231 1.1 christos int wrap; /* true if the window has wrapped */
232 1.1 christos unsigned char FAR *window; /* allocated sliding window, if needed */
233 1.1 christos unsigned long hold; /* bit buffer */
234 1.1 christos unsigned bits; /* bits in bit buffer */
235 1.1 christos unsigned extra; /* extra bits needed */
236 1.1 christos unsigned long length; /* literal or length of data to copy */
237 1.1 christos unsigned long offset; /* distance back to copy string from */
238 1.1 christos unsigned long copy; /* number of stored or match bytes to copy */
239 1.1 christos unsigned char FAR *from; /* where to copy match bytes from */
240 1.1 christos code const FAR *lencode; /* starting table for length/literal codes */
241 1.1 christos code const FAR *distcode; /* starting table for distance codes */
242 1.1 christos unsigned lenbits; /* index bits for lencode */
243 1.1 christos unsigned distbits; /* index bits for distcode */
244 1.1.1.2 christos code here; /* current decoding table entry */
245 1.1 christos code last; /* parent table entry */
246 1.1 christos unsigned len; /* length to copy for repeats, bits to drop */
247 1.1 christos int ret; /* return code */
248 1.1 christos static const unsigned short order[19] = /* permutation of code lengths */
249 1.1 christos {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
250 1.1 christos #include "inffix9.h"
251 1.1 christos
252 1.1 christos /* Check that the strm exists and that the state was initialized */
253 1.1 christos if (strm == Z_NULL || strm->state == Z_NULL)
254 1.1 christos return Z_STREAM_ERROR;
255 1.1 christos state = (struct inflate_state FAR *)strm->state;
256 1.1 christos
257 1.1 christos /* Reset the state */
258 1.1 christos strm->msg = Z_NULL;
259 1.1 christos mode = TYPE;
260 1.1 christos lastblock = 0;
261 1.1 christos wrap = 0;
262 1.1 christos window = state->window;
263 1.1 christos next = strm->next_in;
264 1.1 christos have = next != Z_NULL ? strm->avail_in : 0;
265 1.1 christos hold = 0;
266 1.1 christos bits = 0;
267 1.1 christos put = window;
268 1.1 christos left = WSIZE;
269 1.1 christos lencode = Z_NULL;
270 1.1 christos distcode = Z_NULL;
271 1.1 christos
272 1.1 christos /* Inflate until end of block marked as last */
273 1.1 christos for (;;)
274 1.1 christos switch (mode) {
275 1.1 christos case TYPE:
276 1.1 christos /* determine and dispatch block type */
277 1.1 christos if (lastblock) {
278 1.1 christos BYTEBITS();
279 1.1 christos mode = DONE;
280 1.1 christos break;
281 1.1 christos }
282 1.1 christos NEEDBITS(3);
283 1.1 christos lastblock = BITS(1);
284 1.1 christos DROPBITS(1);
285 1.1 christos switch (BITS(2)) {
286 1.1 christos case 0: /* stored block */
287 1.1 christos Tracev((stderr, "inflate: stored block%s\n",
288 1.1 christos lastblock ? " (last)" : ""));
289 1.1 christos mode = STORED;
290 1.1 christos break;
291 1.1 christos case 1: /* fixed block */
292 1.1 christos lencode = lenfix;
293 1.1 christos lenbits = 9;
294 1.1 christos distcode = distfix;
295 1.1 christos distbits = 5;
296 1.1 christos Tracev((stderr, "inflate: fixed codes block%s\n",
297 1.1 christos lastblock ? " (last)" : ""));
298 1.1 christos mode = LEN; /* decode codes */
299 1.1 christos break;
300 1.1 christos case 2: /* dynamic block */
301 1.1 christos Tracev((stderr, "inflate: dynamic codes block%s\n",
302 1.1 christos lastblock ? " (last)" : ""));
303 1.1 christos mode = TABLE;
304 1.1 christos break;
305 1.1 christos case 3:
306 1.1 christos strm->msg = (char *)"invalid block type";
307 1.1 christos mode = BAD;
308 1.1 christos }
309 1.1 christos DROPBITS(2);
310 1.1 christos break;
311 1.1 christos
312 1.1 christos case STORED:
313 1.1 christos /* get and verify stored block length */
314 1.1 christos BYTEBITS(); /* go to byte boundary */
315 1.1 christos NEEDBITS(32);
316 1.1 christos if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
317 1.1 christos strm->msg = (char *)"invalid stored block lengths";
318 1.1 christos mode = BAD;
319 1.1 christos break;
320 1.1 christos }
321 1.1 christos length = (unsigned)hold & 0xffff;
322 1.1 christos Tracev((stderr, "inflate: stored length %lu\n",
323 1.1 christos length));
324 1.1 christos INITBITS();
325 1.1 christos
326 1.1 christos /* copy stored block from input to output */
327 1.1 christos while (length != 0) {
328 1.1 christos copy = length;
329 1.1 christos PULL();
330 1.1 christos ROOM();
331 1.1 christos if (copy > have) copy = have;
332 1.1 christos if (copy > left) copy = left;
333 1.1 christos zmemcpy(put, next, copy);
334 1.1 christos have -= copy;
335 1.1 christos next += copy;
336 1.1 christos left -= copy;
337 1.1 christos put += copy;
338 1.1 christos length -= copy;
339 1.1 christos }
340 1.1 christos Tracev((stderr, "inflate: stored end\n"));
341 1.1 christos mode = TYPE;
342 1.1 christos break;
343 1.1 christos
344 1.1 christos case TABLE:
345 1.1 christos /* get dynamic table entries descriptor */
346 1.1 christos NEEDBITS(14);
347 1.1 christos state->nlen = BITS(5) + 257;
348 1.1 christos DROPBITS(5);
349 1.1 christos state->ndist = BITS(5) + 1;
350 1.1 christos DROPBITS(5);
351 1.1 christos state->ncode = BITS(4) + 4;
352 1.1 christos DROPBITS(4);
353 1.1 christos if (state->nlen > 286) {
354 1.1 christos strm->msg = (char *)"too many length symbols";
355 1.1 christos mode = BAD;
356 1.1 christos break;
357 1.1 christos }
358 1.1 christos Tracev((stderr, "inflate: table sizes ok\n"));
359 1.1 christos
360 1.1 christos /* get code length code lengths (not a typo) */
361 1.1 christos state->have = 0;
362 1.1 christos while (state->have < state->ncode) {
363 1.1 christos NEEDBITS(3);
364 1.1 christos state->lens[order[state->have++]] = (unsigned short)BITS(3);
365 1.1 christos DROPBITS(3);
366 1.1 christos }
367 1.1 christos while (state->have < 19)
368 1.1 christos state->lens[order[state->have++]] = 0;
369 1.1 christos state->next = state->codes;
370 1.1 christos lencode = (code const FAR *)(state->next);
371 1.1 christos lenbits = 7;
372 1.1 christos ret = inflate_table9(CODES, state->lens, 19, &(state->next),
373 1.1 christos &(lenbits), state->work);
374 1.1 christos if (ret) {
375 1.1 christos strm->msg = (char *)"invalid code lengths set";
376 1.1 christos mode = BAD;
377 1.1 christos break;
378 1.1 christos }
379 1.1 christos Tracev((stderr, "inflate: code lengths ok\n"));
380 1.1 christos
381 1.1 christos /* get length and distance code code lengths */
382 1.1 christos state->have = 0;
383 1.1 christos while (state->have < state->nlen + state->ndist) {
384 1.1 christos for (;;) {
385 1.1.1.2 christos here = lencode[BITS(lenbits)];
386 1.1.1.2 christos if ((unsigned)(here.bits) <= bits) break;
387 1.1 christos PULLBYTE();
388 1.1 christos }
389 1.1.1.2 christos if (here.val < 16) {
390 1.1.1.2 christos NEEDBITS(here.bits);
391 1.1.1.2 christos DROPBITS(here.bits);
392 1.1.1.2 christos state->lens[state->have++] = here.val;
393 1.1 christos }
394 1.1 christos else {
395 1.1.1.2 christos if (here.val == 16) {
396 1.1.1.2 christos NEEDBITS(here.bits + 2);
397 1.1.1.2 christos DROPBITS(here.bits);
398 1.1 christos if (state->have == 0) {
399 1.1 christos strm->msg = (char *)"invalid bit length repeat";
400 1.1 christos mode = BAD;
401 1.1 christos break;
402 1.1 christos }
403 1.1 christos len = (unsigned)(state->lens[state->have - 1]);
404 1.1 christos copy = 3 + BITS(2);
405 1.1 christos DROPBITS(2);
406 1.1 christos }
407 1.1.1.2 christos else if (here.val == 17) {
408 1.1.1.2 christos NEEDBITS(here.bits + 3);
409 1.1.1.2 christos DROPBITS(here.bits);
410 1.1 christos len = 0;
411 1.1 christos copy = 3 + BITS(3);
412 1.1 christos DROPBITS(3);
413 1.1 christos }
414 1.1 christos else {
415 1.1.1.2 christos NEEDBITS(here.bits + 7);
416 1.1.1.2 christos DROPBITS(here.bits);
417 1.1 christos len = 0;
418 1.1 christos copy = 11 + BITS(7);
419 1.1 christos DROPBITS(7);
420 1.1 christos }
421 1.1 christos if (state->have + copy > state->nlen + state->ndist) {
422 1.1 christos strm->msg = (char *)"invalid bit length repeat";
423 1.1 christos mode = BAD;
424 1.1 christos break;
425 1.1 christos }
426 1.1 christos while (copy--)
427 1.1 christos state->lens[state->have++] = (unsigned short)len;
428 1.1 christos }
429 1.1 christos }
430 1.1 christos
431 1.1 christos /* handle error breaks in while */
432 1.1 christos if (mode == BAD) break;
433 1.1 christos
434 1.1.1.2 christos /* check for end-of-block code (better have one) */
435 1.1.1.2 christos if (state->lens[256] == 0) {
436 1.1.1.2 christos strm->msg = (char *)"invalid code -- missing end-of-block";
437 1.1.1.2 christos mode = BAD;
438 1.1.1.2 christos break;
439 1.1.1.2 christos }
440 1.1.1.2 christos
441 1.1.1.2 christos /* build code tables -- note: do not change the lenbits or distbits
442 1.1.1.2 christos values here (9 and 6) without reading the comments in inftree9.h
443 1.1.1.2 christos concerning the ENOUGH constants, which depend on those values */
444 1.1 christos state->next = state->codes;
445 1.1 christos lencode = (code const FAR *)(state->next);
446 1.1 christos lenbits = 9;
447 1.1 christos ret = inflate_table9(LENS, state->lens, state->nlen,
448 1.1 christos &(state->next), &(lenbits), state->work);
449 1.1 christos if (ret) {
450 1.1 christos strm->msg = (char *)"invalid literal/lengths set";
451 1.1 christos mode = BAD;
452 1.1 christos break;
453 1.1 christos }
454 1.1 christos distcode = (code const FAR *)(state->next);
455 1.1 christos distbits = 6;
456 1.1 christos ret = inflate_table9(DISTS, state->lens + state->nlen,
457 1.1 christos state->ndist, &(state->next), &(distbits),
458 1.1 christos state->work);
459 1.1 christos if (ret) {
460 1.1 christos strm->msg = (char *)"invalid distances set";
461 1.1 christos mode = BAD;
462 1.1 christos break;
463 1.1 christos }
464 1.1 christos Tracev((stderr, "inflate: codes ok\n"));
465 1.1 christos mode = LEN;
466 1.1 christos
467 1.1 christos case LEN:
468 1.1 christos /* get a literal, length, or end-of-block code */
469 1.1 christos for (;;) {
470 1.1.1.2 christos here = lencode[BITS(lenbits)];
471 1.1.1.2 christos if ((unsigned)(here.bits) <= bits) break;
472 1.1 christos PULLBYTE();
473 1.1 christos }
474 1.1.1.2 christos if (here.op && (here.op & 0xf0) == 0) {
475 1.1.1.2 christos last = here;
476 1.1 christos for (;;) {
477 1.1.1.2 christos here = lencode[last.val +
478 1.1 christos (BITS(last.bits + last.op) >> last.bits)];
479 1.1.1.2 christos if ((unsigned)(last.bits + here.bits) <= bits) break;
480 1.1 christos PULLBYTE();
481 1.1 christos }
482 1.1 christos DROPBITS(last.bits);
483 1.1 christos }
484 1.1.1.2 christos DROPBITS(here.bits);
485 1.1.1.2 christos length = (unsigned)here.val;
486 1.1 christos
487 1.1 christos /* process literal */
488 1.1.1.2 christos if (here.op == 0) {
489 1.1.1.2 christos Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
490 1.1 christos "inflate: literal '%c'\n" :
491 1.1.1.2 christos "inflate: literal 0x%02x\n", here.val));
492 1.1 christos ROOM();
493 1.1 christos *put++ = (unsigned char)(length);
494 1.1 christos left--;
495 1.1 christos mode = LEN;
496 1.1 christos break;
497 1.1 christos }
498 1.1 christos
499 1.1 christos /* process end of block */
500 1.1.1.2 christos if (here.op & 32) {
501 1.1 christos Tracevv((stderr, "inflate: end of block\n"));
502 1.1 christos mode = TYPE;
503 1.1 christos break;
504 1.1 christos }
505 1.1 christos
506 1.1 christos /* invalid code */
507 1.1.1.2 christos if (here.op & 64) {
508 1.1 christos strm->msg = (char *)"invalid literal/length code";
509 1.1 christos mode = BAD;
510 1.1 christos break;
511 1.1 christos }
512 1.1 christos
513 1.1 christos /* length code -- get extra bits, if any */
514 1.1.1.2 christos extra = (unsigned)(here.op) & 31;
515 1.1 christos if (extra != 0) {
516 1.1 christos NEEDBITS(extra);
517 1.1 christos length += BITS(extra);
518 1.1 christos DROPBITS(extra);
519 1.1 christos }
520 1.1 christos Tracevv((stderr, "inflate: length %lu\n", length));
521 1.1 christos
522 1.1 christos /* get distance code */
523 1.1 christos for (;;) {
524 1.1.1.2 christos here = distcode[BITS(distbits)];
525 1.1.1.2 christos if ((unsigned)(here.bits) <= bits) break;
526 1.1 christos PULLBYTE();
527 1.1 christos }
528 1.1.1.2 christos if ((here.op & 0xf0) == 0) {
529 1.1.1.2 christos last = here;
530 1.1 christos for (;;) {
531 1.1.1.2 christos here = distcode[last.val +
532 1.1 christos (BITS(last.bits + last.op) >> last.bits)];
533 1.1.1.2 christos if ((unsigned)(last.bits + here.bits) <= bits) break;
534 1.1 christos PULLBYTE();
535 1.1 christos }
536 1.1 christos DROPBITS(last.bits);
537 1.1 christos }
538 1.1.1.2 christos DROPBITS(here.bits);
539 1.1.1.2 christos if (here.op & 64) {
540 1.1 christos strm->msg = (char *)"invalid distance code";
541 1.1 christos mode = BAD;
542 1.1 christos break;
543 1.1 christos }
544 1.1.1.2 christos offset = (unsigned)here.val;
545 1.1 christos
546 1.1 christos /* get distance extra bits, if any */
547 1.1.1.2 christos extra = (unsigned)(here.op) & 15;
548 1.1 christos if (extra != 0) {
549 1.1 christos NEEDBITS(extra);
550 1.1 christos offset += BITS(extra);
551 1.1 christos DROPBITS(extra);
552 1.1 christos }
553 1.1 christos if (offset > WSIZE - (wrap ? 0: left)) {
554 1.1 christos strm->msg = (char *)"invalid distance too far back";
555 1.1 christos mode = BAD;
556 1.1 christos break;
557 1.1 christos }
558 1.1 christos Tracevv((stderr, "inflate: distance %lu\n", offset));
559 1.1 christos
560 1.1 christos /* copy match from window to output */
561 1.1 christos do {
562 1.1 christos ROOM();
563 1.1 christos copy = WSIZE - offset;
564 1.1 christos if (copy < left) {
565 1.1 christos from = put + copy;
566 1.1 christos copy = left - copy;
567 1.1 christos }
568 1.1 christos else {
569 1.1 christos from = put - offset;
570 1.1 christos copy = left;
571 1.1 christos }
572 1.1 christos if (copy > length) copy = length;
573 1.1 christos length -= copy;
574 1.1 christos left -= copy;
575 1.1 christos do {
576 1.1 christos *put++ = *from++;
577 1.1 christos } while (--copy);
578 1.1 christos } while (length != 0);
579 1.1 christos break;
580 1.1 christos
581 1.1 christos case DONE:
582 1.1 christos /* inflate stream terminated properly -- write leftover output */
583 1.1 christos ret = Z_STREAM_END;
584 1.1 christos if (left < WSIZE) {
585 1.1 christos if (out(out_desc, window, (unsigned)(WSIZE - left)))
586 1.1 christos ret = Z_BUF_ERROR;
587 1.1 christos }
588 1.1 christos goto inf_leave;
589 1.1 christos
590 1.1 christos case BAD:
591 1.1 christos ret = Z_DATA_ERROR;
592 1.1 christos goto inf_leave;
593 1.1 christos
594 1.1 christos default: /* can't happen, but makes compilers happy */
595 1.1 christos ret = Z_STREAM_ERROR;
596 1.1 christos goto inf_leave;
597 1.1 christos }
598 1.1 christos
599 1.1 christos /* Return unused input */
600 1.1 christos inf_leave:
601 1.1 christos strm->next_in = next;
602 1.1 christos strm->avail_in = have;
603 1.1 christos return ret;
604 1.1 christos }
605 1.1 christos
606 1.1 christos int ZEXPORT inflateBack9End(strm)
607 1.1 christos z_stream FAR *strm;
608 1.1 christos {
609 1.1 christos if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
610 1.1 christos return Z_STREAM_ERROR;
611 1.1 christos ZFREE(strm, strm->state);
612 1.1 christos strm->state = Z_NULL;
613 1.1 christos Tracev((stderr, "inflate: end\n"));
614 1.1 christos return Z_OK;
615 1.1 christos }
616