55 " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler ";
133#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0))
141#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask)
155#define INSERT_STRING(s, str, match_head) \
156 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
157 match_head = s->head[s->ins_h], \
158 s->head[s->ins_h] = (Pos)(str))
160#define INSERT_STRING(s, str, match_head) \
161 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
162 match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
163 s->head[s->ins_h] = (Pos)(str))
170#define CLEAR_HASH(s) \
172 s->head[s->hash_size - 1] = NIL; \
173 zmemzero((Bytef *)s->head, \
174 (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
182#if defined(__has_feature)
183# if __has_feature(memory_sanitizer)
184 __attribute__((no_sanitize(
"memory")))
190 uInt wsize = s->w_size;
196 *p = (
Pos)(m >= wsize ? m - wsize :
NIL);
203 *p = (
Pos)(m >= wsize ? m - wsize :
NIL);
219 unsigned len = strm->avail_in;
221 if (len > size) len = size;
222 if (len == 0)
return 0;
224 strm->avail_in -= len;
226 zmemcpy(buf, strm->next_in, len);
227 if (strm->state->wrap == 1) {
228 strm->adler =
adler32(strm->adler, buf, len);
231 else if (strm->state->wrap == 2) {
232 strm->adler =
crc32(strm->adler, buf, len);
235 strm->next_in += len;
236 strm->total_in += len;
254 uInt wsize = s->w_size;
259 more = (unsigned)(s->window_size -(
ulg)s->lookahead -(
ulg)s->strstart);
262 if (
sizeof(
int) <= 2) {
263 if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
266 }
else if (more == (
unsigned)(-1)) {
277 if (s->strstart >= wsize +
MAX_DIST(s)) {
279 zmemcpy(s->window, s->window + wsize, (
unsigned)wsize - more);
280 s->match_start -= wsize;
281 s->strstart -= wsize;
282 s->block_start -= (long) wsize;
283 if (s->insert > s->strstart)
284 s->insert = s->strstart;
288 if (s->strm->avail_in == 0)
break;
301 Assert(more >= 2,
"more < 2");
303 n =
read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
307 if (s->lookahead + s->insert >=
MIN_MATCH) {
308 uInt str = s->strstart - s->insert;
309 s->ins_h = s->window[str];
317 s->prev[str & s->w_mask] = s->head[s->ins_h];
319 s->head[s->ins_h] = (
Pos)str;
322 if (s->lookahead + s->insert <
MIN_MATCH)
330 }
while (s->lookahead <
MIN_LOOKAHEAD && s->strm->avail_in != 0);
339 if (s->high_water < s->window_size) {
340 ulg curr = s->strstart + (
ulg)(s->lookahead);
343 if (s->high_water < curr) {
347 init = s->window_size - curr;
350 zmemzero(s->window + curr, (
unsigned)init);
351 s->high_water = curr + init;
359 if (init > s->window_size - s->high_water)
360 init = s->window_size - s->high_water;
361 zmemzero(s->window + s->high_water, (
unsigned)init);
362 s->high_water += init;
367 "not enough room for search");
380 int windowBits,
int memLevel,
int strategy,
381 const char *version,
int stream_size) {
386 if (version ==
Z_NULL || version[0] != my_version[0] ||
398 strm->opaque = (voidpf)0;
409 if (level != 0) level = 1;
414 if (windowBits < 0) {
416 if (windowBits < -15)
418 windowBits = -windowBits;
421 else if (windowBits > 15) {
426 if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !=
Z_DEFLATED ||
427 windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
428 strategy < 0 || strategy >
Z_FIXED || (windowBits == 8 && wrap != 1)) {
431 if (windowBits == 8) windowBits = 9;
440 s->w_bits = (uInt)windowBits;
441 s->w_size = 1 << s->w_bits;
442 s->w_mask = s->w_size - 1;
444 s->hash_bits = (uInt)memLevel + 7;
445 s->hash_size = 1 << s->hash_bits;
446 s->hash_mask = s->hash_size - 1;
449 s->window = (Bytef *)
ZALLOC(
strm, s->w_size, 2*
sizeof(Byte));
459 s->lit_bufsize = 1 << (memLevel + 6);
501 s->pending_buf_size = (
ulg)s->lit_bufsize * 4;
504 s->pending_buf ==
Z_NULL) {
511 s->d_buf = (
ushf *)(s->pending_buf + (s->lit_bufsize << 1));
512 s->l_buf = s->pending_buf + (s->lit_bufsize << 2);
513 s->sym_end = s->lit_bufsize - 1;
515 s->sym_buf = s->pending_buf + s->lit_bufsize;
516 s->sym_end = (s->lit_bufsize - 1) * 3;
560 z_const
unsigned char *next;
575 if (dictLength >= s->w_size) {
582 dictionary += dictLength - s->w_size;
583 dictLength = s->w_size;
587 avail =
strm->avail_in;
588 next =
strm->next_in;
589 strm->avail_in = dictLength;
590 strm->next_in = (z_const Bytef *)dictionary;
598 s->prev[str & s->w_mask] = s->head[s->ins_h];
600 s->head[s->ins_h] = (
Pos)str;
607 s->strstart += s->lookahead;
608 s->block_start = (long)s->strstart;
609 s->insert = s->lookahead;
611 s->match_length = s->prev_length =
MIN_MATCH-1;
612 s->match_available = 0;
613 strm->next_in = next;
614 strm->avail_in = avail;
628 len = s->strstart + s->lookahead;
631 if (dictionary !=
Z_NULL && len)
632 zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len);
646 strm->total_in =
strm->total_out = 0;
652 s->pending_out = s->pending_buf;
678 s->window_size = (
ulg)2L*s->w_size;
693 s->match_length = s->prev_length =
MIN_MATCH-1;
694 s->match_available = 0;
722 *bits =
strm->state->bi_valid;
734 if (bits < 0 || bits > 16 ||
735 (
uchf *)s->d_buf < s->pending_out + ((
Buf_size + 7) >> 3))
738 if (bits < 0 || bits > 16 ||
739 s->sym_buf < s->pending_out + ((
Buf_size + 7) >> 3))
746 s->bi_buf |= (
ush)((value & ((1 << put) - 1)) << s->bi_valid);
774 s->last_flush != -2) {
779 if (
strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
782 if (s->level !=
level) {
783 if (s->level == 0 && s->matches != 0) {
802 int nice_length,
int max_chain) {
807 s->good_match = (uInt)good_length;
808 s->max_lazy_match = (uInt)max_lazy;
809 s->nice_match = nice_length;
810 s->max_chain_length = (uInt)max_chain;
840 uLong fixedlen, storelen, wraplen;
845 fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) +
846 (sourceLen >> 9) + 4;
850 storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) +
851 (sourceLen >> 11) + 7;
855 return (fixedlen > storelen ? fixedlen : storelen) + 6;
864 wraplen = 6 + (s->strstart ? 4 : 0);
869 if (s->gzhead !=
Z_NULL) {
871 if (s->gzhead->extra !=
Z_NULL)
872 wraplen += 2 + s->gzhead->extra_len;
873 str = s->gzhead->name;
878 str = s->gzhead->comment;
893 if (s->w_bits != 15 || s->hash_bits != 8 + 7)
894 return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) +
899 return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
900 (sourceLen >> 25) + 13 - 6 + wraplen;
925 if (len >
strm->avail_out) len =
strm->avail_out;
926 if (len == 0)
return;
929 strm->next_out += len;
930 s->pending_out += len;
931 strm->total_out += len;
932 strm->avail_out -= len;
934 if (s->pending == 0) {
935 s->pending_out = s->pending_buf;
942#define HCRC_UPDATE(beg) \
944 if (s->gzhead->hcrc && s->pending > (beg)) \
945 strm->adler = crc32(strm->adler, s->pending_buf + (beg), \
946 s->pending - (beg)); \
966 old_flush = s->last_flush;
967 s->last_flush = flush;
970 if (s->pending != 0) {
972 if (
strm->avail_out == 0) {
987 }
else if (
strm->avail_in == 0 &&
RANK(flush) <=
RANK(old_flush) &&
1002 uInt header = (
Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8;
1007 else if (s->level < 6)
1009 else if (s->level == 6)
1013 header |= (level_flags << 6);
1015 header += 31 - (header % 31);
1020 if (s->strstart != 0) {
1029 if (s->pending != 0) {
1041 if (s->gzhead ==
Z_NULL) {
1055 if (s->pending != 0) {
1061 put_byte(s, (s->gzhead->text ? 1 : 0) +
1062 (s->gzhead->hcrc ? 2 : 0) +
1063 (s->gzhead->extra ==
Z_NULL ? 0 : 4) +
1064 (s->gzhead->name ==
Z_NULL ? 0 : 8) +
1065 (s->gzhead->comment ==
Z_NULL ? 0 : 16)
1067 put_byte(s, (Byte)(s->gzhead->time & 0xff));
1068 put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
1069 put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
1070 put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
1075 if (s->gzhead->extra !=
Z_NULL) {
1076 put_byte(s, s->gzhead->extra_len & 0xff);
1077 put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
1079 if (s->gzhead->hcrc)
1087 if (s->gzhead->extra !=
Z_NULL) {
1088 ulg beg = s->pending;
1089 uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
1090 while (s->pending + left > s->pending_buf_size) {
1091 uInt copy = s->pending_buf_size - s->pending;
1092 zmemcpy(s->pending_buf + s->pending,
1093 s->gzhead->extra + s->gzindex, copy);
1094 s->pending = s->pending_buf_size;
1098 if (s->pending != 0) {
1105 zmemcpy(s->pending_buf + s->pending,
1106 s->gzhead->extra + s->gzindex, left);
1114 if (s->gzhead->name !=
Z_NULL) {
1115 ulg beg = s->pending;
1118 if (s->pending == s->pending_buf_size) {
1121 if (s->pending != 0) {
1127 val = s->gzhead->name[s->gzindex++];
1136 if (s->gzhead->comment !=
Z_NULL) {
1137 ulg beg = s->pending;
1140 if (s->pending == s->pending_buf_size) {
1143 if (s->pending != 0) {
1149 val = s->gzhead->comment[s->gzindex++];
1157 if (s->gzhead->hcrc) {
1158 if (s->pending + 2 > s->pending_buf_size) {
1160 if (s->pending != 0) {
1173 if (s->pending != 0) {
1182 if (
strm->avail_in != 0 || s->lookahead != 0 ||
1195 if (
strm->avail_out == 0) {
1210 }
else if (flush !=
Z_BLOCK) {
1217 if (s->lookahead == 0) {
1219 s->block_start = 0L;
1225 if (
strm->avail_out == 0) {
1257 if (s->wrap > 0) s->wrap = -s->wrap;
1353 unsigned chain_length = s->max_chain_length;
1354 register Bytef *scan = s->window + s->strstart;
1355 register Bytef *match;
1357 int best_len = (int)s->prev_length;
1365 uInt wmask = s->w_mask;
1371 register Bytef *strend = s->window + s->strstart +
MAX_MATCH - 1;
1372 register ush scan_start = *(
ushf*)scan;
1373 register ush scan_end = *(
ushf*)(scan + best_len - 1);
1375 register Bytef *strend = s->window + s->strstart +
MAX_MATCH;
1376 register Byte scan_end1 = scan[best_len - 1];
1377 register Byte scan_end = scan[best_len];
1386 if (s->prev_length >= s->good_match) {
1399 match = s->window + cur_match;
1409#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
1413 if (*(
ushf*)(match + best_len - 1) != scan_end ||
1414 *(
ushf*)match != scan_start)
continue;
1425 Assert(scan[2] == match[2],
"scan[2]?");
1428 }
while (*(
ushf*)(scan += 2) == *(
ushf*)(match += 2) &&
1429 *(
ushf*)(scan += 2) == *(
ushf*)(match += 2) &&
1430 *(
ushf*)(scan += 2) == *(
ushf*)(match += 2) &&
1431 *(
ushf*)(scan += 2) == *(
ushf*)(match += 2) &&
1436 Assert(scan <= s->
window + (
unsigned)(s->window_size - 1),
1438 if (*scan == *match) scan++;
1440 len = (
MAX_MATCH - 1) - (
int)(strend - scan);
1445 if (match[best_len] != scan_end ||
1446 match[best_len - 1] != scan_end1 ||
1448 *++match != scan[1])
continue;
1457 Assert(*scan == *match,
"match[2]?");
1463 }
while (*++scan == *++match && *++scan == *++match &&
1464 *++scan == *++match && *++scan == *++match &&
1465 *++scan == *++match && *++scan == *++match &&
1466 *++scan == *++match && *++scan == *++match &&
1469 Assert(scan <= s->
window + (
unsigned)(s->window_size - 1),
1477 if (len > best_len) {
1478 s->match_start = cur_match;
1482 scan_end = *(
ushf*)(scan + best_len - 1);
1484 scan_end1 = scan[best_len - 1];
1485 scan_end = scan[best_len];
1488 }
while ((cur_match =
prev[cur_match & wmask]) > limit
1489 && --chain_length != 0);
1491 if ((uInt)best_len <= s->
lookahead)
return (uInt)best_len;
1492 return s->lookahead;
1501 register Bytef *scan = s->window + s->strstart;
1502 register Bytef *match;
1504 register Bytef *strend = s->window + s->strstart +
MAX_MATCH;
1516 match = s->window + cur_match;
1520 if (match[0] != scan[0] || match[1] != scan[1])
return MIN_MATCH-1;
1528 scan += 2, match += 2;
1529 Assert(*scan == *match,
"match[2]?");
1535 }
while (*++scan == *++match && *++scan == *++match &&
1536 *++scan == *++match && *++scan == *++match &&
1537 *++scan == *++match && *++scan == *++match &&
1538 *++scan == *++match && *++scan == *++match &&
1541 Assert(scan <= s->
window + (
unsigned)(s->window_size - 1),
"wild scan");
1547 s->match_start = cur_match;
1548 return (uInt)len <= s->lookahead ? (uInt)len : s->
lookahead;
1563 Bytef *back = s->window + (int)match, *here = s->window + start;
1565 if (match == (
IPos)-1) {
1572 if (
zmemcmp(back, here, len) != EQUAL) {
1573 fprintf(stderr,
" start %u, match %d, length %d\n",
1574 start, (
int)match, length);
1576 fprintf(stderr,
"(%02x %02x)", *back++, *here++);
1577 }
while (--len != 0);
1578 z_error(
"invalid match");
1580 if (z_verbose > 1) {
1581 fprintf(stderr,
"\\[%d,%d]", start - match, length);
1582 do { putc(s->window[start++], stderr); }
while (--length != 0);
1586# define check_match(s, start, match, length)
1593#define FLUSH_BLOCK_ONLY(s, last) { \
1594 _tr_flush_block(s, (s->block_start >= 0L ? \
1595 (charf *)&s->window[(unsigned)s->block_start] : \
1597 (ulg)((long)s->strstart - s->block_start), \
1599 s->block_start = s->strstart; \
1600 flush_pending(s->strm); \
1601 Tracev((stderr,"[FLUSH]")); \
1605#define FLUSH_BLOCK(s, last) { \
1606 FLUSH_BLOCK_ONLY(s, last); \
1607 if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
1611#define MAX_STORED 65535
1614#define MIN(a, b) ((a) > (b) ? (b) : (a))
1636 unsigned min_block =
MIN(s->pending_buf_size - 5, s->w_size);
1642 unsigned len, left, have, last = 0;
1643 unsigned used = s->strm->avail_in;
1650 have = (s->bi_valid + 42) >> 3;
1651 if (s->strm->avail_out < have)
1654 have = s->strm->avail_out - have;
1655 left = s->strstart - s->block_start;
1656 if (len > (
ulg)left + s->strm->avail_in)
1657 len = left + s->strm->avail_in;
1666 if (len < min_block && ((len == 0 && flush !=
Z_FINISH) ||
1668 len != left + s->strm->avail_in))
1674 last = flush ==
Z_FINISH && len == left + s->strm->avail_in ? 1 : 0;
1678 s->pending_buf[s->pending - 4] = len;
1679 s->pending_buf[s->pending - 3] = len >> 8;
1680 s->pending_buf[s->pending - 2] = ~len;
1681 s->pending_buf[s->pending - 1] = ~len >> 8;
1688 s->compressed_len += len << 3;
1689 s->bits_sent += len << 3;
1696 zmemcpy(s->strm->next_out, s->window + s->block_start, left);
1697 s->strm->next_out += left;
1698 s->strm->avail_out -= left;
1699 s->strm->total_out += left;
1700 s->block_start += left;
1708 read_buf(s->strm, s->strm->next_out, len);
1709 s->strm->next_out += len;
1710 s->strm->avail_out -= len;
1711 s->strm->total_out += len;
1713 }
while (last == 0);
1721 used -= s->strm->avail_in;
1726 if (used >= s->w_size) {
1728 zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
1729 s->strstart = s->w_size;
1730 s->insert = s->strstart;
1733 if (s->window_size - s->strstart <= used) {
1735 s->strstart -= s->w_size;
1736 zmemcpy(s->window, s->window + s->w_size, s->strstart);
1739 if (s->insert > s->strstart)
1740 s->insert = s->strstart;
1742 zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
1743 s->strstart += used;
1744 s->insert +=
MIN(used, s->w_size - s->insert);
1746 s->block_start = s->strstart;
1748 if (s->high_water < s->strstart)
1749 s->high_water = s->strstart;
1757 s->strm->avail_in == 0 && (
long)s->strstart == s->block_start)
1761 have = s->window_size - s->strstart;
1762 if (s->strm->avail_in > have && s->block_start >= (
long)s->w_size) {
1764 s->block_start -= s->w_size;
1765 s->strstart -= s->w_size;
1766 zmemcpy(s->window, s->window + s->w_size, s->strstart);
1770 if (s->insert > s->strstart)
1771 s->insert = s->strstart;
1773 if (have > s->strm->avail_in)
1774 have = s->strm->avail_in;
1776 read_buf(s->strm, s->window + s->strstart, have);
1777 s->strstart += have;
1778 s->insert +=
MIN(have, s->w_size - s->insert);
1780 if (s->high_water < s->strstart)
1781 s->high_water = s->strstart;
1788 have = (s->bi_valid + 42) >> 3;
1791 min_block =
MIN(have, s->w_size);
1792 left = s->strstart - s->block_start;
1793 if (left >= min_block ||
1795 s->strm->avail_in == 0 && left <= have)) {
1796 len =
MIN(left, have);
1797 last = flush ==
Z_FINISH && s->strm->avail_in == 0 &&
1798 len == left ? 1 : 0;
1800 s->block_start += len;
1830 if (s->lookahead == 0)
break;
1844 if (hash_head !=
NIL && s->strstart - hash_head <=
MAX_DIST(s)) {
1853 check_match(s, s->strstart, s->match_start, s->match_length);
1858 s->lookahead -= s->match_length;
1864 if (s->match_length <= s->max_insert_length &&
1873 }
while (--s->match_length != 0);
1878 s->strstart += s->match_length;
1879 s->match_length = 0;
1880 s->ins_h = s->window[s->strstart];
1881 UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]);
1891 Tracevv((stderr,
"%c", s->window[s->strstart]));
1930 if (s->lookahead == 0)
break;
1943 s->prev_length = s->match_length, s->prev_match = s->match_start;
1946 if (hash_head !=
NIL && s->prev_length < s->max_lazy_match &&
1947 s->strstart - hash_head <=
MAX_DIST(s)) {
1955 if (s->match_length <= 5 && (s->strategy ==
Z_FILTERED
1958 s->strstart - s->match_start >
TOO_FAR)
1971 if (s->prev_length >=
MIN_MATCH && s->match_length <= s->prev_length) {
1972 uInt max_insert = s->strstart + s->lookahead -
MIN_MATCH;
1975 check_match(s, s->strstart - 1, s->prev_match, s->prev_length);
1985 s->lookahead -= s->prev_length - 1;
1986 s->prev_length -= 2;
1988 if (++s->strstart <= max_insert) {
1991 }
while (--s->prev_length != 0);
1992 s->match_available = 0;
1998 }
else if (s->match_available) {
2003 Tracevv((stderr,
"%c", s->window[s->strstart - 1]));
2010 if (s->strm->avail_out == 0)
return need_more;
2015 s->match_available = 1;
2021 if (s->match_available) {
2022 Tracevv((stderr,
"%c", s->window[s->strstart - 1]));
2024 s->match_available = 0;
2045 Bytef *scan, *strend;
2057 if (s->lookahead == 0)
break;
2061 s->match_length = 0;
2062 if (s->lookahead >=
MIN_MATCH && s->strstart > 0) {
2063 scan = s->window + s->strstart - 1;
2065 if (
prev == *++scan &&
prev == *++scan &&
prev == *++scan) {
2066 strend = s->window + s->strstart +
MAX_MATCH;
2068 }
while (
prev == *++scan &&
prev == *++scan &&
2069 prev == *++scan &&
prev == *++scan &&
2070 prev == *++scan &&
prev == *++scan &&
2071 prev == *++scan &&
prev == *++scan &&
2073 s->match_length =
MAX_MATCH - (uInt)(strend - scan);
2074 if (s->match_length > s->lookahead)
2075 s->match_length = s->lookahead;
2083 check_match(s, s->strstart, s->strstart - 1, s->match_length);
2087 s->lookahead -= s->match_length;
2088 s->strstart += s->match_length;
2089 s->match_length = 0;
2092 Tracevv((stderr,
"%c", s->window[s->strstart]));
2118 if (s->lookahead == 0) {
2120 if (s->lookahead == 0) {
2128 s->match_length = 0;
2129 Tracevv((stderr,
"%c", s->window[s->strstart]));
int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head)
int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, int stream_size)
#define FLUSH_BLOCK_ONLY(s, last)
local block_state deflate_fast(deflate_state *s, int flush)
int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits)
#define check_match(s, start, match, length)
#define UPDATE_HASH(s, h, c)
int ZEXPORT deflateCopy(z_streamp dest, z_streamp source)
int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
int ZEXPORT deflateReset(z_streamp strm)
#define INSERT_STRING(s, str, match_head)
local block_state deflate_huff(deflate_state *s, int flush)
local block_state deflate_stored(deflate_state *s, int flush)
int ZEXPORT deflateParams(z_streamp strm, int level, int strategy)
local void fill_window(deflate_state *s)
local void putShortMSB(deflate_state *s, uInt b)
block_state(* compress_func)(deflate_state *s, int flush)
uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen)
const char deflate_copyright[]
local int deflateStateCheck(z_streamp strm)
local uInt longest_match(deflate_state *s, IPos cur_match)
local const config configuration_table[10]
local block_state deflate_slow(deflate_state *s, int flush)
#define FLUSH_BLOCK(s, last)
int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)
int ZEXPORT deflatePrime(z_streamp strm, int bits, int value)
local void lm_init(deflate_state *s)
local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size)
int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary, uInt *dictLength)
int ZEXPORT deflateResetKeep(z_streamp strm)
int ZEXPORT deflateEnd(z_streamp strm)
local void slide_hash(deflate_state *s)
int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)
local void flush_pending(z_streamp strm)
local block_state deflate_rle(deflate_state *s, int flush)
int ZEXPORT deflate(z_streamp strm, int flush)
void ZLIB_INTERNAL _tr_init(deflate_state *s)
void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, ulg stored_len, int last)
#define _tr_tally_dist(s, distance, length, flush)
void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s)
void ZLIB_INTERNAL _tr_align(deflate_state *s)
struct internal_state deflate_state
#define _tr_tally_lit(s, c, flush)
struct tree_desc_s l_desc
struct ct_data_s dyn_dtree[2 *D_CODES+1]
struct ct_data_s bl_tree[2 *BL_CODES+1]
struct tree_desc_s bl_desc
struct tree_desc_s d_desc
struct ct_data_s dyn_ltree[HEAP_SIZE]
void(* free_func)(voidpf opaque, voidpf address)
ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len)
gz_header FAR * gz_headerp
voidpf(* alloc_func)(voidpf opaque, uInt items, uInt size)
#define Z_DEFAULT_STRATEGY
ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len)
struct z_stream_s z_stream
#define Z_DEFAULT_COMPRESSION
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
#define ERR_RETURN(strm, err)
#define ZALLOC(strm, items, size)
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
#define Assert(cond, msg)
#define ZFREE(strm, addr)
void ZLIB_INTERNAL zmemzero(Bytef *dest, uInt len)
int ZLIB_INTERNAL zmemcmp(const Bytef *s1, const Bytef *s2, uInt len)
void ZLIB_INTERNAL zmemcpy(Bytef *dest, const Bytef *source, uInt len)