VirtualBox

source: vbox/trunk/src/libs/zlib-1.2.1/inflate.c@ 10184

最後變更 在這個檔案從10184是 6390,由 vboxsync 提交於 17 年 前

export libpng and zlib so Windows and OS/2 builds cleanly.

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette