94local
int inflateStateCheck(z_streamp strm) {
97 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
100 if (state == Z_NULL || state->strm != strm ||
101 state->mode < HEAD || state->mode > SYNC)
106int ZEXPORT inflateResetKeep(z_streamp strm) {
109 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
111 strm->total_in = strm->total_out = state->total = 0;
114 strm->adler = state->wrap & 1;
119 state->dmax = 32768U;
120 state->head = Z_NULL;
123 state->lencode = state->distcode = state->next = state->codes;
126 Tracev((stderr,
"inflate: reset\n"));
130int ZEXPORT inflateReset(z_streamp strm) {
133 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
138 return inflateResetKeep(strm);
141int ZEXPORT inflateReset2(z_streamp strm,
int windowBits) {
146 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
150 if (windowBits < 0) {
151 if (windowBits < -15)
152 return Z_STREAM_ERROR;
154 windowBits = -windowBits;
157 wrap = (windowBits >> 4) + 5;
165 if (windowBits && (windowBits < 8 || windowBits > 15))
166 return Z_STREAM_ERROR;
167 if (state->window != Z_NULL && state->wbits != (
unsigned)windowBits) {
168 ZFREE(strm, state->window);
169 state->window = Z_NULL;
174 state->wbits = (unsigned)windowBits;
175 return inflateReset(strm);
178int ZEXPORT inflateInit2_(z_streamp strm,
int windowBits,
179 const char *version,
int stream_size) {
183 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
184 stream_size != (
int)(
sizeof(z_stream)))
185 return Z_VERSION_ERROR;
186 if (strm == Z_NULL)
return Z_STREAM_ERROR;
188 if (strm->zalloc == (alloc_func)0) {
190 return Z_STREAM_ERROR;
192 strm->zalloc = zcalloc;
193 strm->opaque = (voidpf)0;
196 if (strm->zfree == (free_func)0)
198 return Z_STREAM_ERROR;
200 strm->zfree = zcfree;
204 if (state == Z_NULL)
return Z_MEM_ERROR;
205 Tracev((stderr,
"inflate: allocated\n"));
208 state->window = Z_NULL;
210 ret = inflateReset2(strm, windowBits);
213 strm->state = Z_NULL;
218int ZEXPORT inflateInit_(z_streamp strm,
const char *version,
220 return inflateInit2_(strm, DEF_WBITS, version, stream_size);
223int ZEXPORT inflatePrime(z_streamp strm,
int bits,
int value) {
226 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
235 if (bits > 16 || state->bits + (uInt)bits > 32)
return Z_STREAM_ERROR;
236 value &= (1L << bits) - 1;
237 state->hold += (unsigned)value << state->bits;
238 state->bits += (uInt)bits;
254 static int virgin = 1;
255 static code *lenfix, *distfix;
256 static code fixed[544];
265 while (sym < 144) state->lens[sym++] = 8;
266 while (sym < 256) state->lens[sym++] = 9;
267 while (sym < 280) state->lens[sym++] = 7;
268 while (sym < 288) state->lens[sym++] = 8;
272 inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
276 while (sym < 32) state->lens[sym++] = 5;
279 inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
287 state->lencode = lenfix;
289 state->distcode = distfix;
320 puts(
" /* inffixed.h -- table for decoding fixed codes");
321 puts(
" * Generated automatically by makefixed().");
324 puts(
" /* WARNING: this file should *not* be used by applications.");
325 puts(
" It is part of the implementation of this library and is");
326 puts(
" subject to change. Applications should only use zlib.h.");
330 printf(
" static const code lenfix[%u] = {", size);
333 if ((low % 7) == 0) printf(
"\n ");
334 printf(
"{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
335 state.lencode[low].bits, state.lencode[low].val);
336 if (++low == size)
break;
341 printf(
"\n static const code distfix[%u] = {", size);
344 if ((low % 6) == 0) printf(
"\n ");
345 printf(
"{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
346 state.distcode[low].val);
347 if (++low == size)
break;
368local
int updatewindow(z_streamp strm,
const Bytef *end,
unsigned copy) {
375 if (state->window == Z_NULL) {
376 state->window = (
unsigned char FAR *)
377 ZALLOC(strm, 1U << state->wbits,
378 sizeof(
unsigned char));
379 if (state->window == Z_NULL)
return 1;
383 if (state->wsize == 0) {
384 state->wsize = 1U << state->wbits;
390 if (copy >= state->wsize) {
391 zmemcpy(state->window, end - state->wsize, state->wsize);
393 state->whave = state->wsize;
396 dist = state->wsize - state->wnext;
397 if (dist > copy) dist = copy;
398 zmemcpy(state->window + state->wnext, end - copy, dist);
401 zmemcpy(state->window, end - copy, copy);
403 state->whave = state->wsize;
406 state->wnext += dist;
407 if (state->wnext == state->wsize) state->wnext = 0;
408 if (state->whave < state->wsize) state->whave += dist;
418# define UPDATE_CHECK(check, buf, len) \
419 (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
421# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len)
426# define CRC2(check, word) \
428 hbuf[0] = (unsigned char)(word); \
429 hbuf[1] = (unsigned char)((word) >> 8); \
430 check = crc32(check, hbuf, 2); \
433# define CRC4(check, word) \
435 hbuf[0] = (unsigned char)(word); \
436 hbuf[1] = (unsigned char)((word) >> 8); \
437 hbuf[2] = (unsigned char)((word) >> 16); \
438 hbuf[3] = (unsigned char)((word) >> 24); \
439 check = crc32(check, hbuf, 4); \
446 put = strm->next_out; \
447 left = strm->avail_out; \
448 next = strm->next_in; \
449 have = strm->avail_in; \
450 hold = state->hold; \
451 bits = state->bits; \
457 strm->next_out = put; \
458 strm->avail_out = left; \
459 strm->next_in = next; \
460 strm->avail_in = have; \
461 state->hold = hold; \
462 state->bits = bits; \
476 if (have == 0) goto inf_leave; \
478 hold += (unsigned long)(*next++) << bits; \
486 while (bits < (unsigned)(n)) \
492 ((unsigned)hold & ((1U << (n)) - 1))
498 bits -= (unsigned)(n); \
590int ZEXPORT inflate(z_streamp strm,
int flush) {
592 z_const
unsigned char FAR *next;
593 unsigned char FAR *put;
599 unsigned char FAR *from;
605 unsigned char hbuf[4];
607 static const unsigned short order[19] =
608 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
610 if (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
611 (strm->next_in == Z_NULL && strm->avail_in != 0))
612 return Z_STREAM_ERROR;
615 if (state->mode == TYPE) state->mode = TYPEDO;
621 switch (state->mode) {
623 if (state->wrap == 0) {
624 state->mode = TYPEDO;
629 if ((state->wrap & 2) && hold == 0x8b1f) {
630 if (state->wbits == 0)
632 state->check = crc32(0L, Z_NULL, 0);
633 CRC2(state->check, hold);
638 if (state->head != Z_NULL)
639 state->head->done = -1;
640 if (!(state->wrap & 1) ||
644 ((BITS(8) << 8) + (hold >> 8)) % 31) {
645 strm->msg = (
char *)
"incorrect header check";
649 if (BITS(4) != Z_DEFLATED) {
650 strm->msg = (
char *)
"unknown compression method";
656 if (state->wbits == 0)
658 if (len > 15 || len > state->wbits) {
659 strm->msg = (
char *)
"invalid window size";
663 state->dmax = 1U << len;
665 Tracev((stderr,
"inflate: zlib header ok\n"));
666 strm->adler = state->check = adler32(0L, Z_NULL, 0);
667 state->mode = hold & 0x200 ? DICTID : TYPE;
673 state->flags = (int)(hold);
674 if ((state->flags & 0xff) != Z_DEFLATED) {
675 strm->msg = (
char *)
"unknown compression method";
679 if (state->flags & 0xe000) {
680 strm->msg = (
char *)
"unknown header flags set";
684 if (state->head != Z_NULL)
685 state->head->text = (int)((hold >> 8) & 1);
686 if ((state->flags & 0x0200) && (state->wrap & 4))
687 CRC2(state->check, hold);
693 if (state->head != Z_NULL)
694 state->head->time = hold;
695 if ((state->flags & 0x0200) && (state->wrap & 4))
696 CRC4(state->check, hold);
702 if (state->head != Z_NULL) {
703 state->head->xflags = (int)(hold & 0xff);
704 state->head->os = (int)(hold >> 8);
706 if ((state->flags & 0x0200) && (state->wrap & 4))
707 CRC2(state->check, hold);
712 if (state->flags & 0x0400) {
714 state->length = (unsigned)(hold);
715 if (state->head != Z_NULL)
716 state->head->extra_len = (unsigned)hold;
717 if ((state->flags & 0x0200) && (state->wrap & 4))
718 CRC2(state->check, hold);
721 else if (state->head != Z_NULL)
722 state->head->extra = Z_NULL;
726 if (state->flags & 0x0400) {
727 copy = state->length;
728 if (copy > have) copy = have;
730 if (state->head != Z_NULL &&
731 state->head->extra != Z_NULL &&
732 (len = state->head->extra_len - state->length) <
733 state->head->extra_max) {
734 zmemcpy(state->head->extra + len, next,
735 len + copy > state->head->extra_max ?
736 state->head->extra_max - len : copy);
738 if ((state->flags & 0x0200) && (state->wrap & 4))
739 state->check = crc32(state->check, next, copy);
742 state->length -= copy;
744 if (state->length)
goto inf_leave;
750 if (state->flags & 0x0800) {
751 if (have == 0)
goto inf_leave;
754 len = (unsigned)(next[copy++]);
755 if (state->head != Z_NULL &&
756 state->head->name != Z_NULL &&
757 state->length < state->head->name_max)
758 state->head->name[state->length++] = (Bytef)len;
759 }
while (len && copy < have);
760 if ((state->flags & 0x0200) && (state->wrap & 4))
761 state->check = crc32(state->check, next, copy);
764 if (len)
goto inf_leave;
766 else if (state->head != Z_NULL)
767 state->head->name = Z_NULL;
769 state->mode = COMMENT;
772 if (state->flags & 0x1000) {
773 if (have == 0)
goto inf_leave;
776 len = (unsigned)(next[copy++]);
777 if (state->head != Z_NULL &&
778 state->head->comment != Z_NULL &&
779 state->length < state->head->comm_max)
780 state->head->comment[state->length++] = (Bytef)len;
781 }
while (len && copy < have);
782 if ((state->flags & 0x0200) && (state->wrap & 4))
783 state->check = crc32(state->check, next, copy);
786 if (len)
goto inf_leave;
788 else if (state->head != Z_NULL)
789 state->head->comment = Z_NULL;
793 if (state->flags & 0x0200) {
795 if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
796 strm->msg = (
char *)
"header crc mismatch";
802 if (state->head != Z_NULL) {
803 state->head->hcrc = (int)((state->flags >> 9) & 1);
804 state->head->done = 1;
806 strm->adler = state->check = crc32(0L, Z_NULL, 0);
812 strm->adler = state->check = ZSWAP32(hold);
817 if (state->havedict == 0) {
821 strm->adler = state->check = adler32(0L, Z_NULL, 0);
825 if (flush == Z_BLOCK || flush == Z_TREES)
goto inf_leave;
834 state->last = BITS(1);
838 Tracev((stderr,
"inflate: stored block%s\n",
839 state->last ?
" (last)" :
""));
840 state->mode = STORED;
844 Tracev((stderr,
"inflate: fixed codes block%s\n",
845 state->last ?
" (last)" :
""));
847 if (flush == Z_TREES) {
853 Tracev((stderr,
"inflate: dynamic codes block%s\n",
854 state->last ?
" (last)" :
""));
858 strm->msg = (
char *)
"invalid block type";
866 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
867 strm->msg = (
char *)
"invalid stored block lengths";
871 state->length = (unsigned)hold & 0xffff;
872 Tracev((stderr,
"inflate: stored length %u\n",
876 if (flush == Z_TREES)
goto inf_leave;
882 copy = state->length;
884 if (copy > have) copy = have;
885 if (copy > left) copy = left;
886 if (copy == 0)
goto inf_leave;
887 zmemcpy(put, next, copy);
892 state->length -= copy;
895 Tracev((stderr,
"inflate: stored end\n"));
900 state->nlen = BITS(5) + 257;
902 state->ndist = BITS(5) + 1;
904 state->ncode = BITS(4) + 4;
906#ifndef PKZIP_BUG_WORKAROUND
907 if (state->nlen > 286 || state->ndist > 30) {
908 strm->msg = (
char *)
"too many length or distance symbols";
913 Tracev((stderr,
"inflate: table sizes ok\n"));
915 state->mode = LENLENS;
918 while (state->have < state->ncode) {
920 state->lens[order[state->have++]] = (
unsigned short)BITS(3);
923 while (state->have < 19)
924 state->lens[order[state->have++]] = 0;
925 state->next = state->codes;
926 state->lencode = (
const code FAR *)(state->next);
928 ret = inflate_table(CODES, state->lens, 19, &(state->next),
929 &(state->lenbits), state->work);
931 strm->msg = (
char *)
"invalid code lengths set";
935 Tracev((stderr,
"inflate: code lengths ok\n"));
937 state->mode = CODELENS;
940 while (state->have < state->nlen + state->ndist) {
942 here = state->lencode[BITS(state->lenbits)];
943 if ((
unsigned)(here.bits) <= bits)
break;
948 state->lens[state->have++] = here.val;
951 if (here.val == 16) {
952 NEEDBITS(here.bits + 2);
954 if (state->have == 0) {
955 strm->msg = (
char *)
"invalid bit length repeat";
959 len = state->lens[state->have - 1];
963 else if (here.val == 17) {
964 NEEDBITS(here.bits + 3);
971 NEEDBITS(here.bits + 7);
977 if (state->have + copy > state->nlen + state->ndist) {
978 strm->msg = (
char *)
"invalid bit length repeat";
983 state->lens[state->have++] = (
unsigned short)len;
988 if (state->mode == BAD)
break;
991 if (state->lens[256] == 0) {
992 strm->msg = (
char *)
"invalid code -- missing end-of-block";
1000 state->next = state->codes;
1001 state->lencode = (
const code FAR *)(state->next);
1003 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1004 &(state->lenbits), state->work);
1006 strm->msg = (
char *)
"invalid literal/lengths set";
1010 state->distcode = (
const code FAR *)(state->next);
1011 state->distbits = 6;
1012 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1013 &(state->next), &(state->distbits), state->work);
1015 strm->msg = (
char *)
"invalid distances set";
1019 Tracev((stderr,
"inflate: codes ok\n"));
1021 if (flush == Z_TREES)
goto inf_leave;
1027 if (have >= 6 && left >= 258) {
1029 inflate_fast(strm, out);
1031 if (state->mode == TYPE)
1037 here = state->lencode[BITS(state->lenbits)];
1038 if ((
unsigned)(here.bits) <= bits)
break;
1041 if (here.op && (here.op & 0xf0) == 0) {
1044 here = state->lencode[last.val +
1045 (BITS(last.bits + last.op) >> last.bits)];
1046 if ((
unsigned)(last.bits + here.bits) <= bits)
break;
1049 DROPBITS(last.bits);
1050 state->back += last.bits;
1052 DROPBITS(here.bits);
1053 state->back += here.bits;
1054 state->length = (unsigned)here.val;
1055 if ((
int)(here.op) == 0) {
1056 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1057 "inflate: literal '%c'\n" :
1058 "inflate: literal 0x%02x\n", here.val));
1063 Tracevv((stderr,
"inflate: end of block\n"));
1069 strm->msg = (
char *)
"invalid literal/length code";
1073 state->extra = (unsigned)(here.op) & 15;
1074 state->mode = LENEXT;
1078 NEEDBITS(state->extra);
1079 state->length += BITS(state->extra);
1080 DROPBITS(state->extra);
1081 state->back += state->extra;
1083 Tracevv((stderr,
"inflate: length %u\n", state->length));
1084 state->was = state->length;
1089 here = state->distcode[BITS(state->distbits)];
1090 if ((
unsigned)(here.bits) <= bits)
break;
1093 if ((here.op & 0xf0) == 0) {
1096 here = state->distcode[last.val +
1097 (BITS(last.bits + last.op) >> last.bits)];
1098 if ((
unsigned)(last.bits + here.bits) <= bits)
break;
1101 DROPBITS(last.bits);
1102 state->back += last.bits;
1104 DROPBITS(here.bits);
1105 state->back += here.bits;
1107 strm->msg = (
char *)
"invalid distance code";
1111 state->offset = (unsigned)here.val;
1112 state->extra = (unsigned)(here.op) & 15;
1113 state->mode = DISTEXT;
1117 NEEDBITS(state->extra);
1118 state->offset += BITS(state->extra);
1119 DROPBITS(state->extra);
1120 state->back += state->extra;
1122#ifdef INFLATE_STRICT
1123 if (state->offset > state->dmax) {
1124 strm->msg = (
char *)
"invalid distance too far back";
1129 Tracevv((stderr,
"inflate: distance %u\n", state->offset));
1130 state->mode = MATCH;
1133 if (left == 0)
goto inf_leave;
1135 if (state->offset > copy) {
1136 copy = state->offset - copy;
1137 if (copy > state->whave) {
1139 strm->msg = (
char *)
"invalid distance too far back";
1143#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1144 Trace((stderr,
"inflate.c too far\n"));
1145 copy -= state->whave;
1146 if (copy > state->length) copy = state->length;
1147 if (copy > left) copy = left;
1149 state->length -= copy;
1153 if (state->length == 0) state->mode = LEN;
1157 if (copy > state->wnext) {
1158 copy -= state->wnext;
1159 from = state->window + (state->wsize - copy);
1162 from = state->window + (state->wnext - copy);
1163 if (copy > state->length) copy = state->length;
1166 from = put - state->offset;
1167 copy = state->length;
1169 if (copy > left) copy = left;
1171 state->length -= copy;
1175 if (state->length == 0) state->mode = LEN;
1178 if (left == 0)
goto inf_leave;
1179 *put++ = (
unsigned char)(state->length);
1187 strm->total_out += out;
1188 state->total += out;
1189 if ((state->wrap & 4) && out)
1190 strm->adler = state->check =
1191 UPDATE_CHECK(state->check, put - out, out);
1193 if ((state->wrap & 4) && (
1195 state->flags ? hold :
1197 ZSWAP32(hold)) != state->check) {
1198 strm->msg = (
char *)
"incorrect data check";
1203 Tracev((stderr,
"inflate: check matches trailer\n"));
1206 state->mode = LENGTH;
1209 if (state->wrap && state->flags) {
1211 if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
1212 strm->msg = (
char *)
"incorrect length check";
1217 Tracev((stderr,
"inflate: length matches trailer\n"));
1233 return Z_STREAM_ERROR;
1244 if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1245 (state->mode < CHECK || flush != Z_FINISH)))
1246 if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
1250 in -= strm->avail_in;
1251 out -= strm->avail_out;
1252 strm->total_in += in;
1253 strm->total_out += out;
1254 state->total += out;
1255 if ((state->wrap & 4) && out)
1256 strm->adler = state->check =
1257 UPDATE_CHECK(state->check, strm->next_out - out, out);
1258 strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1259 (state->mode == TYPE ? 128 : 0) +
1260 (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1261 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1266int ZEXPORT inflateEnd(z_streamp strm) {
1268 if (inflateStateCheck(strm))
1269 return Z_STREAM_ERROR;
1271 if (state->window != Z_NULL) ZFREE(strm, state->window);
1272 ZFREE(strm, strm->state);
1273 strm->state = Z_NULL;
1274 Tracev((stderr,
"inflate: end\n"));
1278int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary,
1283 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1287 if (state->whave && dictionary != Z_NULL) {
1288 zmemcpy(dictionary, state->window + state->wnext,
1289 state->whave - state->wnext);
1290 zmemcpy(dictionary + state->whave - state->wnext,
1291 state->window, state->wnext);
1293 if (dictLength != Z_NULL)
1294 *dictLength = state->whave;
1298int ZEXPORT inflateSetDictionary(z_streamp strm,
const Bytef *dictionary,
1301 unsigned long dictid;
1305 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1307 if (state->wrap != 0 && state->mode != DICT)
1308 return Z_STREAM_ERROR;
1311 if (state->mode == DICT) {
1312 dictid = adler32(0L, Z_NULL, 0);
1313 dictid = adler32(dictid, dictionary, dictLength);
1314 if (dictid != state->check)
1315 return Z_DATA_ERROR;
1320 ret = updatewindow(strm, dictionary + dictLength, dictLength);
1325 state->havedict = 1;
1326 Tracev((stderr,
"inflate: dictionary set\n"));
1330int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) {
1334 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1336 if ((state->wrap & 2) == 0)
return Z_STREAM_ERROR;
1355local
unsigned syncsearch(
unsigned FAR *have,
const unsigned char FAR *buf,
1362 while (next < len && got < 4) {
1363 if ((
int)(buf[next]) == (got < 2 ? 0 : 0xff))
1375int ZEXPORT inflateSync(z_streamp strm) {
1378 unsigned long in, out;
1379 unsigned char buf[4];
1383 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1385 if (strm->avail_in == 0 && state->bits < 8)
return Z_BUF_ERROR;
1388 if (state->mode != SYNC) {
1390 state->hold >>= state->bits & 7;
1391 state->bits -= state->bits & 7;
1393 while (state->bits >= 8) {
1394 buf[len++] = (
unsigned char)(state->hold);
1399 syncsearch(&(state->have), buf, len);
1403 len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1404 strm->avail_in -= len;
1405 strm->next_in += len;
1406 strm->total_in += len;
1409 if (state->have != 4)
return Z_DATA_ERROR;
1410 if (state->flags == -1)
1414 flags = state->flags;
1415 in = strm->total_in; out = strm->total_out;
1417 strm->total_in = in; strm->total_out = out;
1418 state->flags = flags;
1431int ZEXPORT inflateSyncPoint(z_streamp strm) {
1434 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1436 return state->mode == STORED && state->bits == 0;
1439int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
1442 unsigned char FAR *window;
1446 if (inflateStateCheck(source) || dest == Z_NULL)
1447 return Z_STREAM_ERROR;
1453 if (copy == Z_NULL)
return Z_MEM_ERROR;
1455 if (state->window != Z_NULL) {
1456 window = (
unsigned char FAR *)
1457 ZALLOC(source, 1U << state->wbits,
sizeof(
unsigned char));
1458 if (window == Z_NULL) {
1459 ZFREE(source, copy);
1465 zmemcpy((voidpf)dest, (voidpf)source,
sizeof(z_stream));
1466 zmemcpy((voidpf)copy, (voidpf)state,
sizeof(
struct inflate_state));
1468 if (state->lencode >= state->codes &&
1469 state->lencode <= state->codes + ENOUGH - 1) {
1470 copy->lencode = copy->codes + (state->lencode - state->codes);
1471 copy->distcode = copy->codes + (state->distcode - state->codes);
1473 copy->next = copy->codes + (state->next - state->codes);
1474 if (window != Z_NULL) {
1475 wsize = 1U << state->wbits;
1476 zmemcpy(window, state->window, wsize);
1478 copy->window = window;
1483int ZEXPORT inflateUndermine(z_streamp strm,
int subvert) {
1486 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1488#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1489 state->sane = !subvert;
1494 return Z_DATA_ERROR;
1498int ZEXPORT inflateValidate(z_streamp strm,
int check) {
1501 if (inflateStateCheck(strm))
return Z_STREAM_ERROR;
1503 if (check && state->wrap)
1510long ZEXPORT inflateMark(z_streamp strm) {
1513 if (inflateStateCheck(strm))
1516 return (
long)(((
unsigned long)((long)state->back)) << 16) +
1517 (state->mode == COPY ? state->length :
1518 (state->mode == MATCH ? state->was - state->length : 0));
1521unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) {
1523 if (inflateStateCheck(strm))
return (
unsigned long)-1;
1525 return (
unsigned long)(state->next - state->codes);