Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
inflate.c File Reference
#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
#include "inffast.h"
#include "inffixed.h"

Go to the source code of this file.

Macros

#define UPDATE_CHECK(check, buf, len)   adler32(check, buf, len)
 
#define LOAD()
 
#define RESTORE()
 
#define INITBITS()
 
#define PULLBYTE()
 
#define NEEDBITS(n)
 
#define BITS(n)    ((unsigned)hold & ((1U << (n)) - 1))
 
#define DROPBITS(n)
 
#define BYTEBITS()
 

Functions

int inflateStateCheck OF ((z_streamp strm))
 
void fixedtables OF ((struct inflate_state FAR *state))
 
int updatewindow OF ((z_streamp strm, const unsigned char FAR *end, unsigned copy))
 
unsigned syncsearch OF ((unsigned FAR *have, const unsigned char FAR *buf, unsigned len))
 
int inflateStateCheck (z_streamp strm)
 
int ZEXPORT inflateResetKeep (z_streamp strm)
 
int ZEXPORT inflateReset (z_streamp strm)
 
int ZEXPORT inflateReset2 (z_streamp strm, int windowBits)
 
int ZEXPORT inflateInit2_ (z_streamp strm, int windowBits, const char *version, int stream_size)
 
int ZEXPORT inflateInit_ (z_streamp strm, const char *version, int stream_size)
 
int ZEXPORT inflatePrime (z_streamp strm, int bits, int value)
 
void fixedtables (struct inflate_state FAR *state)
 
int updatewindow (z_streamp strm, const Bytef *end, unsigned copy)
 
int ZEXPORT inflate (z_streamp strm, int flush)
 
int ZEXPORT inflateEnd (z_streamp strm)
 
int ZEXPORT inflateGetDictionary (z_streamp strm, Bytef *dictionary, uInt *dictLength)
 
int ZEXPORT inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength)
 
int ZEXPORT inflateGetHeader (z_streamp strm, gz_headerp head)
 
unsigned syncsearch (unsigned FAR *have, const unsigned char FAR *buf, unsigned len)
 
int ZEXPORT inflateSync (z_streamp strm)
 
int ZEXPORT inflateSyncPoint (z_streamp strm)
 
int ZEXPORT inflateCopy (z_streamp dest, z_streamp source)
 
int ZEXPORT inflateUndermine (z_streamp strm, int subvert)
 
int ZEXPORT inflateValidate (z_streamp strm, int check)
 
long ZEXPORT inflateMark (z_streamp strm)
 
unsigned long ZEXPORT inflateCodesUsed (z_streamp strm)
 

Macro Definition Documentation

◆ BITS

#define BITS (   n)     ((unsigned)hold & ((1U << (n)) - 1))

Definition at line 524 of file inflate.c.

◆ BYTEBITS

#define BYTEBITS ( )
Value:
do { \
hold >>= bits & 7; \
bits -= bits & 7; \
} while (0)

Definition at line 535 of file inflate.c.

◆ DROPBITS

#define DROPBITS (   n)
Value:
do { \
hold >>= (n); \
bits -= (unsigned)(n); \
} while (0)

Definition at line 528 of file inflate.c.

◆ INITBITS

#define INITBITS ( )
Value:
do { \
hold = 0; \
bits = 0; \
} while (0)

Definition at line 499 of file inflate.c.

◆ LOAD

#define LOAD ( )
Value:
do { \
put = strm->next_out; \
left = strm->avail_out; \
next = strm->next_in; \
have = strm->avail_in; \
hold = state->hold; \
bits = state->bits; \
} while (0)

Definition at line 477 of file inflate.c.

◆ NEEDBITS

#define NEEDBITS (   n)
Value:
do { \
while (bits < (unsigned)(n)) \
PULLBYTE(); \
} while (0)

Definition at line 517 of file inflate.c.

◆ PULLBYTE

#define PULLBYTE ( )
Value:
do { \
if (have == 0) goto inf_leave; \
have--; \
hold += (unsigned long)(*next++) << bits; \
bits += 8; \
} while (0)

Definition at line 507 of file inflate.c.

◆ RESTORE

#define RESTORE ( )
Value:
do { \
strm->next_out = put; \
strm->avail_out = left; \
strm->next_in = next; \
strm->avail_in = have; \
state->hold = hold; \
state->bits = bits; \
} while (0)

Definition at line 488 of file inflate.c.

◆ UPDATE_CHECK

#define UPDATE_CHECK (   check,
  buf,
  len 
)    adler32(check, buf, len)

Definition at line 454 of file inflate.c.

Function Documentation

◆ fixedtables()

void fixedtables ( struct inflate_state FAR *  state)

Definition at line 279 of file inflate.c.

281{
282#ifdef BUILDFIXED
283 static int virgin = 1;
284 static code *lenfix, *distfix;
285 static code fixed[544];
286
287 /* build fixed huffman tables if first call (may not be thread safe) */
288 if (virgin) {
289 unsigned sym, bits;
290 static code *next;
291
292 /* literal/length table */
293 sym = 0;
294 while (sym < 144) state->lens[sym++] = 8;
295 while (sym < 256) state->lens[sym++] = 9;
296 while (sym < 280) state->lens[sym++] = 7;
297 while (sym < 288) state->lens[sym++] = 8;
298 next = fixed;
299 lenfix = next;
300 bits = 9;
301 inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
302
303 /* distance table */
304 sym = 0;
305 while (sym < 32) state->lens[sym++] = 5;
306 distfix = next;
307 bits = 5;
308 inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
309
310 /* do this just once */
311 virgin = 0;
312 }
313#else /* !BUILDFIXED */
314# include "inffixed.h"
315#endif /* BUILDFIXED */
316 state->lencode = lenfix;
317 state->lenbits = 9;
318 state->distcode = distfix;
319 state->distbits = 5;
320}
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, unsigned codes, code FAR *FAR *table, unsigned FAR *bits, unsigned short FAR *work)
Definition: inftrees.c:32
@ LENS
Definition: inftrees.h:56
@ DISTS
Definition: inftrees.h:57
Definition: inftrees.h:24

Referenced by inflate().

◆ inflate()

int ZEXPORT inflate ( z_streamp  strm,
int  flush 
)

Definition at line 623 of file inflate.c.

626{
627 struct inflate_state FAR *state;
628 z_const unsigned char FAR *next; /* next input */
629 unsigned char FAR *put; /* next output */
630 unsigned have, left; /* available input and output */
631 unsigned long hold; /* bit buffer */
632 unsigned bits; /* bits in bit buffer */
633 unsigned in, out; /* save starting available input and output */
634 unsigned copy; /* number of stored or match bytes to copy */
635 unsigned char FAR *from; /* where to copy match bytes from */
636 code here; /* current decoding table entry */
637 code last; /* parent table entry */
638 unsigned len; /* length to copy for repeats, bits to drop */
639 int ret; /* return code */
640#ifdef GUNZIP
641 unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
642#endif
643 static const unsigned short order[19] = /* permutation of code lengths */
644 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
645
646 if (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
647 (strm->next_in == Z_NULL && strm->avail_in != 0))
648 return Z_STREAM_ERROR;
649
650 state = (struct inflate_state FAR *)strm->state;
651 if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
652 LOAD();
653 in = have;
654 out = left;
655 ret = Z_OK;
656 for (;;)
657 switch (state->mode) {
658 case HEAD:
659 if (state->wrap == 0) {
660 state->mode = TYPEDO;
661 break;
662 }
663 NEEDBITS(16);
664#ifdef GUNZIP
665 if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
666 if (state->wbits == 0)
667 state->wbits = 15;
668 state->check = crc32(0L, Z_NULL, 0);
669 CRC2(state->check, hold);
670 INITBITS();
671 state->mode = FLAGS;
672 break;
673 }
674 if (state->head != Z_NULL)
675 state->head->done = -1;
676 if (!(state->wrap & 1) || /* check if zlib header allowed */
677#else
678 if (
679#endif
680 ((BITS(8) << 8) + (hold >> 8)) % 31) {
681 strm->msg = (char *)"incorrect header check";
682 state->mode = BAD;
683 break;
684 }
685 if (BITS(4) != Z_DEFLATED) {
686 strm->msg = (char *)"unknown compression method";
687 state->mode = BAD;
688 break;
689 }
690 DROPBITS(4);
691 len = BITS(4) + 8;
692 if (state->wbits == 0)
693 state->wbits = len;
694 if (len > 15 || len > state->wbits) {
695 strm->msg = (char *)"invalid window size";
696 state->mode = BAD;
697 break;
698 }
699 state->dmax = 1U << len;
700 state->flags = 0; /* indicate zlib header */
701 Tracev((stderr, "inflate: zlib header ok\n"));
702 strm->adler = state->check = adler32(0L, Z_NULL, 0);
703 state->mode = hold & 0x200 ? DICTID : TYPE;
704 INITBITS();
705 break;
706#ifdef GUNZIP
707 case FLAGS:
708 NEEDBITS(16);
709 state->flags = (int)(hold);
710 if ((state->flags & 0xff) != Z_DEFLATED) {
711 strm->msg = (char *)"unknown compression method";
712 state->mode = BAD;
713 break;
714 }
715 if (state->flags & 0xe000) {
716 strm->msg = (char *)"unknown header flags set";
717 state->mode = BAD;
718 break;
719 }
720 if (state->head != Z_NULL)
721 state->head->text = (int)((hold >> 8) & 1);
722 if ((state->flags & 0x0200) && (state->wrap & 4))
723 CRC2(state->check, hold);
724 INITBITS();
725 state->mode = TIME;
726 /* fallthrough */
727 case TIME:
728 NEEDBITS(32);
729 if (state->head != Z_NULL)
730 state->head->time = hold;
731 if ((state->flags & 0x0200) && (state->wrap & 4))
732 CRC4(state->check, hold);
733 INITBITS();
734 state->mode = OS;
735 /* fallthrough */
736 case OS:
737 NEEDBITS(16);
738 if (state->head != Z_NULL) {
739 state->head->xflags = (int)(hold & 0xff);
740 state->head->os = (int)(hold >> 8);
741 }
742 if ((state->flags & 0x0200) && (state->wrap & 4))
743 CRC2(state->check, hold);
744 INITBITS();
745 state->mode = EXLEN;
746 /* fallthrough */
747 case EXLEN:
748 if (state->flags & 0x0400) {
749 NEEDBITS(16);
750 state->length = (unsigned)(hold);
751 if (state->head != Z_NULL)
752 state->head->extra_len = (unsigned)hold;
753 if ((state->flags & 0x0200) && (state->wrap & 4))
754 CRC2(state->check, hold);
755 INITBITS();
756 }
757 else if (state->head != Z_NULL)
758 state->head->extra = Z_NULL;
759 state->mode = EXTRA;
760 /* fallthrough */
761 case EXTRA:
762 if (state->flags & 0x0400) {
763 copy = state->length;
764 if (copy > have) copy = have;
765 if (copy) {
766 if (state->head != Z_NULL &&
767 state->head->extra != Z_NULL) {
768 len = state->head->extra_len - state->length;
769 zmemcpy(state->head->extra + len, next,
770 len + copy > state->head->extra_max ?
771 state->head->extra_max - len : copy);
772 }
773 if ((state->flags & 0x0200) && (state->wrap & 4))
774 state->check = crc32(state->check, next, copy);
775 have -= copy;
776 next += copy;
777 state->length -= copy;
778 }
779 if (state->length) goto inf_leave;
780 }
781 state->length = 0;
782 state->mode = NAME;
783 /* fallthrough */
784 case NAME:
785 if (state->flags & 0x0800) {
786 if (have == 0) goto inf_leave;
787 copy = 0;
788 do {
789 len = (unsigned)(next[copy++]);
790 if (state->head != Z_NULL &&
791 state->head->name != Z_NULL &&
792 state->length < state->head->name_max)
793 state->head->name[state->length++] = (Bytef)len;
794 } while (len && copy < have);
795 if ((state->flags & 0x0200) && (state->wrap & 4))
796 state->check = crc32(state->check, next, copy);
797 have -= copy;
798 next += copy;
799 if (len) goto inf_leave;
800 }
801 else if (state->head != Z_NULL)
802 state->head->name = Z_NULL;
803 state->length = 0;
804 state->mode = COMMENT;
805 /* fallthrough */
806 case COMMENT:
807 if (state->flags & 0x1000) {
808 if (have == 0) goto inf_leave;
809 copy = 0;
810 do {
811 len = (unsigned)(next[copy++]);
812 if (state->head != Z_NULL &&
813 state->head->comment != Z_NULL &&
814 state->length < state->head->comm_max)
815 state->head->comment[state->length++] = (Bytef)len;
816 } while (len && copy < have);
817 if ((state->flags & 0x0200) && (state->wrap & 4))
818 state->check = crc32(state->check, next, copy);
819 have -= copy;
820 next += copy;
821 if (len) goto inf_leave;
822 }
823 else if (state->head != Z_NULL)
824 state->head->comment = Z_NULL;
825 state->mode = HCRC;
826 /* fallthrough */
827 case HCRC:
828 if (state->flags & 0x0200) {
829 NEEDBITS(16);
830 if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
831 strm->msg = (char *)"header crc mismatch";
832 state->mode = BAD;
833 break;
834 }
835 INITBITS();
836 }
837 if (state->head != Z_NULL) {
838 state->head->hcrc = (int)((state->flags >> 9) & 1);
839 state->head->done = 1;
840 }
841 strm->adler = state->check = crc32(0L, Z_NULL, 0);
842 state->mode = TYPE;
843 break;
844#endif
845 case DICTID:
846 NEEDBITS(32);
847 strm->adler = state->check = ZSWAP32(hold);
848 INITBITS();
849 state->mode = DICT;
850 /* fallthrough */
851 case DICT:
852 if (state->havedict == 0) {
853 RESTORE();
854 return Z_NEED_DICT;
855 }
856 strm->adler = state->check = adler32(0L, Z_NULL, 0);
857 state->mode = TYPE;
858 /* fallthrough */
859 case TYPE:
860 if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
861 /* fallthrough */
862 case TYPEDO:
863 if (state->last) {
864 BYTEBITS();
865 state->mode = CHECK;
866 break;
867 }
868 NEEDBITS(3);
869 state->last = BITS(1);
870 DROPBITS(1);
871 switch (BITS(2)) {
872 case 0: /* stored block */
873 Tracev((stderr, "inflate: stored block%s\n",
874 state->last ? " (last)" : ""));
875 state->mode = STORED;
876 break;
877 case 1: /* fixed block */
878 fixedtables(state);
879 Tracev((stderr, "inflate: fixed codes block%s\n",
880 state->last ? " (last)" : ""));
881 state->mode = LEN_; /* decode codes */
882 if (flush == Z_TREES) {
883 DROPBITS(2);
884 goto inf_leave;
885 }
886 break;
887 case 2: /* dynamic block */
888 Tracev((stderr, "inflate: dynamic codes block%s\n",
889 state->last ? " (last)" : ""));
890 state->mode = TABLE;
891 break;
892 case 3:
893 strm->msg = (char *)"invalid block type";
894 state->mode = BAD;
895 }
896 DROPBITS(2);
897 break;
898 case STORED:
899 BYTEBITS(); /* go to byte boundary */
900 NEEDBITS(32);
901 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
902 strm->msg = (char *)"invalid stored block lengths";
903 state->mode = BAD;
904 break;
905 }
906 state->length = (unsigned)hold & 0xffff;
907 Tracev((stderr, "inflate: stored length %u\n",
908 state->length));
909 INITBITS();
910 state->mode = COPY_;
911 if (flush == Z_TREES) goto inf_leave;
912 /* fallthrough */
913 case COPY_:
914 state->mode = COPY;
915 /* fallthrough */
916 case COPY:
917 copy = state->length;
918 if (copy) {
919 if (copy > have) copy = have;
920 if (copy > left) copy = left;
921 if (copy == 0) goto inf_leave;
922 zmemcpy(put, next, copy);
923 have -= copy;
924 next += copy;
925 left -= copy;
926 put += copy;
927 state->length -= copy;
928 break;
929 }
930 Tracev((stderr, "inflate: stored end\n"));
931 state->mode = TYPE;
932 break;
933 case TABLE:
934 NEEDBITS(14);
935 state->nlen = BITS(5) + 257;
936 DROPBITS(5);
937 state->ndist = BITS(5) + 1;
938 DROPBITS(5);
939 state->ncode = BITS(4) + 4;
940 DROPBITS(4);
941#ifndef PKZIP_BUG_WORKAROUND
942 if (state->nlen > 286 || state->ndist > 30) {
943 strm->msg = (char *)"too many length or distance symbols";
944 state->mode = BAD;
945 break;
946 }
947#endif
948 Tracev((stderr, "inflate: table sizes ok\n"));
949 state->have = 0;
950 state->mode = LENLENS;
951 /* fallthrough */
952 case LENLENS:
953 while (state->have < state->ncode) {
954 NEEDBITS(3);
955 state->lens[order[state->have++]] = (unsigned short)BITS(3);
956 DROPBITS(3);
957 }
958 while (state->have < 19)
959 state->lens[order[state->have++]] = 0;
960 state->next = state->codes;
961 state->lencode = (const code FAR *)(state->next);
962 state->lenbits = 7;
963 ret = inflate_table(CODES, state->lens, 19, &(state->next),
964 &(state->lenbits), state->work);
965 if (ret) {
966 strm->msg = (char *)"invalid code lengths set";
967 state->mode = BAD;
968 break;
969 }
970 Tracev((stderr, "inflate: code lengths ok\n"));
971 state->have = 0;
972 state->mode = CODELENS;
973 /* fallthrough */
974 case CODELENS:
975 while (state->have < state->nlen + state->ndist) {
976 for (;;) {
977 here = state->lencode[BITS(state->lenbits)];
978 if ((unsigned)(here.bits) <= bits) break;
979 PULLBYTE();
980 }
981 if (here.val < 16) {
982 DROPBITS(here.bits);
983 state->lens[state->have++] = here.val;
984 }
985 else {
986 if (here.val == 16) {
987 NEEDBITS(here.bits + 2);
988 DROPBITS(here.bits);
989 if (state->have == 0) {
990 strm->msg = (char *)"invalid bit length repeat";
991 state->mode = BAD;
992 break;
993 }
994 len = state->lens[state->have - 1];
995 copy = 3 + BITS(2);
996 DROPBITS(2);
997 }
998 else if (here.val == 17) {
999 NEEDBITS(here.bits + 3);
1000 DROPBITS(here.bits);
1001 len = 0;
1002 copy = 3 + BITS(3);
1003 DROPBITS(3);
1004 }
1005 else {
1006 NEEDBITS(here.bits + 7);
1007 DROPBITS(here.bits);
1008 len = 0;
1009 copy = 11 + BITS(7);
1010 DROPBITS(7);
1011 }
1012 if (state->have + copy > state->nlen + state->ndist) {
1013 strm->msg = (char *)"invalid bit length repeat";
1014 state->mode = BAD;
1015 break;
1016 }
1017 while (copy--)
1018 state->lens[state->have++] = (unsigned short)len;
1019 }
1020 }
1021
1022 /* handle error breaks in while */
1023 if (state->mode == BAD) break;
1024
1025 /* check for end-of-block code (better have one) */
1026 if (state->lens[256] == 0) {
1027 strm->msg = (char *)"invalid code -- missing end-of-block";
1028 state->mode = BAD;
1029 break;
1030 }
1031
1032 /* build code tables -- note: do not change the lenbits or distbits
1033 values here (9 and 6) without reading the comments in inftrees.h
1034 concerning the ENOUGH constants, which depend on those values */
1035 state->next = state->codes;
1036 state->lencode = (const code FAR *)(state->next);
1037 state->lenbits = 9;
1038 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1039 &(state->lenbits), state->work);
1040 if (ret) {
1041 strm->msg = (char *)"invalid literal/lengths set";
1042 state->mode = BAD;
1043 break;
1044 }
1045 state->distcode = (const code FAR *)(state->next);
1046 state->distbits = 6;
1047 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1048 &(state->next), &(state->distbits), state->work);
1049 if (ret) {
1050 strm->msg = (char *)"invalid distances set";
1051 state->mode = BAD;
1052 break;
1053 }
1054 Tracev((stderr, "inflate: codes ok\n"));
1055 state->mode = LEN_;
1056 if (flush == Z_TREES) goto inf_leave;
1057 /* fallthrough */
1058 case LEN_:
1059 state->mode = LEN;
1060 /* fallthrough */
1061 case LEN:
1062 if (have >= 6 && left >= 258) {
1063 RESTORE();
1064 inflate_fast(strm, out);
1065 LOAD();
1066 if (state->mode == TYPE)
1067 state->back = -1;
1068 break;
1069 }
1070 state->back = 0;
1071 for (;;) {
1072 here = state->lencode[BITS(state->lenbits)];
1073 if ((unsigned)(here.bits) <= bits) break;
1074 PULLBYTE();
1075 }
1076 if (here.op && (here.op & 0xf0) == 0) {
1077 last = here;
1078 for (;;) {
1079 here = state->lencode[last.val +
1080 (BITS(last.bits + last.op) >> last.bits)];
1081 if ((unsigned)(last.bits + here.bits) <= bits) break;
1082 PULLBYTE();
1083 }
1084 DROPBITS(last.bits);
1085 state->back += last.bits;
1086 }
1087 DROPBITS(here.bits);
1088 state->back += here.bits;
1089 state->length = (unsigned)here.val;
1090 if ((int)(here.op) == 0) {
1091 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1092 "inflate: literal '%c'\n" :
1093 "inflate: literal 0x%02x\n", here.val));
1094 state->mode = LIT;
1095 break;
1096 }
1097 if (here.op & 32) {
1098 Tracevv((stderr, "inflate: end of block\n"));
1099 state->back = -1;
1100 state->mode = TYPE;
1101 break;
1102 }
1103 if (here.op & 64) {
1104 strm->msg = (char *)"invalid literal/length code";
1105 state->mode = BAD;
1106 break;
1107 }
1108 state->extra = (unsigned)(here.op) & 15;
1109 state->mode = LENEXT;
1110 /* fallthrough */
1111 case LENEXT:
1112 if (state->extra) {
1113 NEEDBITS(state->extra);
1114 state->length += BITS(state->extra);
1115 DROPBITS(state->extra);
1116 state->back += state->extra;
1117 }
1118 Tracevv((stderr, "inflate: length %u\n", state->length));
1119 state->was = state->length;
1120 state->mode = DIST;
1121 /* fallthrough */
1122 case DIST:
1123 for (;;) {
1124 here = state->distcode[BITS(state->distbits)];
1125 if ((unsigned)(here.bits) <= bits) break;
1126 PULLBYTE();
1127 }
1128 if ((here.op & 0xf0) == 0) {
1129 last = here;
1130 for (;;) {
1131 here = state->distcode[last.val +
1132 (BITS(last.bits + last.op) >> last.bits)];
1133 if ((unsigned)(last.bits + here.bits) <= bits) break;
1134 PULLBYTE();
1135 }
1136 DROPBITS(last.bits);
1137 state->back += last.bits;
1138 }
1139 DROPBITS(here.bits);
1140 state->back += here.bits;
1141 if (here.op & 64) {
1142 strm->msg = (char *)"invalid distance code";
1143 state->mode = BAD;
1144 break;
1145 }
1146 state->offset = (unsigned)here.val;
1147 state->extra = (unsigned)(here.op) & 15;
1148 state->mode = DISTEXT;
1149 /* fallthrough */
1150 case DISTEXT:
1151 if (state->extra) {
1152 NEEDBITS(state->extra);
1153 state->offset += BITS(state->extra);
1154 DROPBITS(state->extra);
1155 state->back += state->extra;
1156 }
1157#ifdef INFLATE_STRICT
1158 if (state->offset > state->dmax) {
1159 strm->msg = (char *)"invalid distance too far back";
1160 state->mode = BAD;
1161 break;
1162 }
1163#endif
1164 Tracevv((stderr, "inflate: distance %u\n", state->offset));
1165 state->mode = MATCH;
1166 /* fallthrough */
1167 case MATCH:
1168 if (left == 0) goto inf_leave;
1169 copy = out - left;
1170 if (state->offset > copy) { /* copy from window */
1171 copy = state->offset - copy;
1172 if (copy > state->whave) {
1173 if (state->sane) {
1174 strm->msg = (char *)"invalid distance too far back";
1175 state->mode = BAD;
1176 break;
1177 }
1178#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1179 Trace((stderr, "inflate.c too far\n"));
1180 copy -= state->whave;
1181 if (copy > state->length) copy = state->length;
1182 if (copy > left) copy = left;
1183 left -= copy;
1184 state->length -= copy;
1185 do {
1186 *put++ = 0;
1187 } while (--copy);
1188 if (state->length == 0) state->mode = LEN;
1189 break;
1190#endif
1191 }
1192 if (copy > state->wnext) {
1193 copy -= state->wnext;
1194 from = state->window + (state->wsize - copy);
1195 }
1196 else
1197 from = state->window + (state->wnext - copy);
1198 if (copy > state->length) copy = state->length;
1199 }
1200 else { /* copy from output */
1201 from = put - state->offset;
1202 copy = state->length;
1203 }
1204 if (copy > left) copy = left;
1205 left -= copy;
1206 state->length -= copy;
1207 do {
1208 *put++ = *from++;
1209 } while (--copy);
1210 if (state->length == 0) state->mode = LEN;
1211 break;
1212 case LIT:
1213 if (left == 0) goto inf_leave;
1214 *put++ = (unsigned char)(state->length);
1215 left--;
1216 state->mode = LEN;
1217 break;
1218 case CHECK:
1219 if (state->wrap) {
1220 NEEDBITS(32);
1221 out -= left;
1222 strm->total_out += out;
1223 state->total += out;
1224 if ((state->wrap & 4) && out)
1225 strm->adler = state->check =
1226 UPDATE_CHECK(state->check, put - out, out);
1227 out = left;
1228 if ((state->wrap & 4) && (
1229#ifdef GUNZIP
1230 state->flags ? hold :
1231#endif
1232 ZSWAP32(hold)) != state->check) {
1233 strm->msg = (char *)"incorrect data check";
1234 state->mode = BAD;
1235 break;
1236 }
1237 INITBITS();
1238 Tracev((stderr, "inflate: check matches trailer\n"));
1239 }
1240#ifdef GUNZIP
1241 state->mode = LENGTH;
1242 /* fallthrough */
1243 case LENGTH:
1244 if (state->wrap && state->flags) {
1245 NEEDBITS(32);
1246 if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
1247 strm->msg = (char *)"incorrect length check";
1248 state->mode = BAD;
1249 break;
1250 }
1251 INITBITS();
1252 Tracev((stderr, "inflate: length matches trailer\n"));
1253 }
1254#endif
1255 state->mode = DONE;
1256 /* fallthrough */
1257 case DONE:
1258 ret = Z_STREAM_END;
1259 goto inf_leave;
1260 case BAD:
1261 ret = Z_DATA_ERROR;
1262 goto inf_leave;
1263 case MEM:
1264 return Z_MEM_ERROR;
1265 case SYNC:
1266 /* fallthrough */
1267 default:
1268 return Z_STREAM_ERROR;
1269 }
1270
1271 /*
1272 Return from inflate(), updating the total counts and the check value.
1273 If there was no progress during the inflate() call, return a buffer
1274 error. Call updatewindow() to create and/or update the window state.
1275 Note: a memory error from inflate() is non-recoverable.
1276 */
1277 inf_leave:
1278 RESTORE();
1279 if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1280 (state->mode < CHECK || flush != Z_FINISH)))
1281 if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
1282 state->mode = MEM;
1283 return Z_MEM_ERROR;
1284 }
1285 in -= strm->avail_in;
1286 out -= strm->avail_out;
1287 strm->total_in += in;
1288 strm->total_out += out;
1289 state->total += out;
1290 if ((state->wrap & 4) && out)
1291 strm->adler = state->check =
1292 UPDATE_CHECK(state->check, strm->next_out - out, out);
1293 strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1294 (state->mode == TYPE ? 128 : 0) +
1295 (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1296 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1297 ret = Z_BUF_ERROR;
1298 return ret;
1299}
uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len)
Definition: adler32.c:133
unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, uInt len)
Definition: crc32.c:1062
#define COPY
Definition: gzguts.h:166
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start)
Definition: inffast.c:50
#define LOAD()
Definition: inflate.c:477
void fixedtables(struct inflate_state FAR *state)
Definition: inflate.c:279
#define INITBITS()
Definition: inflate.c:499
#define BITS(n)
Definition: inflate.c:524
#define DROPBITS(n)
Definition: inflate.c:528
int inflateStateCheck(z_streamp strm)
Definition: inflate.c:105
#define BYTEBITS()
Definition: inflate.c:535
#define NEEDBITS(n)
Definition: inflate.c:517
int updatewindow(z_streamp strm, const Bytef *end, unsigned copy)
Definition: inflate.c:397
#define PULLBYTE()
Definition: inflate.c:507
#define UPDATE_CHECK(check, buf, len)
Definition: inflate.c:454
#define RESTORE()
Definition: inflate.c:488
@ HEAD
Definition: inflate.h:21
@ MATCH
Definition: inflate.h:45
@ DICT
Definition: inflate.h:31
@ TABLE
Definition: inflate.h:37
@ LENGTH
Definition: inflate.h:48
@ FLAGS
Definition: inflate.h:22
@ LIT
Definition: inflate.h:46
@ SYNC
Definition: inflate.h:52
@ OS
Definition: inflate.h:24
@ EXLEN
Definition: inflate.h:25
@ MEM
Definition: inflate.h:51
@ NAME
Definition: inflate.h:27
@ STORED
Definition: inflate.h:34
@ CODELENS
Definition: inflate.h:39
@ DICTID
Definition: inflate.h:30
@ DONE
Definition: inflate.h:49
@ TYPEDO
Definition: inflate.h:33
@ COMMENT
Definition: inflate.h:28
@ LENLENS
Definition: inflate.h:38
@ TYPE
Definition: inflate.h:32
@ LEN_
Definition: inflate.h:40
@ COPY_
Definition: inflate.h:35
@ DIST
Definition: inflate.h:43
@ LENEXT
Definition: inflate.h:42
@ HCRC
Definition: inflate.h:29
@ TIME
Definition: inflate.h:23
@ CHECK
Definition: inflate.h:47
@ DISTEXT
Definition: inflate.h:44
@ BAD
Definition: inflate.h:50
@ LEN
Definition: inflate.h:41
@ EXTRA
Definition: inflate.h:26
#define GUNZIP
Definition: inflate.h:16
@ CODES
Definition: inftrees.h:55
void copy(G4double dst[], const G4double src[], std::size_t size=G4FieldTrack::ncompSVEC)
Definition: G4FieldUtils.cc:98
unsigned char op
Definition: inftrees.h:25
unsigned char bits
Definition: inftrees.h:26
unsigned short val
Definition: inftrees.h:27
unsigned was
Definition: inflate.h:125
code const FAR * distcode
Definition: inflate.h:111
unsigned wnext
Definition: inflate.h:99
int havedict
Definition: inflate.h:88
unsigned lenbits
Definition: inflate.h:112
unsigned ndist
Definition: inflate.h:117
code const FAR * lencode
Definition: inflate.h:110
unsigned nlen
Definition: inflate.h:116
unsigned have
Definition: inflate.h:118
unsigned length
Definition: inflate.h:105
unsigned long hold
Definition: inflate.h:102
unsigned extra
Definition: inflate.h:108
unsigned ncode
Definition: inflate.h:115
z_streamp strm
Definition: inflate.h:83
unsigned whave
Definition: inflate.h:98
unsigned wbits
Definition: inflate.h:96
unsigned short work[288]
Definition: inflate.h:121
code FAR * next
Definition: inflate.h:119
unsigned distbits
Definition: inflate.h:113
inflate_mode mode
Definition: inflate.h:84
unsigned char FAR * window
Definition: inflate.h:100
unsigned short lens[320]
Definition: inflate.h:120
gz_headerp head
Definition: inflate.h:94
unsigned bits
Definition: inflate.h:103
unsigned wsize
Definition: inflate.h:97
unsigned dmax
Definition: inflate.h:91
unsigned long check
Definition: inflate.h:92
unsigned offset
Definition: inflate.h:106
code codes[ENOUGH]
Definition: inflate.h:122
unsigned long total
Definition: inflate.h:93
#define Z_TREES
Definition: zlib.h:174
#define Z_DEFLATED
Definition: zlib.h:209
#define Z_NEED_DICT
Definition: zlib.h:179
#define Z_BUF_ERROR
Definition: zlib.h:184
#define Z_BLOCK
Definition: zlib.h:173
#define Z_STREAM_END
Definition: zlib.h:178
#define Z_FINISH
Definition: zlib.h:172
#define Z_OK
Definition: zlib.h:177
#define Z_DATA_ERROR
Definition: zlib.h:182
#define Z_STREAM_ERROR
Definition: zlib.h:181
#define Z_NULL
Definition: zlib.h:212
#define Z_MEM_ERROR
Definition: zlib.h:183
void ZLIB_INTERNAL zmemcpy(Bytef *dest, const Bytef *source, uInt len)
Definition: zutil.c:148
#define Tracev(x)
Definition: zutil.h:252
#define Trace(x)
Definition: zutil.h:251
#define ZSWAP32(q)
Definition: zutil.h:270
#define Tracevv(x)
Definition: zutil.h:253

Referenced by gz_decomp(), and uncompress2().

◆ inflateCodesUsed()

unsigned long ZEXPORT inflateCodesUsed ( z_streamp  strm)

Definition at line 1585 of file inflate.c.

1587{
1588 struct inflate_state FAR *state;
1589 if (inflateStateCheck(strm)) return (unsigned long)-1;
1590 state = (struct inflate_state FAR *)strm->state;
1591 return (unsigned long)(state->next - state->codes);
1592}

◆ inflateCopy()

int ZEXPORT inflateCopy ( z_streamp  dest,
z_streamp  source 
)

Definition at line 1492 of file inflate.c.

1495{
1496 struct inflate_state FAR *state;
1497 struct inflate_state FAR *copy;
1498 unsigned char FAR *window;
1499 unsigned wsize;
1500
1501 /* check input */
1502 if (inflateStateCheck(source) || dest == Z_NULL)
1503 return Z_STREAM_ERROR;
1504 state = (struct inflate_state FAR *)source->state;
1505
1506 /* allocate space */
1507 copy = (struct inflate_state FAR *)
1508 ZALLOC(source, 1, sizeof(struct inflate_state));
1509 if (copy == Z_NULL) return Z_MEM_ERROR;
1510 window = Z_NULL;
1511 if (state->window != Z_NULL) {
1512 window = (unsigned char FAR *)
1513 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1514 if (window == Z_NULL) {
1515 ZFREE(source, copy);
1516 return Z_MEM_ERROR;
1517 }
1518 }
1519
1520 /* copy state */
1521 zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1522 zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
1523 copy->strm = dest;
1524 if (state->lencode >= state->codes &&
1525 state->lencode <= state->codes + ENOUGH - 1) {
1526 copy->lencode = copy->codes + (state->lencode - state->codes);
1527 copy->distcode = copy->codes + (state->distcode - state->codes);
1528 }
1529 copy->next = copy->codes + (state->next - state->codes);
1530 if (window != Z_NULL) {
1531 wsize = 1U << state->wbits;
1532 zmemcpy(window, state->window, wsize);
1533 }
1534 copy->window = window;
1535 dest->state = (struct internal_state FAR *)copy;
1536 return Z_OK;
1537}
#define ENOUGH
Definition: inftrees.h:51
#define ZALLOC(strm, items, size)
Definition: zutil.h:264
#define ZFREE(strm, addr)
Definition: zutil.h:266

◆ inflateEnd()

int ZEXPORT inflateEnd ( z_streamp  strm)

Definition at line 1301 of file inflate.c.

1303{
1304 struct inflate_state FAR *state;
1306 return Z_STREAM_ERROR;
1307 state = (struct inflate_state FAR *)strm->state;
1308 if (state->window != Z_NULL) ZFREE(strm, state->window);
1309 ZFREE(strm, strm->state);
1310 strm->state = Z_NULL;
1311 Tracev((stderr, "inflate: end\n"));
1312 return Z_OK;
1313}

Referenced by gzclose_r(), and uncompress2().

◆ inflateGetDictionary()

int ZEXPORT inflateGetDictionary ( z_streamp  strm,
Bytef *  dictionary,
uInt *  dictLength 
)

Definition at line 1315 of file inflate.c.

1319{
1320 struct inflate_state FAR *state;
1321
1322 /* check state */
1324 state = (struct inflate_state FAR *)strm->state;
1325
1326 /* copy dictionary */
1327 if (state->whave && dictionary != Z_NULL) {
1328 zmemcpy(dictionary, state->window + state->wnext,
1329 state->whave - state->wnext);
1330 zmemcpy(dictionary + state->whave - state->wnext,
1331 state->window, state->wnext);
1332 }
1333 if (dictLength != Z_NULL)
1334 *dictLength = state->whave;
1335 return Z_OK;
1336}

◆ inflateGetHeader()

int ZEXPORT inflateGetHeader ( z_streamp  strm,
gz_headerp  head 
)

Definition at line 1373 of file inflate.c.

1376{
1377 struct inflate_state FAR *state;
1378
1379 /* check state */
1381 state = (struct inflate_state FAR *)strm->state;
1382 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1383
1384 /* save header structure */
1385 state->head = head;
1386 head->done = 0;
1387 return Z_OK;
1388}

◆ inflateInit2_()

int ZEXPORT inflateInit2_ ( z_streamp  strm,
int  windowBits,
const char *  version,
int  stream_size 
)

Definition at line 196 of file inflate.c.

201{
202 int ret;
203 struct inflate_state FAR *state;
204
205 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
206 stream_size != (int)(sizeof(z_stream)))
207 return Z_VERSION_ERROR;
208 if (strm == Z_NULL) return Z_STREAM_ERROR;
209 strm->msg = Z_NULL; /* in case we return an error */
210 if (strm->zalloc == (alloc_func)0) {
211#ifdef Z_SOLO
212 return Z_STREAM_ERROR;
213#else
214 strm->zalloc = zcalloc;
215 strm->opaque = (voidpf)0;
216#endif
217 }
218 if (strm->zfree == (free_func)0)
219#ifdef Z_SOLO
220 return Z_STREAM_ERROR;
221#else
222 strm->zfree = zcfree;
223#endif
224 state = (struct inflate_state FAR *)
225 ZALLOC(strm, 1, sizeof(struct inflate_state));
226 if (state == Z_NULL) return Z_MEM_ERROR;
227 Tracev((stderr, "inflate: allocated\n"));
228 strm->state = (struct internal_state FAR *)state;
229 state->strm = strm;
230 state->window = Z_NULL;
231 state->mode = HEAD; /* to pass state test in inflateReset2() */
232 ret = inflateReset2(strm, windowBits);
233 if (ret != Z_OK) {
234 ZFREE(strm, state);
235 strm->state = Z_NULL;
236 }
237 return ret;
238}
int ZEXPORT inflateReset2(z_streamp strm, int windowBits)
Definition: inflate.c:158
z_streamp strm
Definition: deflate.h:100
#define ZLIB_VERSION
Definition: zlib.h:40
#define Z_VERSION_ERROR
Definition: zlib.h:185
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
Definition: zutil.c:314
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
Definition: zutil.c:304

Referenced by inflateInit_().

◆ inflateInit_()

int ZEXPORT inflateInit_ ( z_streamp  strm,
const char *  version,
int  stream_size 
)

Definition at line 240 of file inflate.c.

244{
245 return inflateInit2_(strm, DEF_WBITS, version, stream_size);
246}
int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version, int stream_size)
Definition: inflate.c:196
#define DEF_WBITS
Definition: zutil.h:67

◆ inflateMark()

long ZEXPORT inflateMark ( z_streamp  strm)

Definition at line 1572 of file inflate.c.

1574{
1575 struct inflate_state FAR *state;
1576
1578 return -(1L << 16);
1579 state = (struct inflate_state FAR *)strm->state;
1580 return (long)(((unsigned long)((long)state->back)) << 16) +
1581 (state->mode == COPY ? state->length :
1582 (state->mode == MATCH ? state->was - state->length : 0));
1583}

◆ inflatePrime()

int ZEXPORT inflatePrime ( z_streamp  strm,
int  bits,
int  value 
)

Definition at line 248 of file inflate.c.

252{
253 struct inflate_state FAR *state;
254
256 state = (struct inflate_state FAR *)strm->state;
257 if (bits < 0) {
258 state->hold = 0;
259 state->bits = 0;
260 return Z_OK;
261 }
262 if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR;
263 value &= (1L << bits) - 1;
264 state->hold += (unsigned)value << state->bits;
265 state->bits += (uInt)bits;
266 return Z_OK;
267}

◆ inflateReset()

int ZEXPORT inflateReset ( z_streamp  strm)

Definition at line 145 of file inflate.c.

147{
148 struct inflate_state FAR *state;
149
151 state = (struct inflate_state FAR *)strm->state;
152 state->wsize = 0;
153 state->whave = 0;
154 state->wnext = 0;
155 return inflateResetKeep(strm);
156}
int ZEXPORT inflateResetKeep(z_streamp strm)
Definition: inflate.c:119

Referenced by gz_look(), inflateReset2(), and inflateSync().

◆ inflateReset2()

int ZEXPORT inflateReset2 ( z_streamp  strm,
int  windowBits 
)

Definition at line 158 of file inflate.c.

161{
162 int wrap;
163 struct inflate_state FAR *state;
164
165 /* get the state */
167 state = (struct inflate_state FAR *)strm->state;
168
169 /* extract wrap request from windowBits parameter */
170 if (windowBits < 0) {
171 wrap = 0;
172 windowBits = -windowBits;
173 }
174 else {
175 wrap = (windowBits >> 4) + 5;
176#ifdef GUNZIP
177 if (windowBits < 48)
178 windowBits &= 15;
179#endif
180 }
181
182 /* set number of window bits, free window if different */
183 if (windowBits && (windowBits < 8 || windowBits > 15))
184 return Z_STREAM_ERROR;
185 if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
186 ZFREE(strm, state->window);
187 state->window = Z_NULL;
188 }
189
190 /* update state and reset the rest of it */
191 state->wrap = wrap;
192 state->wbits = (unsigned)windowBits;
193 return inflateReset(strm);
194}
int ZEXPORT inflateReset(z_streamp strm)
Definition: inflate.c:145

Referenced by inflateInit2_().

◆ inflateResetKeep()

int ZEXPORT inflateResetKeep ( z_streamp  strm)

Definition at line 119 of file inflate.c.

121{
122 struct inflate_state FAR *state;
123
125 state = (struct inflate_state FAR *)strm->state;
126 strm->total_in = strm->total_out = state->total = 0;
127 strm->msg = Z_NULL;
128 if (state->wrap) /* to support ill-conceived Java test suite */
129 strm->adler = state->wrap & 1;
130 state->mode = HEAD;
131 state->last = 0;
132 state->havedict = 0;
133 state->flags = -1;
134 state->dmax = 32768U;
135 state->head = Z_NULL;
136 state->hold = 0;
137 state->bits = 0;
138 state->lencode = state->distcode = state->next = state->codes;
139 state->sane = 1;
140 state->back = -1;
141 Tracev((stderr, "inflate: reset\n"));
142 return Z_OK;
143}

Referenced by inflateReset().

◆ inflateSetDictionary()

int ZEXPORT inflateSetDictionary ( z_streamp  strm,
const Bytef *  dictionary,
uInt  dictLength 
)

Definition at line 1338 of file inflate.c.

1342{
1343 struct inflate_state FAR *state;
1344 unsigned long dictid;
1345 int ret;
1346
1347 /* check state */
1349 state = (struct inflate_state FAR *)strm->state;
1350 if (state->wrap != 0 && state->mode != DICT)
1351 return Z_STREAM_ERROR;
1352
1353 /* check for correct dictionary identifier */
1354 if (state->mode == DICT) {
1355 dictid = adler32(0L, Z_NULL, 0);
1356 dictid = adler32(dictid, dictionary, dictLength);
1357 if (dictid != state->check)
1358 return Z_DATA_ERROR;
1359 }
1360
1361 /* copy dictionary to window using updatewindow(), which will amend the
1362 existing dictionary if appropriate */
1363 ret = updatewindow(strm, dictionary + dictLength, dictLength);
1364 if (ret) {
1365 state->mode = MEM;
1366 return Z_MEM_ERROR;
1367 }
1368 state->havedict = 1;
1369 Tracev((stderr, "inflate: dictionary set\n"));
1370 return Z_OK;
1371}

◆ inflateStateCheck()

int inflateStateCheck ( z_streamp  strm)

Definition at line 105 of file inflate.c.

107{
108 struct inflate_state FAR *state;
109 if (strm == Z_NULL ||
110 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
111 return 1;
112 state = (struct inflate_state FAR *)strm->state;
113 if (state == Z_NULL || state->strm != strm ||
114 state->mode < HEAD || state->mode > SYNC)
115 return 1;
116 return 0;
117}

Referenced by inflate(), inflateCodesUsed(), inflateCopy(), inflateEnd(), inflateGetDictionary(), inflateGetHeader(), inflateMark(), inflatePrime(), inflateReset(), inflateReset2(), inflateResetKeep(), inflateSetDictionary(), inflateSync(), inflateSyncPoint(), inflateUndermine(), and inflateValidate().

◆ inflateSync()

int ZEXPORT inflateSync ( z_streamp  strm)

Definition at line 1424 of file inflate.c.

1426{
1427 unsigned len; /* number of bytes to look at or looked at */
1428 int flags; /* temporary to save header status */
1429 unsigned long in, out; /* temporary to save total_in and total_out */
1430 unsigned char buf[4]; /* to restore bit buffer to byte string */
1431 struct inflate_state FAR *state;
1432
1433 /* check parameters */
1435 state = (struct inflate_state FAR *)strm->state;
1436 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1437
1438 /* if first time, start search in bit buffer */
1439 if (state->mode != SYNC) {
1440 state->mode = SYNC;
1441 state->hold <<= state->bits & 7;
1442 state->bits -= state->bits & 7;
1443 len = 0;
1444 while (state->bits >= 8) {
1445 buf[len++] = (unsigned char)(state->hold);
1446 state->hold >>= 8;
1447 state->bits -= 8;
1448 }
1449 state->have = 0;
1450 syncsearch(&(state->have), buf, len);
1451 }
1452
1453 /* search available input */
1454 len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1455 strm->avail_in -= len;
1456 strm->next_in += len;
1457 strm->total_in += len;
1458
1459 /* return no joy or set up to restart inflate() on a new block */
1460 if (state->have != 4) return Z_DATA_ERROR;
1461 if (state->flags == -1)
1462 state->wrap = 0; /* if no header yet, treat as raw */
1463 else
1464 state->wrap &= ~4; /* no point in computing a check value now */
1465 flags = state->flags;
1466 in = strm->total_in; out = strm->total_out;
1468 strm->total_in = in; strm->total_out = out;
1469 state->flags = flags;
1470 state->mode = TYPE;
1471 return Z_OK;
1472}
unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, unsigned len)
Definition: inflate.c:1401

◆ inflateSyncPoint()

int ZEXPORT inflateSyncPoint ( z_streamp  strm)

Definition at line 1482 of file inflate.c.

1484{
1485 struct inflate_state FAR *state;
1486
1488 state = (struct inflate_state FAR *)strm->state;
1489 return state->mode == STORED && state->bits == 0;
1490}

◆ inflateUndermine()

int ZEXPORT inflateUndermine ( z_streamp  strm,
int  subvert 
)

Definition at line 1539 of file inflate.c.

1542{
1543 struct inflate_state FAR *state;
1544
1546 state = (struct inflate_state FAR *)strm->state;
1547#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1548 state->sane = !subvert;
1549 return Z_OK;
1550#else
1551 (void)subvert;
1552 state->sane = 1;
1553 return Z_DATA_ERROR;
1554#endif
1555}

◆ inflateValidate()

int ZEXPORT inflateValidate ( z_streamp  strm,
int  check 
)

Definition at line 1557 of file inflate.c.

1560{
1561 struct inflate_state FAR *state;
1562
1564 state = (struct inflate_state FAR *)strm->state;
1565 if (check && state->wrap)
1566 state->wrap |= 4;
1567 else
1568 state->wrap &= ~4;
1569 return Z_OK;
1570}

◆ OF() [1/4]

void fixedtables OF ( (struct inflate_state FAR *state)  )

◆ OF() [2/4]

unsigned syncsearch OF ( (unsigned FAR *have, const unsigned char FAR *buf, unsigned len)  )

◆ OF() [3/4]

int inflateStateCheck OF ( (z_streamp strm)  )

◆ OF() [4/4]

int updatewindow OF ( (z_streamp strm, const unsigned char FAR *end, unsigned copy)  )

◆ syncsearch()

unsigned syncsearch ( unsigned FAR *  have,
const unsigned char FAR *  buf,
unsigned  len 
)

Definition at line 1401 of file inflate.c.

1405{
1406 unsigned got;
1407 unsigned next;
1408
1409 got = *have;
1410 next = 0;
1411 while (next < len && got < 4) {
1412 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1413 got++;
1414 else if (buf[next])
1415 got = 0;
1416 else
1417 got = 4 - got;
1418 next++;
1419 }
1420 *have = got;
1421 return next;
1422}

Referenced by inflateSync().

◆ updatewindow()

int updatewindow ( z_streamp  strm,
const Bytef *  end,
unsigned  copy 
)

Definition at line 397 of file inflate.c.

401{
402 struct inflate_state FAR *state;
403 unsigned dist;
404
405 state = (struct inflate_state FAR *)strm->state;
406
407 /* if it hasn't been done already, allocate space for the window */
408 if (state->window == Z_NULL) {
409 state->window = (unsigned char FAR *)
410 ZALLOC(strm, 1U << state->wbits,
411 sizeof(unsigned char));
412 if (state->window == Z_NULL) return 1;
413 }
414
415 /* if window not in use yet, initialize */
416 if (state->wsize == 0) {
417 state->wsize = 1U << state->wbits;
418 state->wnext = 0;
419 state->whave = 0;
420 }
421
422 /* copy state->wsize or less output bytes into the circular window */
423 if (copy >= state->wsize) {
424 zmemcpy(state->window, end - state->wsize, state->wsize);
425 state->wnext = 0;
426 state->whave = state->wsize;
427 }
428 else {
429 dist = state->wsize - state->wnext;
430 if (dist > copy) dist = copy;
431 zmemcpy(state->window + state->wnext, end - copy, dist);
432 copy -= dist;
433 if (copy) {
434 zmemcpy(state->window, end - copy, copy);
435 state->wnext = copy;
436 state->whave = state->wsize;
437 }
438 else {
439 state->wnext += dist;
440 if (state->wnext == state->wsize) state->wnext = 0;
441 if (state->whave < state->wsize) state->whave += dist;
442 }
443 }
444 return 0;
445}

Referenced by inflate(), and inflateSetDictionary().