This source file includes following definitions.
- inflateReset
- inflatePrime
- inflateInit2_
- inflateInit_
- fixedtables
- makefixed
- updatewindow
- inflate
- inflateEnd
- inflateSetDictionary
- inflateGetHeader
- syncsearch
- inflateSync
- inflateSyncPoint
- inflateCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 #include "zutil.h"
85 #include "inftrees.h"
86 #include "inflate.h"
87 #include "inffast.h"
88
89 #ifdef MAKEFIXED
90 # ifndef BUILDFIXED
91 # define BUILDFIXED
92 # endif
93 #endif
94
95
96 local void fixedtables OF((struct inflate_state FAR *state));
97 local int updatewindow OF((z_streamp strm, unsigned out));
98 #ifdef BUILDFIXED
99 void makefixed OF((void));
100 #endif
101 local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
102 unsigned len));
103
104 int ZEXPORT inflateReset(strm)
105 z_streamp strm;
106 {
107 struct inflate_state FAR *state;
108
109 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
110 state = (struct inflate_state FAR *)strm->state;
111 strm->total_in = strm->total_out = state->total = 0;
112 strm->msg = Z_NULL;
113 strm->adler = 1;
114 state->mode = HEAD;
115 state->last = 0;
116 state->havedict = 0;
117 state->dmax = 32768U;
118 state->head = Z_NULL;
119 state->wsize = 0;
120 state->whave = 0;
121 state->write = 0;
122 state->hold = 0;
123 state->bits = 0;
124 state->lencode = state->distcode = state->next = state->codes;
125 Tracev((stderr, "inflate: reset\n"));
126 return Z_OK;
127 }
128
129 int ZEXPORT inflatePrime(strm, bits, value)
130 z_streamp strm;
131 int bits;
132 int value;
133 {
134 struct inflate_state FAR *state;
135
136 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
137 state = (struct inflate_state FAR *)strm->state;
138 if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
139 value &= (1L << bits) - 1;
140 state->hold += value << state->bits;
141 state->bits += bits;
142 return Z_OK;
143 }
144
145 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
146 z_streamp strm;
147 int windowBits;
148 const char *version;
149 int stream_size;
150 {
151 struct inflate_state FAR *state;
152
153 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
154 stream_size != (int)(sizeof(z_stream)))
155 return Z_VERSION_ERROR;
156 if (strm == Z_NULL) return Z_STREAM_ERROR;
157 strm->msg = Z_NULL;
158 if (strm->zalloc == (alloc_func)0) {
159 strm->zalloc = zcalloc;
160 strm->opaque = (voidpf)0;
161 }
162 if (strm->zfree == (free_func)0) strm->zfree = zcfree;
163 state = (struct inflate_state FAR *)
164 ZALLOC(strm, 1, sizeof(struct inflate_state));
165 if (state == Z_NULL) return Z_MEM_ERROR;
166 Tracev((stderr, "inflate: allocated\n"));
167 strm->state = (struct internal_state FAR *)state;
168 if (windowBits < 0) {
169 state->wrap = 0;
170 windowBits = -windowBits;
171 }
172 else {
173 state->wrap = (windowBits >> 4) + 1;
174 #ifdef GUNZIP
175 if (windowBits < 48) windowBits &= 15;
176 #endif
177 }
178 if (windowBits < 8 || windowBits > 15) {
179 ZFREE(strm, state);
180 strm->state = Z_NULL;
181 return Z_STREAM_ERROR;
182 }
183 state->wbits = (unsigned)windowBits;
184 state->window = Z_NULL;
185 return inflateReset(strm);
186 }
187
188 int ZEXPORT inflateInit_(strm, version, stream_size)
189 z_streamp strm;
190 const char *version;
191 int stream_size;
192 {
193 return inflateInit2_(strm, DEF_WBITS, version, stream_size);
194 }
195
196
197
198
199
200
201
202
203
204
205
206 local void fixedtables(state)
207 struct inflate_state FAR *state;
208 {
209 #ifdef BUILDFIXED
210 static int virgin = 1;
211 static code *lenfix, *distfix;
212 static code fixed[544];
213
214
215 if (virgin) {
216 unsigned sym, bits;
217 static code *next;
218
219
220 sym = 0;
221 while (sym < 144) state->lens[sym++] = 8;
222 while (sym < 256) state->lens[sym++] = 9;
223 while (sym < 280) state->lens[sym++] = 7;
224 while (sym < 288) state->lens[sym++] = 8;
225 next = fixed;
226 lenfix = next;
227 bits = 9;
228 inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
229
230
231 sym = 0;
232 while (sym < 32) state->lens[sym++] = 5;
233 distfix = next;
234 bits = 5;
235 inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
236
237
238 virgin = 0;
239 }
240 #else
241 # include "inffixed.h"
242 #endif
243 state->lencode = lenfix;
244 state->lenbits = 9;
245 state->distcode = distfix;
246 state->distbits = 5;
247 }
248
249 #ifdef MAKEFIXED
250 #include <stdio.h>
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270 void makefixed()
271 {
272 unsigned low, size;
273 struct inflate_state state;
274
275 fixedtables(&state);
276 puts(" /* inffixed.h -- table for decoding fixed codes");
277 puts(" * Generated automatically by makefixed().");
278 puts(" */");
279 puts("");
280 puts(" /* WARNING: this file should *not* be used by applications.");
281 puts(" It is part of the implementation of this library and is");
282 puts(" subject to change. Applications should only use zlib.h.");
283 puts(" */");
284 puts("");
285 size = 1U << 9;
286 printf(" static const code lenfix[%u] = {", size);
287 low = 0;
288 for (;;) {
289 if ((low % 7) == 0) printf("\n ");
290 printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
291 state.lencode[low].val);
292 if (++low == size) break;
293 putchar(',');
294 }
295 puts("\n };");
296 size = 1U << 5;
297 printf("\n static const code distfix[%u] = {", size);
298 low = 0;
299 for (;;) {
300 if ((low % 6) == 0) printf("\n ");
301 printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
302 state.distcode[low].val);
303 if (++low == size) break;
304 putchar(',');
305 }
306 puts("\n };");
307 }
308 #endif
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324 local int updatewindow(strm, out)
325 z_streamp strm;
326 unsigned out;
327 {
328 struct inflate_state FAR *state;
329 unsigned copy, dist;
330
331 state = (struct inflate_state FAR *)strm->state;
332
333
334 if (state->window == Z_NULL) {
335 state->window = (unsigned char FAR *)
336 ZALLOC(strm, 1U << state->wbits,
337 sizeof(unsigned char));
338 if (state->window == Z_NULL) return 1;
339 }
340
341
342 if (state->wsize == 0) {
343 state->wsize = 1U << state->wbits;
344 state->write = 0;
345 state->whave = 0;
346 }
347
348
349 copy = out - strm->avail_out;
350 if (copy >= state->wsize) {
351 zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
352 state->write = 0;
353 state->whave = state->wsize;
354 }
355 else {
356 dist = state->wsize - state->write;
357 if (dist > copy) dist = copy;
358 zmemcpy(state->window + state->write, strm->next_out - copy, dist);
359 copy -= dist;
360 if (copy) {
361 zmemcpy(state->window, strm->next_out - copy, copy);
362 state->write = copy;
363 state->whave = state->wsize;
364 }
365 else {
366 state->write += dist;
367 if (state->write == state->wsize) state->write = 0;
368 if (state->whave < state->wsize) state->whave += dist;
369 }
370 }
371 return 0;
372 }
373
374
375
376
377 #ifdef GUNZIP
378 # define UPDATE(check, buf, len) \
379 (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
380 #else
381 # define UPDATE(check, buf, len) adler32(check, buf, len)
382 #endif
383
384
385 #ifdef GUNZIP
386 # define CRC2(check, word) \
387 do { \
388 hbuf[0] = (unsigned char)(word); \
389 hbuf[1] = (unsigned char)((word) >> 8); \
390 check = crc32(check, hbuf, 2); \
391 } while (0)
392
393 # define CRC4(check, word) \
394 do { \
395 hbuf[0] = (unsigned char)(word); \
396 hbuf[1] = (unsigned char)((word) >> 8); \
397 hbuf[2] = (unsigned char)((word) >> 16); \
398 hbuf[3] = (unsigned char)((word) >> 24); \
399 check = crc32(check, hbuf, 4); \
400 } while (0)
401 #endif
402
403
404 #define LOAD() \
405 do { \
406 put = strm->next_out; \
407 left = strm->avail_out; \
408 next = strm->next_in; \
409 have = strm->avail_in; \
410 hold = state->hold; \
411 bits = state->bits; \
412 } while (0)
413
414
415 #define RESTORE() \
416 do { \
417 strm->next_out = put; \
418 strm->avail_out = left; \
419 strm->next_in = next; \
420 strm->avail_in = have; \
421 state->hold = hold; \
422 state->bits = bits; \
423 } while (0)
424
425
426 #define INITBITS() \
427 do { \
428 hold = 0; \
429 bits = 0; \
430 } while (0)
431
432
433
434 #define PULLBYTE() \
435 do { \
436 if (have == 0) goto inf_leave; \
437 have--; \
438 hold += (unsigned long)(*next++) << bits; \
439 bits += 8; \
440 } while (0)
441
442
443
444 #define NEEDBITS(n) \
445 do { \
446 while (bits < (unsigned)(n)) \
447 PULLBYTE(); \
448 } while (0)
449
450
451 #define BITS(n) \
452 ((unsigned)hold & ((1U << (n)) - 1))
453
454
455 #define DROPBITS(n) \
456 do { \
457 hold >>= (n); \
458 bits -= (unsigned)(n); \
459 } while (0)
460
461
462 #define BYTEBITS() \
463 do { \
464 hold >>= bits & 7; \
465 bits -= bits & 7; \
466 } while (0)
467
468
469 #define REVERSE(q) \
470 ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
471 (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555 int ZEXPORT inflate(strm, flush)
556 z_streamp strm;
557 int flush;
558 {
559 struct inflate_state FAR *state;
560 unsigned char FAR *next;
561 unsigned char FAR *put;
562 unsigned have, left;
563 unsigned long hold;
564 unsigned bits;
565 unsigned in, out;
566 unsigned copy;
567 unsigned char FAR *from;
568 code this;
569 code last;
570 unsigned len;
571 int ret;
572 #ifdef GUNZIP
573 unsigned char hbuf[4];
574 #endif
575 static const unsigned short order[19] =
576 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
577
578 if (strm == Z_NULL || strm->state == Z_NULL ||
579 #ifndef __vax__
580 strm->next_out == Z_NULL ||
581 #endif
582 (strm->next_in == Z_NULL && strm->avail_in != 0))
583 return Z_STREAM_ERROR;
584
585 state = (struct inflate_state FAR *)strm->state;
586 if (state->mode == TYPE) state->mode = TYPEDO;
587 LOAD();
588 in = have;
589 out = left;
590 ret = Z_OK;
591 for (;;)
592 switch (state->mode) {
593 case HEAD:
594 if (state->wrap == 0) {
595 state->mode = TYPEDO;
596 break;
597 }
598 NEEDBITS(16);
599 #ifdef GUNZIP
600 if ((state->wrap & 2) && hold == 0x8b1f) {
601 state->check = crc32(0L, Z_NULL, 0);
602 CRC2(state->check, hold);
603 INITBITS();
604 state->mode = FLAGS;
605 break;
606 }
607 state->flags = 0;
608 if (state->head != Z_NULL)
609 state->head->done = -1;
610 if (!(state->wrap & 1) ||
611 #else
612 if (
613 #endif
614 ((BITS(8) << 8) + (hold >> 8)) % 31) {
615 #ifdef SMALL
616 strm->msg = "error";
617 #else
618 strm->msg = (char *)"incorrect header check";
619 #endif
620 state->mode = BAD;
621 break;
622 }
623 if (BITS(4) != Z_DEFLATED) {
624 #ifdef SMALL
625 strm->msg = "error";
626 #else
627 strm->msg = (char *)"unknown compression method";
628 #endif
629 state->mode = BAD;
630 break;
631 }
632 DROPBITS(4);
633 len = BITS(4) + 8;
634 if (len > state->wbits) {
635 #ifdef SMALL
636 strm->msg = "error";
637 #else
638 strm->msg = (char *)"invalid window size";
639 #endif
640 state->mode = BAD;
641 break;
642 }
643 state->dmax = 1U << len;
644 Tracev((stderr, "inflate: zlib header ok\n"));
645 strm->adler = state->check = adler32(0L, Z_NULL, 0);
646 state->mode = hold & 0x200 ? DICTID : TYPE;
647 INITBITS();
648 break;
649 #ifdef GUNZIP
650 case FLAGS:
651 NEEDBITS(16);
652 state->flags = (int)(hold);
653 if ((state->flags & 0xff) != Z_DEFLATED) {
654 #ifdef SMALL
655 strm->msg = "error";
656 #else
657 strm->msg = (char *)"unknown compression method";
658 #endif
659 state->mode = BAD;
660 break;
661 }
662 if (state->flags & 0xe000) {
663 #ifdef SMALL
664 strm->msg = "error";
665 #else
666 strm->msg = (char *)"unknown header flags set";
667 #endif
668 state->mode = BAD;
669 break;
670 }
671 if (state->head != Z_NULL)
672 state->head->text = (int)((hold >> 8) & 1);
673 if (state->flags & 0x0200) CRC2(state->check, hold);
674 INITBITS();
675 state->mode = TIME;
676 case TIME:
677 NEEDBITS(32);
678 if (state->head != Z_NULL)
679 state->head->time = hold;
680 if (state->flags & 0x0200) CRC4(state->check, hold);
681 INITBITS();
682 state->mode = OS;
683 case OS:
684 NEEDBITS(16);
685 if (state->head != Z_NULL) {
686 state->head->xflags = (int)(hold & 0xff);
687 state->head->os = (int)(hold >> 8);
688 }
689 if (state->flags & 0x0200) CRC2(state->check, hold);
690 INITBITS();
691 state->mode = EXLEN;
692 case EXLEN:
693 if (state->flags & 0x0400) {
694 NEEDBITS(16);
695 state->length = (unsigned)(hold);
696 if (state->head != Z_NULL)
697 state->head->extra_len = (unsigned)hold;
698 if (state->flags & 0x0200) CRC2(state->check, hold);
699 INITBITS();
700 }
701 else if (state->head != Z_NULL)
702 state->head->extra = Z_NULL;
703 state->mode = EXTRA;
704 case EXTRA:
705 if (state->flags & 0x0400) {
706 copy = state->length;
707 if (copy > have) copy = have;
708 if (copy) {
709 if (state->head != Z_NULL &&
710 state->head->extra != Z_NULL) {
711 len = state->head->extra_len - state->length;
712 zmemcpy(state->head->extra + len, next,
713 len + copy > state->head->extra_max ?
714 state->head->extra_max - len : copy);
715 }
716 if (state->flags & 0x0200)
717 state->check = crc32(state->check, next, copy);
718 have -= copy;
719 next += copy;
720 state->length -= copy;
721 }
722 if (state->length) goto inf_leave;
723 }
724 state->length = 0;
725 state->mode = NAME;
726 case NAME:
727 if (state->flags & 0x0800) {
728 if (have == 0) goto inf_leave;
729 copy = 0;
730 do {
731 len = (unsigned)(next[copy++]);
732 if (state->head != Z_NULL &&
733 state->head->name != Z_NULL &&
734 state->length < state->head->name_max)
735 state->head->name[state->length++] = len;
736 } while (len && copy < have);
737 if (state->flags & 0x0200)
738 state->check = crc32(state->check, next, copy);
739 have -= copy;
740 next += copy;
741 if (len) goto inf_leave;
742 }
743 else if (state->head != Z_NULL)
744 state->head->name = Z_NULL;
745 state->length = 0;
746 state->mode = COMMENT;
747 case COMMENT:
748 if (state->flags & 0x1000) {
749 if (have == 0) goto inf_leave;
750 copy = 0;
751 do {
752 len = (unsigned)(next[copy++]);
753 if (state->head != Z_NULL &&
754 state->head->comment != Z_NULL &&
755 state->length < state->head->comm_max)
756 state->head->comment[state->length++] = len;
757 } while (len && copy < have);
758 if (state->flags & 0x0200)
759 state->check = crc32(state->check, next, copy);
760 have -= copy;
761 next += copy;
762 if (len) goto inf_leave;
763 }
764 else if (state->head != Z_NULL)
765 state->head->comment = Z_NULL;
766 state->mode = HCRC;
767 case HCRC:
768 if (state->flags & 0x0200) {
769 NEEDBITS(16);
770 if (hold != (state->check & 0xffff)) {
771 #ifdef SMALL
772 strm->msg = "error";
773 #else
774 strm->msg = (char *)"header crc mismatch";
775 #endif
776 state->mode = BAD;
777 break;
778 }
779 INITBITS();
780 }
781 if (state->head != Z_NULL) {
782 state->head->hcrc = (int)((state->flags >> 9) & 1);
783 state->head->done = 1;
784 }
785 strm->adler = state->check = crc32(0L, Z_NULL, 0);
786 state->mode = TYPE;
787 break;
788 #endif
789 case DICTID:
790 NEEDBITS(32);
791 strm->adler = state->check = REVERSE(hold);
792 INITBITS();
793 state->mode = DICT;
794 case DICT:
795 if (state->havedict == 0) {
796 RESTORE();
797 return Z_NEED_DICT;
798 }
799 strm->adler = state->check = adler32(0L, Z_NULL, 0);
800 state->mode = TYPE;
801 case TYPE:
802 if (flush == Z_BLOCK) goto inf_leave;
803 case TYPEDO:
804 if (state->last) {
805 BYTEBITS();
806 state->mode = CHECK;
807 break;
808 }
809 NEEDBITS(3);
810 state->last = BITS(1);
811 DROPBITS(1);
812 switch (BITS(2)) {
813 case 0:
814 Tracev((stderr, "inflate: stored block%s\n",
815 state->last ? " (last)" : ""));
816 state->mode = STORED;
817 break;
818 case 1:
819 fixedtables(state);
820 Tracev((stderr, "inflate: fixed codes block%s\n",
821 state->last ? " (last)" : ""));
822 state->mode = LEN;
823 break;
824 case 2:
825 Tracev((stderr, "inflate: dynamic codes block%s\n",
826 state->last ? " (last)" : ""));
827 state->mode = TABLE;
828 break;
829 case 3:
830 #ifdef SMALL
831 strm->msg = "error";
832 #else
833 strm->msg = (char *)"invalid block type";
834 #endif
835 state->mode = BAD;
836 }
837 DROPBITS(2);
838 break;
839 case STORED:
840 BYTEBITS();
841 NEEDBITS(32);
842 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
843 #ifdef SMALL
844 strm->msg = "error";
845 #else
846 strm->msg = (char *)"invalid stored block lengths";
847 #endif
848 state->mode = BAD;
849 break;
850 }
851 state->length = (unsigned)hold & 0xffff;
852 Tracev((stderr, "inflate: stored length %u\n",
853 state->length));
854 INITBITS();
855 state->mode = COPY;
856 case COPY:
857 copy = state->length;
858 if (copy) {
859 if (copy > have) copy = have;
860 if (copy > left) copy = left;
861 if (copy == 0) goto inf_leave;
862 zmemcpy(put, next, copy);
863 have -= copy;
864 next += copy;
865 left -= copy;
866 put += copy;
867 state->length -= copy;
868 break;
869 }
870 Tracev((stderr, "inflate: stored end\n"));
871 state->mode = TYPE;
872 break;
873 case TABLE:
874 NEEDBITS(14);
875 state->nlen = BITS(5) + 257;
876 DROPBITS(5);
877 state->ndist = BITS(5) + 1;
878 DROPBITS(5);
879 state->ncode = BITS(4) + 4;
880 DROPBITS(4);
881 #ifndef PKZIP_BUG_WORKAROUND
882 if (state->nlen > 286 || state->ndist > 30) {
883 #ifdef SMALL
884 strm->msg = "error";
885 #else
886 strm->msg = (char *)"too many length or distance symbols";
887 #endif
888 state->mode = BAD;
889 break;
890 }
891 #endif
892 Tracev((stderr, "inflate: table sizes ok\n"));
893 state->have = 0;
894 state->mode = LENLENS;
895 case LENLENS:
896 while (state->have < state->ncode) {
897 NEEDBITS(3);
898 state->lens[order[state->have++]] = (unsigned short)BITS(3);
899 DROPBITS(3);
900 }
901 while (state->have < 19)
902 state->lens[order[state->have++]] = 0;
903 state->next = state->codes;
904 state->lencode = (code const FAR *)(state->next);
905 state->lenbits = 7;
906 ret = inflate_table(CODES, state->lens, 19, &(state->next),
907 &(state->lenbits), state->work);
908 if (ret) {
909 #ifdef SMALL
910 strm->msg = "error";
911 #else
912 strm->msg = (char *)"invalid code lengths set";
913 #endif
914 state->mode = BAD;
915 break;
916 }
917 Tracev((stderr, "inflate: code lengths ok\n"));
918 state->have = 0;
919 state->mode = CODELENS;
920 case CODELENS:
921 while (state->have < state->nlen + state->ndist) {
922 for (;;) {
923 this = state->lencode[BITS(state->lenbits)];
924 if ((unsigned)(this.bits) <= bits) break;
925 PULLBYTE();
926 }
927 if (this.val < 16) {
928 NEEDBITS(this.bits);
929 DROPBITS(this.bits);
930 state->lens[state->have++] = this.val;
931 }
932 else {
933 if (this.val == 16) {
934 NEEDBITS(this.bits + 2);
935 DROPBITS(this.bits);
936 if (state->have == 0) {
937 #ifdef SMALL
938 strm->msg = "error";
939 #else
940 strm->msg = (char *)"invalid bit length repeat";
941 #endif
942 state->mode = BAD;
943 break;
944 }
945 len = state->lens[state->have - 1];
946 copy = 3 + BITS(2);
947 DROPBITS(2);
948 }
949 else if (this.val == 17) {
950 NEEDBITS(this.bits + 3);
951 DROPBITS(this.bits);
952 len = 0;
953 copy = 3 + BITS(3);
954 DROPBITS(3);
955 }
956 else {
957 NEEDBITS(this.bits + 7);
958 DROPBITS(this.bits);
959 len = 0;
960 copy = 11 + BITS(7);
961 DROPBITS(7);
962 }
963 if (state->have + copy > state->nlen + state->ndist) {
964 #ifdef SMALL
965 strm->msg = "error";
966 #else
967 strm->msg = (char *)"invalid bit length repeat";
968 #endif
969 state->mode = BAD;
970 break;
971 }
972 while (copy--)
973 state->lens[state->have++] = (unsigned short)len;
974 }
975 }
976
977
978 if (state->mode == BAD) break;
979
980
981 state->next = state->codes;
982 state->lencode = (code const FAR *)(state->next);
983 state->lenbits = 9;
984 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
985 &(state->lenbits), state->work);
986 if (ret) {
987 #ifdef SMALL
988 strm->msg = "error";
989 #else
990 strm->msg = (char *)"invalid literal/lengths set";
991 #endif
992 state->mode = BAD;
993 break;
994 }
995 state->distcode = (code const FAR *)(state->next);
996 state->distbits = 6;
997 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
998 &(state->next), &(state->distbits), state->work);
999 if (ret) {
1000 #ifdef SMALL
1001 strm->msg = "error";
1002 #else
1003 strm->msg = (char *)"invalid distances set";
1004 #endif
1005 state->mode = BAD;
1006 break;
1007 }
1008 Tracev((stderr, "inflate: codes ok\n"));
1009 state->mode = LEN;
1010 case LEN:
1011 #ifndef SLOW
1012 if (have >= 6 && left >= 258) {
1013 RESTORE();
1014 inflate_fast(strm, out);
1015 LOAD();
1016 break;
1017 }
1018 #endif
1019 for (;;) {
1020 this = state->lencode[BITS(state->lenbits)];
1021 if ((unsigned)(this.bits) <= bits) break;
1022 PULLBYTE();
1023 }
1024 if (this.op && (this.op & 0xf0) == 0) {
1025 last = this;
1026 for (;;) {
1027 this = state->lencode[last.val +
1028 (BITS(last.bits + last.op) >> last.bits)];
1029 if ((unsigned)(last.bits + this.bits) <= bits) break;
1030 PULLBYTE();
1031 }
1032 DROPBITS(last.bits);
1033 }
1034 DROPBITS(this.bits);
1035 state->length = (unsigned)this.val;
1036 if ((int)(this.op) == 0) {
1037 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
1038 "inflate: literal '%c'\n" :
1039 "inflate: literal 0x%02x\n", this.val));
1040 state->mode = LIT;
1041 break;
1042 }
1043 if (this.op & 32) {
1044 Tracevv((stderr, "inflate: end of block\n"));
1045 state->mode = TYPE;
1046 break;
1047 }
1048 if (this.op & 64) {
1049 #ifdef SMALL
1050 strm->msg = "error";
1051 #else
1052 strm->msg = (char *)"invalid literal/length code";
1053 #endif
1054 state->mode = BAD;
1055 break;
1056 }
1057 state->extra = (unsigned)(this.op) & 15;
1058 state->mode = LENEXT;
1059 case LENEXT:
1060 if (state->extra) {
1061 NEEDBITS(state->extra);
1062 state->length += BITS(state->extra);
1063 DROPBITS(state->extra);
1064 }
1065 Tracevv((stderr, "inflate: length %u\n", state->length));
1066 state->mode = DIST;
1067 case DIST:
1068 for (;;) {
1069 this = state->distcode[BITS(state->distbits)];
1070 if ((unsigned)(this.bits) <= bits) break;
1071 PULLBYTE();
1072 }
1073 if ((this.op & 0xf0) == 0) {
1074 last = this;
1075 for (;;) {
1076 this = state->distcode[last.val +
1077 (BITS(last.bits + last.op) >> last.bits)];
1078 if ((unsigned)(last.bits + this.bits) <= bits) break;
1079 PULLBYTE();
1080 }
1081 DROPBITS(last.bits);
1082 }
1083 DROPBITS(this.bits);
1084 if (this.op & 64) {
1085 #ifdef SMALL
1086 strm->msg = "error";
1087 #else
1088 strm->msg = (char *)"invalid distance code";
1089 #endif
1090 state->mode = BAD;
1091 break;
1092 }
1093 state->offset = (unsigned)this.val;
1094 state->extra = (unsigned)(this.op) & 15;
1095 state->mode = DISTEXT;
1096 case DISTEXT:
1097 if (state->extra) {
1098 NEEDBITS(state->extra);
1099 state->offset += BITS(state->extra);
1100 DROPBITS(state->extra);
1101 }
1102 #ifdef INFLATE_STRICT
1103 if (state->offset > state->dmax) {
1104 strm->msg = (char *)"invalid distance too far back";
1105 state->mode = BAD;
1106 break;
1107 }
1108 #endif
1109 if (state->offset > state->whave + out - left) {
1110 #ifdef SMALL
1111 strm->msg = "error";
1112 #else
1113 strm->msg = (char *)"invalid distance too far back";
1114 #endif
1115 state->mode = BAD;
1116 break;
1117 }
1118 Tracevv((stderr, "inflate: distance %u\n", state->offset));
1119 state->mode = MATCH;
1120 case MATCH:
1121 if (left == 0) goto inf_leave;
1122 copy = out - left;
1123 if (state->offset > copy) {
1124 copy = state->offset - copy;
1125 if (copy > state->write) {
1126 copy -= state->write;
1127 from = state->window + (state->wsize - copy);
1128 }
1129 else
1130 from = state->window + (state->write - copy);
1131 if (copy > state->length) copy = state->length;
1132 }
1133 else {
1134 from = put - state->offset;
1135 copy = state->length;
1136 }
1137 if (copy > left) copy = left;
1138 left -= copy;
1139 state->length -= copy;
1140 do {
1141 *put++ = *from++;
1142 } while (--copy);
1143 if (state->length == 0) state->mode = LEN;
1144 break;
1145 case LIT:
1146 if (left == 0) goto inf_leave;
1147 *put++ = (unsigned char)(state->length);
1148 left--;
1149 state->mode = LEN;
1150 break;
1151 case CHECK:
1152 if (state->wrap) {
1153 NEEDBITS(32);
1154 out -= left;
1155 strm->total_out += out;
1156 state->total += out;
1157 if (out)
1158 strm->adler = state->check =
1159 UPDATE(state->check, put - out, out);
1160 out = left;
1161 if ((
1162 #ifdef GUNZIP
1163 state->flags ? hold :
1164 #endif
1165 REVERSE(hold)) != state->check) {
1166 #ifdef SMALL
1167 strm->msg = "error";
1168 #else
1169 strm->msg = (char *)"incorrect data check";
1170 #endif
1171 state->mode = BAD;
1172 break;
1173 }
1174 INITBITS();
1175 Tracev((stderr, "inflate: check matches trailer\n"));
1176 }
1177 #ifdef GUNZIP
1178 state->mode = LENGTH;
1179 case LENGTH:
1180 if (state->wrap && state->flags) {
1181 NEEDBITS(32);
1182 if (hold != (state->total & 0xffffffffUL)) {
1183 #ifdef SMALL
1184 strm->msg = "error";
1185 #else
1186 strm->msg = (char *)"incorrect length check";
1187 #endif
1188 state->mode = BAD;
1189 break;
1190 }
1191 INITBITS();
1192 Tracev((stderr, "inflate: length matches trailer\n"));
1193 }
1194 #endif
1195 state->mode = DONE;
1196 case DONE:
1197 ret = Z_STREAM_END;
1198 goto inf_leave;
1199 case BAD:
1200 ret = Z_DATA_ERROR;
1201 goto inf_leave;
1202 case MEM:
1203 return Z_MEM_ERROR;
1204 case SYNC:
1205 default:
1206 return Z_STREAM_ERROR;
1207 }
1208
1209
1210
1211
1212
1213
1214
1215 inf_leave:
1216 RESTORE();
1217 if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
1218 if (updatewindow(strm, out)) {
1219 state->mode = MEM;
1220 return Z_MEM_ERROR;
1221 }
1222 in -= strm->avail_in;
1223 out -= strm->avail_out;
1224 strm->total_in += in;
1225 strm->total_out += out;
1226 state->total += out;
1227 if (state->wrap && out)
1228 strm->adler = state->check =
1229 UPDATE(state->check, strm->next_out - out, out);
1230 strm->data_type = state->bits + (state->last ? 64 : 0) +
1231 (state->mode == TYPE ? 128 : 0);
1232 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1233 ret = Z_BUF_ERROR;
1234 return ret;
1235 }
1236
1237 int ZEXPORT inflateEnd(strm)
1238 z_streamp strm;
1239 {
1240 struct inflate_state FAR *state;
1241 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
1242 return Z_STREAM_ERROR;
1243 state = (struct inflate_state FAR *)strm->state;
1244 if (state->window != Z_NULL) ZFREE(strm, state->window);
1245 ZFREE(strm, strm->state);
1246 strm->state = Z_NULL;
1247 Tracev((stderr, "inflate: end\n"));
1248 return Z_OK;
1249 }
1250
1251 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1252 z_streamp strm;
1253 const Bytef *dictionary;
1254 uInt dictLength;
1255 {
1256 struct inflate_state FAR *state;
1257 unsigned long id;
1258
1259
1260 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1261 state = (struct inflate_state FAR *)strm->state;
1262 if (state->wrap != 0 && state->mode != DICT)
1263 return Z_STREAM_ERROR;
1264
1265
1266 if (state->mode == DICT) {
1267 id = adler32(0L, Z_NULL, 0);
1268 id = adler32(id, dictionary, dictLength);
1269 if (id != state->check)
1270 return Z_DATA_ERROR;
1271 }
1272
1273
1274 if (updatewindow(strm, strm->avail_out)) {
1275 state->mode = MEM;
1276 return Z_MEM_ERROR;
1277 }
1278 if (dictLength > state->wsize) {
1279 zmemcpy(state->window, dictionary + dictLength - state->wsize,
1280 state->wsize);
1281 state->whave = state->wsize;
1282 }
1283 else {
1284 zmemcpy(state->window + state->wsize - dictLength, dictionary,
1285 dictLength);
1286 state->whave = dictLength;
1287 }
1288 state->havedict = 1;
1289 Tracev((stderr, "inflate: dictionary set\n"));
1290 return Z_OK;
1291 }
1292
1293 int ZEXPORT inflateGetHeader(strm, head)
1294 z_streamp strm;
1295 gz_headerp head;
1296 {
1297 struct inflate_state FAR *state;
1298
1299
1300 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1301 state = (struct inflate_state FAR *)strm->state;
1302 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1303
1304
1305 state->head = head;
1306 head->done = 0;
1307 return Z_OK;
1308 }
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321 local unsigned syncsearch(have, buf, len)
1322 unsigned FAR *have;
1323 unsigned char FAR *buf;
1324 unsigned len;
1325 {
1326 unsigned got;
1327 unsigned next;
1328
1329 got = *have;
1330 next = 0;
1331 while (next < len && got < 4) {
1332 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1333 got++;
1334 else if (buf[next])
1335 got = 0;
1336 else
1337 got = 4 - got;
1338 next++;
1339 }
1340 *have = got;
1341 return next;
1342 }
1343
1344 int ZEXPORT inflateSync(strm)
1345 z_streamp strm;
1346 {
1347 unsigned len;
1348 unsigned long in, out;
1349 unsigned char buf[4];
1350 struct inflate_state FAR *state;
1351
1352
1353 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1354 state = (struct inflate_state FAR *)strm->state;
1355 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1356
1357
1358 if (state->mode != SYNC) {
1359 state->mode = SYNC;
1360 state->hold <<= state->bits & 7;
1361 state->bits -= state->bits & 7;
1362 len = 0;
1363 while (state->bits >= 8) {
1364 buf[len++] = (unsigned char)(state->hold);
1365 state->hold >>= 8;
1366 state->bits -= 8;
1367 }
1368 state->have = 0;
1369 syncsearch(&(state->have), buf, len);
1370 }
1371
1372
1373 len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1374 strm->avail_in -= len;
1375 strm->next_in += len;
1376 strm->total_in += len;
1377
1378
1379 if (state->have != 4) return Z_DATA_ERROR;
1380 in = strm->total_in; out = strm->total_out;
1381 inflateReset(strm);
1382 strm->total_in = in; strm->total_out = out;
1383 state->mode = TYPE;
1384 return Z_OK;
1385 }
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395 int ZEXPORT inflateSyncPoint(strm)
1396 z_streamp strm;
1397 {
1398 struct inflate_state FAR *state;
1399
1400 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1401 state = (struct inflate_state FAR *)strm->state;
1402 return state->mode == STORED && state->bits == 0;
1403 }
1404
1405 int ZEXPORT inflateCopy(dest, source)
1406 z_streamp dest;
1407 z_streamp source;
1408 {
1409 struct inflate_state FAR *state;
1410 struct inflate_state FAR *copy;
1411 unsigned char FAR *window;
1412 unsigned wsize;
1413
1414
1415 if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
1416 source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
1417 return Z_STREAM_ERROR;
1418 state = (struct inflate_state FAR *)source->state;
1419
1420
1421 copy = (struct inflate_state FAR *)
1422 ZALLOC(source, 1, sizeof(struct inflate_state));
1423 if (copy == Z_NULL) return Z_MEM_ERROR;
1424 window = Z_NULL;
1425 if (state->window != Z_NULL) {
1426 window = (unsigned char FAR *)
1427 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1428 if (window == Z_NULL) {
1429 ZFREE(source, copy);
1430 return Z_MEM_ERROR;
1431 }
1432 }
1433
1434
1435 zmemcpy(dest, source, sizeof(z_stream));
1436 zmemcpy(copy, state, sizeof(struct inflate_state));
1437 if (state->lencode >= state->codes &&
1438 state->lencode <= state->codes + ENOUGH - 1) {
1439 copy->lencode = copy->codes + (state->lencode - state->codes);
1440 copy->distcode = copy->codes + (state->distcode - state->codes);
1441 }
1442 copy->next = copy->codes + (state->next - state->codes);
1443 if (window != Z_NULL) {
1444 wsize = 1U << state->wbits;
1445 zmemcpy(window, state->window, wsize);
1446 }
1447 copy->window = window;
1448 dest->state = (struct internal_state FAR *)copy;
1449 return Z_OK;
1450 }