Lines Matching full:s
70 typedef block_state (*compress_func)(deflate_state *s, int flush);
73 local block_state deflate_stored(deflate_state *s, int flush);
74 local block_state deflate_fast(deflate_state *s, int flush);
76 local block_state deflate_slow(deflate_state *s, int flush);
78 local block_state deflate_rle(deflate_state *s, int flush);
79 local block_state deflate_huff(deflate_state *s, int flush);
141 #define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask) argument
155 #define INSERT_STRING(s, str, match_head) \ argument
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) \ argument
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) \ argument
172 s->head[s->hash_size - 1] = NIL; \
173 zmemzero((Bytef *)s->head, \
174 (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
187 local void slide_hash(deflate_state *s) { in slide_hash() argument
190 uInt wsize = s->w_size; in slide_hash()
192 n = s->hash_size; in slide_hash()
193 p = &s->head[n]; in slide_hash()
200 p = &s->prev[n]; in slide_hash()
251 local void fill_window(deflate_state *s) { in fill_window() argument
254 uInt wsize = s->w_size; in fill_window()
256 Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); in fill_window()
259 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); in fill_window()
263 if (more == 0 && s->strstart == 0 && s->lookahead == 0) { in fill_window()
277 if (s->strstart >= wsize + MAX_DIST(s)) { in fill_window()
279 zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); in fill_window()
280 s->match_start -= wsize; in fill_window()
281 s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ in fill_window()
282 s->block_start -= (long) wsize; in fill_window()
283 if (s->insert > s->strstart) in fill_window()
284 s->insert = s->strstart; in fill_window()
285 slide_hash(s); in fill_window()
288 if (s->strm->avail_in == 0) break; in fill_window()
297 * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. in fill_window()
303 n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); in fill_window()
304 s->lookahead += n; in fill_window()
307 if (s->lookahead + s->insert >= MIN_MATCH) { in fill_window()
308 uInt str = s->strstart - s->insert; in fill_window()
309 s->ins_h = s->window[str]; in fill_window()
310 UPDATE_HASH(s, s->ins_h, s->window[str + 1]); in fill_window()
314 while (s->insert) { in fill_window()
315 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); in fill_window()
317 s->prev[str & s->w_mask] = s->head[s->ins_h]; in fill_window()
319 s->head[s->ins_h] = (Pos)str; in fill_window()
321 s->insert--; in fill_window()
322 if (s->lookahead + s->insert < MIN_MATCH) in fill_window()
330 } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); in fill_window()
339 if (s->high_water < s->window_size) { in fill_window()
340 ulg curr = s->strstart + (ulg)(s->lookahead); in fill_window()
343 if (s->high_water < curr) { in fill_window()
347 init = s->window_size - curr; in fill_window()
350 zmemzero(s->window + curr, (unsigned)init); in fill_window()
351 s->high_water = curr + init; in fill_window()
353 else if (s->high_water < (ulg)curr + WIN_INIT) { in fill_window()
358 init = (ulg)curr + WIN_INIT - s->high_water; in fill_window()
359 if (init > s->window_size - s->high_water) in fill_window()
360 init = s->window_size - s->high_water; in fill_window()
361 zmemzero(s->window + s->high_water, (unsigned)init); in fill_window()
362 s->high_water += init; in fill_window()
366 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, in fill_window()
382 deflate_state *s; in deflateInit2_() local
432 s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); in deflateInit2_()
433 if (s == Z_NULL) return Z_MEM_ERROR; in deflateInit2_()
434 strm->state = (struct internal_state FAR *)s; in deflateInit2_()
435 s->strm = strm; in deflateInit2_()
436 s->status = INIT_STATE; /* to pass state test in deflateReset() */ in deflateInit2_()
438 s->wrap = wrap; in deflateInit2_()
439 s->gzhead = Z_NULL; in deflateInit2_()
440 s->w_bits = (uInt)windowBits; in deflateInit2_()
441 s->w_size = 1 << s->w_bits; in deflateInit2_()
442 s->w_mask = s->w_size - 1; in deflateInit2_()
444 s->hash_bits = (uInt)memLevel + 7; in deflateInit2_()
445 s->hash_size = 1 << s->hash_bits; in deflateInit2_()
446 s->hash_mask = s->hash_size - 1; in deflateInit2_()
447 s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); in deflateInit2_()
449 s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); in deflateInit2_()
450 s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); in deflateInit2_()
451 s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); in deflateInit2_()
453 s->high_water = 0; /* nothing written to s->window yet */ in deflateInit2_()
455 s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ in deflateInit2_()
496 s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS); in deflateInit2_()
497 s->pending_buf_size = (ulg)s->lit_bufsize * 4; in deflateInit2_()
499 if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || in deflateInit2_()
500 s->pending_buf == Z_NULL) { in deflateInit2_()
501 s->status = FINISH_STATE; in deflateInit2_()
507 s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); in deflateInit2_()
508 s->l_buf = s->pending_buf + (s->lit_bufsize << 2); in deflateInit2_()
509 s->sym_end = s->lit_bufsize - 1; in deflateInit2_()
511 s->sym_buf = s->pending_buf + s->lit_bufsize; in deflateInit2_()
512 s->sym_end = (s->lit_bufsize - 1) * 3; in deflateInit2_()
519 s->level = level; in deflateInit2_()
520 s->strategy = strategy; in deflateInit2_()
521 s->method = (Byte)method; in deflateInit2_()
530 deflate_state *s; in deflateStateCheck() local
534 s = strm->state; in deflateStateCheck()
535 if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && in deflateStateCheck()
537 s->status != GZIP_STATE && in deflateStateCheck()
539 s->status != EXTRA_STATE && in deflateStateCheck()
540 s->status != NAME_STATE && in deflateStateCheck()
541 s->status != COMMENT_STATE && in deflateStateCheck()
542 s->status != HCRC_STATE && in deflateStateCheck()
543 s->status != BUSY_STATE && in deflateStateCheck()
544 s->status != FINISH_STATE)) in deflateStateCheck()
552 deflate_state *s; in deflateSetDictionary() local
560 s = strm->state; in deflateSetDictionary()
561 wrap = s->wrap; in deflateSetDictionary()
562 if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) in deflateSetDictionary()
568 s->wrap = 0; /* avoid computing Adler-32 in read_buf */ in deflateSetDictionary()
571 if (dictLength >= s->w_size) { in deflateSetDictionary()
573 CLEAR_HASH(s); in deflateSetDictionary()
574 s->strstart = 0; in deflateSetDictionary()
575 s->block_start = 0L; in deflateSetDictionary()
576 s->insert = 0; in deflateSetDictionary()
578 dictionary += dictLength - s->w_size; /* use the tail */ in deflateSetDictionary()
579 dictLength = s->w_size; in deflateSetDictionary()
587 fill_window(s); in deflateSetDictionary()
588 while (s->lookahead >= MIN_MATCH) { in deflateSetDictionary()
589 str = s->strstart; in deflateSetDictionary()
590 n = s->lookahead - (MIN_MATCH-1); in deflateSetDictionary()
592 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); in deflateSetDictionary()
594 s->prev[str & s->w_mask] = s->head[s->ins_h]; in deflateSetDictionary()
596 s->head[s->ins_h] = (Pos)str; in deflateSetDictionary()
599 s->strstart = str; in deflateSetDictionary()
600 s->lookahead = MIN_MATCH-1; in deflateSetDictionary()
601 fill_window(s); in deflateSetDictionary()
603 s->strstart += s->lookahead; in deflateSetDictionary()
604 s->block_start = (long)s->strstart; in deflateSetDictionary()
605 s->insert = s->lookahead; in deflateSetDictionary()
606 s->lookahead = 0; in deflateSetDictionary()
607 s->match_length = s->prev_length = MIN_MATCH-1; in deflateSetDictionary()
608 s->match_available = 0; in deflateSetDictionary()
611 s->wrap = wrap; in deflateSetDictionary()
618 deflate_state *s; in deflateGetDictionary() local
623 s = strm->state; in deflateGetDictionary()
624 len = s->strstart + s->lookahead; in deflateGetDictionary()
625 if (len > s->w_size) in deflateGetDictionary()
626 len = s->w_size; in deflateGetDictionary()
628 zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); in deflateGetDictionary()
636 deflate_state *s; in deflateResetKeep() local
646 s = (deflate_state *)strm->state; in deflateResetKeep()
647 s->pending = 0; in deflateResetKeep()
648 s->pending_out = s->pending_buf; in deflateResetKeep()
650 if (s->wrap < 0) { in deflateResetKeep()
651 s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ in deflateResetKeep()
653 s->status = in deflateResetKeep()
655 s->wrap == 2 ? GZIP_STATE : in deflateResetKeep()
660 s->wrap == 2 ? crc32(0L, Z_NULL, 0) : in deflateResetKeep()
663 s->last_flush = -2; in deflateResetKeep()
665 _tr_init(s); in deflateResetKeep()
673 local void lm_init(deflate_state *s) { in lm_init() argument
674 s->window_size = (ulg)2L*s->w_size; in lm_init()
676 CLEAR_HASH(s); in lm_init()
680 s->max_lazy_match = configuration_table[s->level].max_lazy; in lm_init()
681 s->good_match = configuration_table[s->level].good_length; in lm_init()
682 s->nice_match = configuration_table[s->level].nice_length; in lm_init()
683 s->max_chain_length = configuration_table[s->level].max_chain; in lm_init()
685 s->strstart = 0; in lm_init()
686 s->block_start = 0L; in lm_init()
687 s->lookahead = 0; in lm_init()
688 s->insert = 0; in lm_init()
689 s->match_length = s->prev_length = MIN_MATCH-1; in lm_init()
690 s->match_available = 0; in lm_init()
691 s->ins_h = 0; in lm_init()
724 deflate_state *s; in deflatePrime() local
728 s = strm->state; in deflatePrime()
731 (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) in deflatePrime()
735 s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) in deflatePrime()
739 put = Buf_size - s->bi_valid; in deflatePrime()
742 s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); in deflatePrime()
743 s->bi_valid += put; in deflatePrime()
744 _tr_flush_bits(s); in deflatePrime()
753 deflate_state *s; in deflateParams() local
757 s = strm->state; in deflateParams()
767 func = configuration_table[s->level].func; in deflateParams()
769 if ((strategy != s->strategy || func != configuration_table[level].func) && in deflateParams()
770 s->last_flush != -2) { in deflateParams()
775 if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) in deflateParams()
778 if (s->level != level) { in deflateParams()
779 if (s->level == 0 && s->matches != 0) { in deflateParams()
780 if (s->matches == 1) in deflateParams()
781 slide_hash(s); in deflateParams()
783 CLEAR_HASH(s); in deflateParams()
784 s->matches = 0; in deflateParams()
786 s->level = level; in deflateParams()
787 s->max_lazy_match = configuration_table[level].max_lazy; in deflateParams()
788 s->good_match = configuration_table[level].good_length; in deflateParams()
789 s->nice_match = configuration_table[level].nice_length; in deflateParams()
790 s->max_chain_length = configuration_table[level].max_chain; in deflateParams()
792 s->strategy = strategy; in deflateParams()
799 deflate_state *s; in deflateTune() local
802 s = strm->state; in deflateTune()
803 s->good_match = (uInt)good_length; in deflateTune()
804 s->max_lazy_match = (uInt)max_lazy; in deflateTune()
805 s->nice_match = nice_length; in deflateTune()
806 s->max_chain_length = (uInt)max_chain; in deflateTune()
835 deflate_state *s; in deflateBound() local
854 s = strm->state; in deflateBound()
855 switch (s->wrap) { in deflateBound()
860 wraplen = 6 + (s->strstart ? 4 : 0); in deflateBound()
865 if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ in deflateBound()
867 if (s->gzhead->extra != Z_NULL) in deflateBound()
868 wraplen += 2 + s->gzhead->extra_len; in deflateBound()
869 str = s->gzhead->name; in deflateBound()
874 str = s->gzhead->comment; in deflateBound()
879 if (s->gzhead->hcrc) in deflateBound()
889 if (s->w_bits != 15 || s->hash_bits != 8 + 7) in deflateBound()
890 return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + in deflateBound()
904 local void putShortMSB(deflate_state *s, uInt b) { in putShortMSB() argument
905 put_byte(s, (Byte)(b >> 8)); in putShortMSB()
906 put_byte(s, (Byte)(b & 0xff)); in putShortMSB()
917 deflate_state *s = strm->state; in flush_pending() local
919 _tr_flush_bits(s); in flush_pending()
920 len = s->pending; in flush_pending()
924 zmemcpy(strm->next_out, s->pending_out, len); in flush_pending()
926 s->pending_out += len; in flush_pending()
929 s->pending -= len; in flush_pending()
930 if (s->pending == 0) { in flush_pending()
931 s->pending_out = s->pending_buf; in flush_pending()
936 * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1].
940 if (s->gzhead->hcrc && s->pending > (beg)) \
941 strm->adler = crc32(strm->adler, s->pending_buf + (beg), \
942 s->pending - (beg)); \
948 deflate_state *s; in deflate() local
953 s = strm->state; in deflate()
957 (s->status == FINISH_STATE && flush != Z_FINISH)) { in deflate()
962 old_flush = s->last_flush; in deflate()
963 s->last_flush = flush; in deflate()
966 if (s->pending != 0) { in deflate()
975 s->last_flush = -1; in deflate()
989 if (s->status == FINISH_STATE && strm->avail_in != 0) { in deflate()
994 if (s->status == INIT_STATE && s->wrap == 0) in deflate()
995 s->status = BUSY_STATE; in deflate()
996 if (s->status == INIT_STATE) { in deflate()
998 uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; in deflate()
1001 if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) in deflate()
1003 else if (s->level < 6) in deflate()
1005 else if (s->level == 6) in deflate()
1010 if (s->strstart != 0) header |= PRESET_DICT; in deflate()
1013 putShortMSB(s, header); in deflate()
1016 if (s->strstart != 0) { in deflate()
1017 putShortMSB(s, (uInt)(strm->adler >> 16)); in deflate()
1018 putShortMSB(s, (uInt)(strm->adler & 0xffff)); in deflate()
1021 s->status = BUSY_STATE; in deflate()
1025 if (s->pending != 0) { in deflate()
1026 s->last_flush = -1; in deflate()
1031 if (s->status == GZIP_STATE) { in deflate()
1034 put_byte(s, 31); in deflate()
1035 put_byte(s, 139); in deflate()
1036 put_byte(s, 8); in deflate()
1037 if (s->gzhead == Z_NULL) { in deflate()
1038 put_byte(s, 0); in deflate()
1039 put_byte(s, 0); in deflate()
1040 put_byte(s, 0); in deflate()
1041 put_byte(s, 0); in deflate()
1042 put_byte(s, 0); in deflate()
1043 put_byte(s, s->level == 9 ? 2 : in deflate()
1044 (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? in deflate()
1046 put_byte(s, OS_CODE); in deflate()
1047 s->status = BUSY_STATE; in deflate()
1051 if (s->pending != 0) { in deflate()
1052 s->last_flush = -1; in deflate()
1057 put_byte(s, (s->gzhead->text ? 1 : 0) + in deflate()
1058 (s->gzhead->hcrc ? 2 : 0) + in deflate()
1059 (s->gzhead->extra == Z_NULL ? 0 : 4) + in deflate()
1060 (s->gzhead->name == Z_NULL ? 0 : 8) + in deflate()
1061 (s->gzhead->comment == Z_NULL ? 0 : 16) in deflate()
1063 put_byte(s, (Byte)(s->gzhead->time & 0xff)); in deflate()
1064 put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); in deflate()
1065 put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); in deflate()
1066 put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); in deflate()
1067 put_byte(s, s->level == 9 ? 2 : in deflate()
1068 (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? in deflate()
1070 put_byte(s, s->gzhead->os & 0xff); in deflate()
1071 if (s->gzhead->extra != Z_NULL) { in deflate()
1072 put_byte(s, s->gzhead->extra_len & 0xff); in deflate()
1073 put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); in deflate()
1075 if (s->gzhead->hcrc) in deflate()
1076 strm->adler = crc32(strm->adler, s->pending_buf, in deflate()
1077 s->pending); in deflate()
1078 s->gzindex = 0; in deflate()
1079 s->status = EXTRA_STATE; in deflate()
1082 if (s->status == EXTRA_STATE) { in deflate()
1083 if (s->gzhead->extra != Z_NULL) { in deflate()
1084 ulg beg = s->pending; /* start of bytes to update crc */ in deflate()
1085 uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; in deflate()
1086 while (s->pending + left > s->pending_buf_size) { in deflate()
1087 uInt copy = s->pending_buf_size - s->pending; in deflate()
1088 zmemcpy(s->pending_buf + s->pending, in deflate()
1089 s->gzhead->extra + s->gzindex, copy); in deflate()
1090 s->pending = s->pending_buf_size; in deflate()
1092 s->gzindex += copy; in deflate()
1094 if (s->pending != 0) { in deflate()
1095 s->last_flush = -1; in deflate()
1101 zmemcpy(s->pending_buf + s->pending, in deflate()
1102 s->gzhead->extra + s->gzindex, left); in deflate()
1103 s->pending += left; in deflate()
1105 s->gzindex = 0; in deflate()
1107 s->status = NAME_STATE; in deflate()
1109 if (s->status == NAME_STATE) { in deflate()
1110 if (s->gzhead->name != Z_NULL) { in deflate()
1111 ulg beg = s->pending; /* start of bytes to update crc */ in deflate()
1114 if (s->pending == s->pending_buf_size) { in deflate()
1117 if (s->pending != 0) { in deflate()
1118 s->last_flush = -1; in deflate()
1123 val = s->gzhead->name[s->gzindex++]; in deflate()
1124 put_byte(s, val); in deflate()
1127 s->gzindex = 0; in deflate()
1129 s->status = COMMENT_STATE; in deflate()
1131 if (s->status == COMMENT_STATE) { in deflate()
1132 if (s->gzhead->comment != Z_NULL) { in deflate()
1133 ulg beg = s->pending; /* start of bytes to update crc */ in deflate()
1136 if (s->pending == s->pending_buf_size) { in deflate()
1139 if (s->pending != 0) { in deflate()
1140 s->last_flush = -1; in deflate()
1145 val = s->gzhead->comment[s->gzindex++]; in deflate()
1146 put_byte(s, val); in deflate()
1150 s->status = HCRC_STATE; in deflate()
1152 if (s->status == HCRC_STATE) { in deflate()
1153 if (s->gzhead->hcrc) { in deflate()
1154 if (s->pending + 2 > s->pending_buf_size) { in deflate()
1156 if (s->pending != 0) { in deflate()
1157 s->last_flush = -1; in deflate()
1161 put_byte(s, (Byte)(strm->adler & 0xff)); in deflate()
1162 put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); in deflate()
1165 s->status = BUSY_STATE; in deflate()
1169 if (s->pending != 0) { in deflate()
1170 s->last_flush = -1; in deflate()
1178 if (strm->avail_in != 0 || s->lookahead != 0 || in deflate()
1179 (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { in deflate()
1182 bstate = s->level == 0 ? deflate_stored(s, flush) : in deflate()
1183 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : in deflate()
1184 s->strategy == Z_RLE ? deflate_rle(s, flush) : in deflate()
1185 (*(configuration_table[s->level].func))(s, flush); in deflate()
1188 s->status = FINISH_STATE; in deflate()
1192 s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ in deflate()
1205 _tr_align(s); in deflate()
1207 _tr_stored_block(s, (char*)0, 0L, 0); in deflate()
1212 CLEAR_HASH(s); /* forget history */ in deflate()
1213 if (s->lookahead == 0) { in deflate()
1214 s->strstart = 0; in deflate()
1215 s->block_start = 0L; in deflate()
1216 s->insert = 0; in deflate()
1222 s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ in deflate()
1229 if (s->wrap <= 0) return Z_STREAM_END; in deflate()
1233 if (s->wrap == 2) { in deflate()
1234 put_byte(s, (Byte)(strm->adler & 0xff)); in deflate()
1235 put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); in deflate()
1236 put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); in deflate()
1237 put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); in deflate()
1238 put_byte(s, (Byte)(strm->total_in & 0xff)); in deflate()
1239 put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); in deflate()
1240 put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); in deflate()
1241 put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); in deflate()
1246 putShortMSB(s, (uInt)(strm->adler >> 16)); in deflate()
1247 putShortMSB(s, (uInt)(strm->adler & 0xffff)); in deflate()
1253 if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ in deflate()
1254 return s->pending != 0 ? Z_OK : Z_STREAM_END; in deflate()
1346 * OUT assertion: the match length is not greater than s->lookahead.
1348 local uInt longest_match(deflate_state *s, IPos cur_match) { in longest_match() argument
1349 unsigned chain_length = s->max_chain_length;/* max hash chain length */ in longest_match()
1350 register Bytef *scan = s->window + s->strstart; /* current string */ in longest_match()
1353 int best_len = (int)s->prev_length; /* best match length so far */ in longest_match()
1354 int nice_match = s->nice_match; /* stop if match long enough */ in longest_match()
1355 IPos limit = s->strstart > (IPos)MAX_DIST(s) ? in longest_match()
1356 s->strstart - (IPos)MAX_DIST(s) : NIL; in longest_match()
1360 Posf *prev = s->prev; in longest_match()
1361 uInt wmask = s->w_mask; in longest_match()
1367 register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; in longest_match()
1371 register Bytef *strend = s->window + s->strstart + MAX_MATCH; in longest_match()
1379 Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); in longest_match()
1382 if (s->prev_length >= s->good_match) { in longest_match()
1388 if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; in longest_match()
1390 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, in longest_match()
1394 Assert(cur_match < s->strstart, "no future"); in longest_match()
1395 match = s->window + cur_match; in longest_match()
1432 Assert(scan <= s->window + (unsigned)(s->window_size - 1), in longest_match()
1465 Assert(scan <= s->window + (unsigned)(s->window_size - 1), in longest_match()
1474 s->match_start = cur_match; in longest_match()
1487 if ((uInt)best_len <= s->lookahead) return (uInt)best_len; in longest_match()
1488 return s->lookahead; in longest_match()
1496 local uInt longest_match(deflate_state *s, IPos cur_match) { in longest_match() argument
1497 register Bytef *scan = s->window + s->strstart; /* current string */ in longest_match()
1500 register Bytef *strend = s->window + s->strstart + MAX_MATCH; in longest_match()
1505 Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); in longest_match()
1507 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, in longest_match()
1510 Assert(cur_match < s->strstart, "no future"); in longest_match()
1512 match = s->window + cur_match; in longest_match()
1537 Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); in longest_match()
1543 s->match_start = cur_match; in longest_match()
1544 return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; in longest_match()
1557 local void check_match(deflate_state *s, IPos start, IPos match, int length) { in check_match() argument
1559 Bytef *back = s->window + (int)match, *here = s->window + start; in check_match()
1578 do { putc(s->window[start++], stderr); } while (--length != 0); in check_match()
1582 # define check_match(s, start, match, length) argument
1589 #define FLUSH_BLOCK_ONLY(s, last) { \ argument
1590 _tr_flush_block(s, (s->block_start >= 0L ? \
1591 (charf *)&s->window[(unsigned)s->block_start] : \
1593 (ulg)((long)s->strstart - s->block_start), \
1595 s->block_start = s->strstart; \
1596 flush_pending(s->strm); \
1601 #define FLUSH_BLOCK(s, last) { \ argument
1602 FLUSH_BLOCK_ONLY(s, last); \
1603 if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
1619 * level, s->matches (otherwise unused when storing) keeps track of the number
1620 * of hash table slides to perform. If s->matches is 1, then one hash table
1621 * slide will be done when switching. If s->matches is 2, the maximum value
1629 local block_state deflate_stored(deflate_state *s, int flush) { in deflate_stored() argument
1634 unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); in deflate_stored()
1641 unsigned used = s->strm->avail_in; in deflate_stored()
1645 * would be copied from what's left in the window. in deflate_stored()
1648 have = (s->bi_valid + 42) >> 3; /* number of header bytes */ in deflate_stored()
1649 if (s->strm->avail_out < have) /* need room for header */ in deflate_stored()
1652 have = s->strm->avail_out - have; in deflate_stored()
1653 left = s->strstart - s->block_start; /* bytes left in window */ in deflate_stored()
1654 if (len > (ulg)left + s->strm->avail_in) in deflate_stored()
1655 len = left + s->strm->avail_in; /* limit len to the input */ in deflate_stored()
1666 len != left + s->strm->avail_in)) in deflate_stored()
1672 last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; in deflate_stored()
1673 _tr_stored_block(s, (char *)0, 0L, last); in deflate_stored()
1676 s->pending_buf[s->pending - 4] = len; in deflate_stored()
1677 s->pending_buf[s->pending - 3] = len >> 8; in deflate_stored()
1678 s->pending_buf[s->pending - 2] = ~len; in deflate_stored()
1679 s->pending_buf[s->pending - 1] = ~len >> 8; in deflate_stored()
1682 flush_pending(s->strm); in deflate_stored()
1686 s->compressed_len += len << 3; in deflate_stored()
1687 s->bits_sent += len << 3; in deflate_stored()
1694 zmemcpy(s->strm->next_out, s->window + s->block_start, left); in deflate_stored()
1695 s->strm->next_out += left; in deflate_stored()
1696 s->strm->avail_out -= left; in deflate_stored()
1697 s->strm->total_out += left; in deflate_stored()
1698 s->block_start += left; in deflate_stored()
1706 read_buf(s->strm, s->strm->next_out, len); in deflate_stored()
1707 s->strm->next_out += len; in deflate_stored()
1708 s->strm->avail_out -= len; in deflate_stored()
1709 s->strm->total_out += len; in deflate_stored()
1713 /* Update the sliding window with the last s->w_size bytes of the copied in deflate_stored()
1715 * than s->w_size bytes were copied. Also update the number of bytes to in deflate_stored()
1719 used -= s->strm->avail_in; /* number of input bytes directly copied */ in deflate_stored()
1722 * therefore s->block_start == s->strstart. in deflate_stored()
1724 if (used >= s->w_size) { /* supplant the previous history */ in deflate_stored()
1725 s->matches = 2; /* clear hash */ in deflate_stored()
1726 zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); in deflate_stored()
1727 s->strstart = s->w_size; in deflate_stored()
1728 s->insert = s->strstart; in deflate_stored()
1731 if (s->window_size - s->strstart <= used) { in deflate_stored()
1733 s->strstart -= s->w_size; in deflate_stored()
1734 zmemcpy(s->window, s->window + s->w_size, s->strstart); in deflate_stored()
1735 if (s->matches < 2) in deflate_stored()
1736 s->matches++; /* add a pending slide_hash() */ in deflate_stored()
1737 if (s->insert > s->strstart) in deflate_stored()
1738 s->insert = s->strstart; in deflate_stored()
1740 zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); in deflate_stored()
1741 s->strstart += used; in deflate_stored()
1742 s->insert += MIN(used, s->w_size - s->insert); in deflate_stored()
1744 s->block_start = s->strstart; in deflate_stored()
1746 if (s->high_water < s->strstart) in deflate_stored()
1747 s->high_water = s->strstart; in deflate_stored()
1755 s->strm->avail_in == 0 && (long)s->strstart == s->block_start) in deflate_stored()
1759 have = s->window_size - s->strstart; in deflate_stored()
1760 if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { in deflate_stored()
1762 s->block_start -= s->w_size; in deflate_stored()
1763 s->strstart -= s->w_size; in deflate_stored()
1764 zmemcpy(s->window, s->window + s->w_size, s->strstart); in deflate_stored()
1765 if (s->matches < 2) in deflate_stored()
1766 s->matches++; /* add a pending slide_hash() */ in deflate_stored()
1767 have += s->w_size; /* more space now */ in deflate_stored()
1768 if (s->insert > s->strstart) in deflate_stored()
1769 s->insert = s->strstart; in deflate_stored()
1771 if (have > s->strm->avail_in) in deflate_stored()
1772 have = s->strm->avail_in; in deflate_stored()
1774 read_buf(s->strm, s->window + s->strstart, have); in deflate_stored()
1775 s->strstart += have; in deflate_stored()
1776 s->insert += MIN(have, s->w_size - s->insert); in deflate_stored()
1778 if (s->high_water < s->strstart) in deflate_stored()
1779 s->high_water = s->strstart; in deflate_stored()
1786 have = (s->bi_valid + 42) >> 3; /* number of header bytes */ in deflate_stored()
1788 have = MIN(s->pending_buf_size - have, MAX_STORED); in deflate_stored()
1789 min_block = MIN(have, s->w_size); in deflate_stored()
1790 left = s->strstart - s->block_start; in deflate_stored()
1793 s->strm->avail_in == 0 && left <= have)) { in deflate_stored()
1795 last = flush == Z_FINISH && s->strm->avail_in == 0 && in deflate_stored()
1797 _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); in deflate_stored()
1798 s->block_start += len; in deflate_stored()
1799 flush_pending(s->strm); in deflate_stored()
1813 local block_state deflate_fast(deflate_state *s, int flush) { in deflate_fast() argument
1823 if (s->lookahead < MIN_LOOKAHEAD) { in deflate_fast()
1824 fill_window(s); in deflate_fast()
1825 if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { in deflate_fast()
1828 if (s->lookahead == 0) break; /* flush the current block */ in deflate_fast()
1835 if (s->lookahead >= MIN_MATCH) { in deflate_fast()
1836 INSERT_STRING(s, s->strstart, hash_head); in deflate_fast()
1842 if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { in deflate_fast()
1847 s->match_length = longest_match (s, hash_head); in deflate_fast()
1850 if (s->match_length >= MIN_MATCH) { in deflate_fast()
1851 check_match(s, s->strstart, s->match_start, s->match_length); in deflate_fast()
1853 _tr_tally_dist(s, s->strstart - s->match_start, in deflate_fast()
1854 s->match_length - MIN_MATCH, bflush); in deflate_fast()
1856 s->lookahead -= s->match_length; in deflate_fast()
1862 if (s->match_length <= s->max_insert_length && in deflate_fast()
1863 s->lookahead >= MIN_MATCH) { in deflate_fast()
1864 s->match_length--; /* string at strstart already in table */ in deflate_fast()
1866 s->strstart++; in deflate_fast()
1867 INSERT_STRING(s, s->strstart, hash_head); in deflate_fast()
1871 } while (--s->match_length != 0); in deflate_fast()
1872 s->strstart++; in deflate_fast()
1876 s->strstart += s->match_length; in deflate_fast()
1877 s->match_length = 0; in deflate_fast()
1878 s->ins_h = s->window[s->strstart]; in deflate_fast()
1879 UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); in deflate_fast()
1889 Tracevv((stderr,"%c", s->window[s->strstart])); in deflate_fast()
1890 _tr_tally_lit(s, s->window[s->strstart], bflush); in deflate_fast()
1891 s->lookahead--; in deflate_fast()
1892 s->strstart++; in deflate_fast()
1894 if (bflush) FLUSH_BLOCK(s, 0); in deflate_fast()
1896 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; in deflate_fast()
1898 FLUSH_BLOCK(s, 1); in deflate_fast()
1901 if (s->sym_next) in deflate_fast()
1902 FLUSH_BLOCK(s, 0); in deflate_fast()
1912 local block_state deflate_slow(deflate_state *s, int flush) { in deflate_slow() argument
1923 if (s->lookahead < MIN_LOOKAHEAD) { in deflate_slow()
1924 fill_window(s); in deflate_slow()
1925 if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { in deflate_slow()
1928 if (s->lookahead == 0) break; /* flush the current block */ in deflate_slow()
1935 if (s->lookahead >= MIN_MATCH) { in deflate_slow()
1936 INSERT_STRING(s, s->strstart, hash_head); in deflate_slow()
1941 s->prev_length = s->match_length, s->prev_match = s->match_start; in deflate_slow()
1942 s->match_length = MIN_MATCH-1; in deflate_slow()
1944 if (hash_head != NIL && s->prev_length < s->max_lazy_match && in deflate_slow()
1945 s->strstart - hash_head <= MAX_DIST(s)) { in deflate_slow()
1950 s->match_length = longest_match (s, hash_head); in deflate_slow()
1953 if (s->match_length <= 5 && (s->strategy == Z_FILTERED in deflate_slow()
1955 || (s->match_length == MIN_MATCH && in deflate_slow()
1956 s->strstart - s->match_start > TOO_FAR) in deflate_slow()
1963 s->match_length = MIN_MATCH-1; in deflate_slow()
1969 if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { in deflate_slow()
1970 uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; in deflate_slow()
1973 check_match(s, s->strstart - 1, s->prev_match, s->prev_length); in deflate_slow()
1975 _tr_tally_dist(s, s->strstart - 1 - s->prev_match, in deflate_slow()
1976 s->prev_length - MIN_MATCH, bflush); in deflate_slow()
1983 s->lookahead -= s->prev_length - 1; in deflate_slow()
1984 s->prev_length -= 2; in deflate_slow()
1986 if (++s->strstart <= max_insert) { in deflate_slow()
1987 INSERT_STRING(s, s->strstart, hash_head); in deflate_slow()
1989 } while (--s->prev_length != 0); in deflate_slow()
1990 s->match_available = 0; in deflate_slow()
1991 s->match_length = MIN_MATCH-1; in deflate_slow()
1992 s->strstart++; in deflate_slow()
1994 if (bflush) FLUSH_BLOCK(s, 0); in deflate_slow()
1996 } else if (s->match_available) { in deflate_slow()
2001 Tracevv((stderr,"%c", s->window[s->strstart - 1])); in deflate_slow()
2002 _tr_tally_lit(s, s->window[s->strstart - 1], bflush); in deflate_slow()
2004 FLUSH_BLOCK_ONLY(s, 0); in deflate_slow()
2006 s->strstart++; in deflate_slow()
2007 s->lookahead--; in deflate_slow()
2008 if (s->strm->avail_out == 0) return need_more; in deflate_slow()
2013 s->match_available = 1; in deflate_slow()
2014 s->strstart++; in deflate_slow()
2015 s->lookahead--; in deflate_slow()
2019 if (s->match_available) { in deflate_slow()
2020 Tracevv((stderr,"%c", s->window[s->strstart - 1])); in deflate_slow()
2021 _tr_tally_lit(s, s->window[s->strstart - 1], bflush); in deflate_slow()
2022 s->match_available = 0; in deflate_slow()
2024 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; in deflate_slow()
2026 FLUSH_BLOCK(s, 1); in deflate_slow()
2029 if (s->sym_next) in deflate_slow()
2030 FLUSH_BLOCK(s, 0); in deflate_slow()
2040 local block_state deflate_rle(deflate_state *s, int flush) { in deflate_rle() argument
2050 if (s->lookahead <= MAX_MATCH) { in deflate_rle()
2051 fill_window(s); in deflate_rle()
2052 if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { in deflate_rle()
2055 if (s->lookahead == 0) break; /* flush the current block */ in deflate_rle()
2059 s->match_length = 0; in deflate_rle()
2060 if (s->lookahead >= MIN_MATCH && s->strstart > 0) { in deflate_rle()
2061 scan = s->window + s->strstart - 1; in deflate_rle()
2064 strend = s->window + s->strstart + MAX_MATCH; in deflate_rle()
2071 s->match_length = MAX_MATCH - (uInt)(strend - scan); in deflate_rle()
2072 if (s->match_length > s->lookahead) in deflate_rle()
2073 s->match_length = s->lookahead; in deflate_rle()
2075 Assert(scan <= s->window + (uInt)(s->window_size - 1), in deflate_rle()
2080 if (s->match_length >= MIN_MATCH) { in deflate_rle()
2081 check_match(s, s->strstart, s->strstart - 1, s->match_length); in deflate_rle()
2083 _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); in deflate_rle()
2085 s->lookahead -= s->match_length; in deflate_rle()
2086 s->strstart += s->match_length; in deflate_rle()
2087 s->match_length = 0; in deflate_rle()
2090 Tracevv((stderr,"%c", s->window[s->strstart])); in deflate_rle()
2091 _tr_tally_lit(s, s->window[s->strstart], bflush); in deflate_rle()
2092 s->lookahead--; in deflate_rle()
2093 s->strstart++; in deflate_rle()
2095 if (bflush) FLUSH_BLOCK(s, 0); in deflate_rle()
2097 s->insert = 0; in deflate_rle()
2099 FLUSH_BLOCK(s, 1); in deflate_rle()
2102 if (s->sym_next) in deflate_rle()
2103 FLUSH_BLOCK(s, 0); in deflate_rle()
2111 local block_state deflate_huff(deflate_state *s, int flush) { in deflate_huff() argument
2116 if (s->lookahead == 0) { in deflate_huff()
2117 fill_window(s); in deflate_huff()
2118 if (s->lookahead == 0) { in deflate_huff()
2126 s->match_length = 0; in deflate_huff()
2127 Tracevv((stderr,"%c", s->window[s->strstart])); in deflate_huff()
2128 _tr_tally_lit(s, s->window[s->strstart], bflush); in deflate_huff()
2129 s->lookahead--; in deflate_huff()
2130 s->strstart++; in deflate_huff()
2131 if (bflush) FLUSH_BLOCK(s, 0); in deflate_huff()
2133 s->insert = 0; in deflate_huff()
2135 FLUSH_BLOCK(s, 1); in deflate_huff()
2138 if (s->sym_next) in deflate_huff()
2139 FLUSH_BLOCK(s, 0); in deflate_huff()