|
|
|
@ -160,7 +160,7 @@ local const config configuration_table[10] = { |
|
|
|
|
* characters, so that a running hash key can be computed from the previous |
|
|
|
|
* key instead of complete recalculation each time. |
|
|
|
|
*/ |
|
|
|
|
#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) |
|
|
|
|
#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
@ -191,9 +191,9 @@ local const config configuration_table[10] = { |
|
|
|
|
*/ |
|
|
|
|
#define CLEAR_HASH(s) \ |
|
|
|
|
do { \
|
|
|
|
|
s->head[s->hash_size-1] = NIL; \
|
|
|
|
|
s->head[s->hash_size - 1] = NIL; \
|
|
|
|
|
zmemzero((Bytef *)s->head, \
|
|
|
|
|
(unsigned)(s->hash_size-1)*sizeof(*s->head)); \
|
|
|
|
|
(unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
@ -314,7 +314,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
|
|
|
|
s->hash_bits = (uInt)memLevel + 7; |
|
|
|
|
s->hash_size = 1 << s->hash_bits; |
|
|
|
|
s->hash_mask = s->hash_size - 1; |
|
|
|
|
s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); |
|
|
|
|
s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); |
|
|
|
|
|
|
|
|
|
s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); |
|
|
|
|
s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); |
|
|
|
@ -340,11 +340,11 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
|
|
|
|
* sym_buf value to read moves forward three bytes. From that symbol, up to |
|
|
|
|
* 31 bits are written to pending_buf. The closest the written pending_buf |
|
|
|
|
* bits gets to the next sym_buf symbol to read is just before the last |
|
|
|
|
* code is written. At that time, 31*(n-2) bits have been written, just |
|
|
|
|
* after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at |
|
|
|
|
* 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 |
|
|
|
|
* code is written. At that time, 31*(n - 2) bits have been written, just |
|
|
|
|
* after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at |
|
|
|
|
* 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1 |
|
|
|
|
* symbols are written.) The closest the writing gets to what is unread is |
|
|
|
|
* then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and |
|
|
|
|
* then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and |
|
|
|
|
* can range from 128 to 32768. |
|
|
|
|
* |
|
|
|
|
* Therefore, at a minimum, there are 142 bits of space between what is |
|
|
|
@ -390,7 +390,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
|
|
|
|
/* =========================================================================
|
|
|
|
|
* Check for a valid deflate stream state. Return 0 if ok, 1 if not. |
|
|
|
|
*/ |
|
|
|
|
local int deflateStateCheck (strm) |
|
|
|
|
local int deflateStateCheck(strm) |
|
|
|
|
z_streamp strm; |
|
|
|
|
{ |
|
|
|
|
deflate_state *s; |
|
|
|
@ -413,7 +413,7 @@ local int deflateStateCheck (strm) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) |
|
|
|
|
int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) |
|
|
|
|
z_streamp strm; |
|
|
|
|
const Bytef *dictionary; |
|
|
|
|
uInt dictLength; |
|
|
|
@ -482,7 +482,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) |
|
|
|
|
int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) |
|
|
|
|
z_streamp strm; |
|
|
|
|
Bytef *dictionary; |
|
|
|
|
uInt *dictLength; |
|
|
|
@ -504,7 +504,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflateResetKeep (strm) |
|
|
|
|
int ZEXPORT deflateResetKeep(strm) |
|
|
|
|
z_streamp strm; |
|
|
|
|
{ |
|
|
|
|
deflate_state *s; |
|
|
|
@ -542,7 +542,7 @@ int ZEXPORT deflateResetKeep (strm) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflateReset (strm) |
|
|
|
|
int ZEXPORT deflateReset(strm) |
|
|
|
|
z_streamp strm; |
|
|
|
|
{ |
|
|
|
|
int ret; |
|
|
|
@ -554,7 +554,7 @@ int ZEXPORT deflateReset (strm) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflateSetHeader (strm, head) |
|
|
|
|
int ZEXPORT deflateSetHeader(strm, head) |
|
|
|
|
z_streamp strm; |
|
|
|
|
gz_headerp head; |
|
|
|
|
{ |
|
|
|
@ -565,7 +565,7 @@ int ZEXPORT deflateSetHeader (strm, head) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflatePending (strm, pending, bits) |
|
|
|
|
int ZEXPORT deflatePending(strm, pending, bits) |
|
|
|
|
unsigned *pending; |
|
|
|
|
int *bits; |
|
|
|
|
z_streamp strm; |
|
|
|
@ -579,7 +579,7 @@ int ZEXPORT deflatePending (strm, pending, bits) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflatePrime (strm, bits, value) |
|
|
|
|
int ZEXPORT deflatePrime(strm, bits, value) |
|
|
|
|
z_streamp strm; |
|
|
|
|
int bits; |
|
|
|
|
int value; |
|
|
|
@ -769,7 +769,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) |
|
|
|
|
* IN assertion: the stream state is correct and there is enough room in |
|
|
|
|
* pending_buf. |
|
|
|
|
*/ |
|
|
|
|
local void putShortMSB (s, b) |
|
|
|
|
local void putShortMSB(s, b) |
|
|
|
|
deflate_state *s; |
|
|
|
|
uInt b; |
|
|
|
|
{ |
|
|
|
@ -816,7 +816,7 @@ local void flush_pending(strm) |
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflate (strm, flush) |
|
|
|
|
int ZEXPORT deflate(strm, flush) |
|
|
|
|
z_streamp strm; |
|
|
|
|
int flush; |
|
|
|
|
{ |
|
|
|
@ -871,7 +871,7 @@ int ZEXPORT deflate (strm, flush) |
|
|
|
|
s->status = BUSY_STATE; |
|
|
|
|
if (s->status == INIT_STATE) { |
|
|
|
|
/* zlib header */ |
|
|
|
|
uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; |
|
|
|
|
uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; |
|
|
|
|
uInt level_flags; |
|
|
|
|
|
|
|
|
|
if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) |
|
|
|
@ -1131,7 +1131,7 @@ int ZEXPORT deflate (strm, flush) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
int ZEXPORT deflateEnd (strm) |
|
|
|
|
int ZEXPORT deflateEnd(strm) |
|
|
|
|
z_streamp strm; |
|
|
|
|
{ |
|
|
|
|
int status; |
|
|
|
@ -1157,7 +1157,7 @@ int ZEXPORT deflateEnd (strm) |
|
|
|
|
* To simplify the source, this is not supported for 16-bit MSDOS (which |
|
|
|
|
* doesn't have enough memory anyway to duplicate compression states). |
|
|
|
|
*/ |
|
|
|
|
int ZEXPORT deflateCopy (dest, source) |
|
|
|
|
int ZEXPORT deflateCopy(dest, source) |
|
|
|
|
z_streamp dest; |
|
|
|
|
z_streamp source; |
|
|
|
|
{ |
|
|
|
@ -1246,7 +1246,7 @@ local unsigned read_buf(strm, buf, size) |
|
|
|
|
/* ===========================================================================
|
|
|
|
|
* Initialize the "longest match" routines for a new zlib stream |
|
|
|
|
*/ |
|
|
|
|
local void lm_init (s) |
|
|
|
|
local void lm_init(s) |
|
|
|
|
deflate_state *s; |
|
|
|
|
{ |
|
|
|
|
s->window_size = (ulg)2L*s->w_size; |
|
|
|
@ -1312,10 +1312,10 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
*/ |
|
|
|
|
register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; |
|
|
|
|
register ush scan_start = *(ushf*)scan; |
|
|
|
|
register ush scan_end = *(ushf*)(scan+best_len-1); |
|
|
|
|
register ush scan_end = *(ushf*)(scan + best_len - 1); |
|
|
|
|
#else |
|
|
|
|
register Bytef *strend = s->window + s->strstart + MAX_MATCH; |
|
|
|
|
register Byte scan_end1 = scan[best_len-1]; |
|
|
|
|
register Byte scan_end1 = scan[best_len - 1]; |
|
|
|
|
register Byte scan_end = scan[best_len]; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
@ -1333,7 +1333,8 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
*/ |
|
|
|
|
if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; |
|
|
|
|
|
|
|
|
|
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); |
|
|
|
|
Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, |
|
|
|
|
"need lookahead"); |
|
|
|
|
|
|
|
|
|
do { |
|
|
|
|
Assert(cur_match < s->strstart, "no future"); |
|
|
|
@ -1351,43 +1352,44 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
/* This code assumes sizeof(unsigned short) == 2. Do not use
|
|
|
|
|
* UNALIGNED_OK if your compiler uses a different size. |
|
|
|
|
*/ |
|
|
|
|
if (*(ushf*)(match+best_len-1) != scan_end || |
|
|
|
|
if (*(ushf*)(match + best_len - 1) != scan_end || |
|
|
|
|
*(ushf*)match != scan_start) continue; |
|
|
|
|
|
|
|
|
|
/* It is not necessary to compare scan[2] and match[2] since they are
|
|
|
|
|
* always equal when the other bytes match, given that the hash keys |
|
|
|
|
* are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at |
|
|
|
|
* strstart+3, +5, ... up to strstart+257. We check for insufficient |
|
|
|
|
* strstart + 3, + 5, up to strstart + 257. We check for insufficient |
|
|
|
|
* lookahead only every 4th comparison; the 128th check will be made |
|
|
|
|
* at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is |
|
|
|
|
* at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is |
|
|
|
|
* necessary to put more guard bytes at the end of the window, or |
|
|
|
|
* to check more often for insufficient lookahead. |
|
|
|
|
*/ |
|
|
|
|
Assert(scan[2] == match[2], "scan[2]?"); |
|
|
|
|
scan++, match++; |
|
|
|
|
do { |
|
|
|
|
} while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && |
|
|
|
|
*(ushf*)(scan+=2) == *(ushf*)(match+=2) && |
|
|
|
|
*(ushf*)(scan+=2) == *(ushf*)(match+=2) && |
|
|
|
|
*(ushf*)(scan+=2) == *(ushf*)(match+=2) && |
|
|
|
|
} while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) && |
|
|
|
|
*(ushf*)(scan += 2) == *(ushf*)(match += 2) && |
|
|
|
|
*(ushf*)(scan += 2) == *(ushf*)(match += 2) && |
|
|
|
|
*(ushf*)(scan += 2) == *(ushf*)(match += 2) && |
|
|
|
|
scan < strend); |
|
|
|
|
/* The funny "do {}" generates better code on most compilers */ |
|
|
|
|
|
|
|
|
|
/* Here, scan <= window+strstart+257 */ |
|
|
|
|
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); |
|
|
|
|
/* Here, scan <= window + strstart + 257 */ |
|
|
|
|
Assert(scan <= s->window + (unsigned)(s->window_size - 1), |
|
|
|
|
"wild scan"); |
|
|
|
|
if (*scan == *match) scan++; |
|
|
|
|
|
|
|
|
|
len = (MAX_MATCH - 1) - (int)(strend-scan); |
|
|
|
|
len = (MAX_MATCH - 1) - (int)(strend - scan); |
|
|
|
|
scan = strend - (MAX_MATCH-1); |
|
|
|
|
|
|
|
|
|
#else /* UNALIGNED_OK */ |
|
|
|
|
|
|
|
|
|
if (match[best_len] != scan_end || |
|
|
|
|
match[best_len-1] != scan_end1 || |
|
|
|
|
*match != *scan || |
|
|
|
|
*++match != scan[1]) continue; |
|
|
|
|
if (match[best_len] != scan_end || |
|
|
|
|
match[best_len - 1] != scan_end1 || |
|
|
|
|
*match != *scan || |
|
|
|
|
*++match != scan[1]) continue; |
|
|
|
|
|
|
|
|
|
/* The check at best_len-1 can be removed because it will be made
|
|
|
|
|
/* The check at best_len - 1 can be removed because it will be made
|
|
|
|
|
* again later. (This heuristic is not always a win.) |
|
|
|
|
* It is not necessary to compare scan[2] and match[2] since they |
|
|
|
|
* are always equal when the other bytes match, given that |
|
|
|
@ -1397,7 +1399,7 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
Assert(*scan == *match, "match[2]?"); |
|
|
|
|
|
|
|
|
|
/* We check for insufficient lookahead only every 8th comparison;
|
|
|
|
|
* the 256th check will be made at strstart+258. |
|
|
|
|
* the 256th check will be made at strstart + 258. |
|
|
|
|
*/ |
|
|
|
|
do { |
|
|
|
|
} while (*++scan == *++match && *++scan == *++match && |
|
|
|
@ -1406,7 +1408,8 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
*++scan == *++match && *++scan == *++match && |
|
|
|
|
scan < strend); |
|
|
|
|
|
|
|
|
|
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); |
|
|
|
|
Assert(scan <= s->window + (unsigned)(s->window_size - 1), |
|
|
|
|
"wild scan"); |
|
|
|
|
|
|
|
|
|
len = MAX_MATCH - (int)(strend - scan); |
|
|
|
|
scan = strend - MAX_MATCH; |
|
|
|
@ -1418,9 +1421,9 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
best_len = len; |
|
|
|
|
if (len >= nice_match) break; |
|
|
|
|
#ifdef UNALIGNED_OK |
|
|
|
|
scan_end = *(ushf*)(scan+best_len-1); |
|
|
|
|
scan_end = *(ushf*)(scan + best_len - 1); |
|
|
|
|
#else |
|
|
|
|
scan_end1 = scan[best_len-1]; |
|
|
|
|
scan_end1 = scan[best_len - 1]; |
|
|
|
|
scan_end = scan[best_len]; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
@ -1451,7 +1454,8 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
*/ |
|
|
|
|
Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); |
|
|
|
|
|
|
|
|
|
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); |
|
|
|
|
Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, |
|
|
|
|
"need lookahead"); |
|
|
|
|
|
|
|
|
|
Assert(cur_match < s->strstart, "no future"); |
|
|
|
|
|
|
|
|
@ -1461,7 +1465,7 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
*/ |
|
|
|
|
if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; |
|
|
|
|
|
|
|
|
|
/* The check at best_len-1 can be removed because it will be made
|
|
|
|
|
/* The check at best_len - 1 can be removed because it will be made
|
|
|
|
|
* again later. (This heuristic is not always a win.) |
|
|
|
|
* It is not necessary to compare scan[2] and match[2] since they |
|
|
|
|
* are always equal when the other bytes match, given that |
|
|
|
@ -1471,7 +1475,7 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
Assert(*scan == *match, "match[2]?"); |
|
|
|
|
|
|
|
|
|
/* We check for insufficient lookahead only every 8th comparison;
|
|
|
|
|
* the 256th check will be made at strstart+258. |
|
|
|
|
* the 256th check will be made at strstart + 258. |
|
|
|
|
*/ |
|
|
|
|
do { |
|
|
|
|
} while (*++scan == *++match && *++scan == *++match && |
|
|
|
@ -1480,7 +1484,7 @@ local uInt longest_match(s, cur_match) |
|
|
|
|
*++scan == *++match && *++scan == *++match && |
|
|
|
|
scan < strend); |
|
|
|
|
|
|
|
|
|
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); |
|
|
|
|
Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); |
|
|
|
|
|
|
|
|
|
len = MAX_MATCH - (int)(strend - scan); |
|
|
|
|
|
|
|
|
@ -1516,7 +1520,7 @@ local void check_match(s, start, match, length) |
|
|
|
|
z_error("invalid match"); |
|
|
|
|
} |
|
|
|
|
if (z_verbose > 1) { |
|
|
|
|
fprintf(stderr,"\\[%d,%d]", start-match, length); |
|
|
|
|
fprintf(stderr,"\\[%d,%d]", start - match, length); |
|
|
|
|
do { putc(s->window[start++], stderr); } while (--length != 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1562,9 +1566,9 @@ local void fill_window(s) |
|
|
|
|
/* If the window is almost full and there is insufficient lookahead,
|
|
|
|
|
* move the upper half to the lower one to make room in the upper half. |
|
|
|
|
*/ |
|
|
|
|
if (s->strstart >= wsize+MAX_DIST(s)) { |
|
|
|
|
if (s->strstart >= wsize + MAX_DIST(s)) { |
|
|
|
|
|
|
|
|
|
zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); |
|
|
|
|
zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); |
|
|
|
|
s->match_start -= wsize; |
|
|
|
|
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ |
|
|
|
|
s->block_start -= (long) wsize; |
|
|
|
@ -1905,7 +1909,7 @@ local block_state deflate_fast(s, flush) |
|
|
|
|
if (s->lookahead == 0) break; /* flush the current block */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Insert the string window[strstart .. strstart+2] in the
|
|
|
|
|
/* Insert the string window[strstart .. strstart + 2] in the
|
|
|
|
|
* dictionary, and set hash_head to the head of the hash chain: |
|
|
|
|
*/ |
|
|
|
|
hash_head = NIL; |
|
|
|
@ -1953,7 +1957,7 @@ local block_state deflate_fast(s, flush) |
|
|
|
|
s->strstart += s->match_length; |
|
|
|
|
s->match_length = 0; |
|
|
|
|
s->ins_h = s->window[s->strstart]; |
|
|
|
|
UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); |
|
|
|
|
UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); |
|
|
|
|
#if MIN_MATCH != 3 |
|
|
|
|
Call UPDATE_HASH() MIN_MATCH-3 more times |
|
|
|
|
#endif |
|
|
|
@ -1964,7 +1968,7 @@ local block_state deflate_fast(s, flush) |
|
|
|
|
} else { |
|
|
|
|
/* No match, output a literal byte */ |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart])); |
|
|
|
|
_tr_tally_lit (s, s->window[s->strstart], bflush); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart], bflush); |
|
|
|
|
s->lookahead--; |
|
|
|
|
s->strstart++; |
|
|
|
|
} |
|
|
|
@ -2008,7 +2012,7 @@ local block_state deflate_slow(s, flush) |
|
|
|
|
if (s->lookahead == 0) break; /* flush the current block */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Insert the string window[strstart .. strstart+2] in the
|
|
|
|
|
/* Insert the string window[strstart .. strstart + 2] in the
|
|
|
|
|
* dictionary, and set hash_head to the head of the hash chain: |
|
|
|
|
*/ |
|
|
|
|
hash_head = NIL; |
|
|
|
@ -2050,17 +2054,17 @@ local block_state deflate_slow(s, flush) |
|
|
|
|
uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; |
|
|
|
|
/* Do not insert strings in hash table beyond this. */ |
|
|
|
|
|
|
|
|
|
check_match(s, s->strstart-1, s->prev_match, s->prev_length); |
|
|
|
|
check_match(s, s->strstart - 1, s->prev_match, s->prev_length); |
|
|
|
|
|
|
|
|
|
_tr_tally_dist(s, s->strstart -1 - s->prev_match, |
|
|
|
|
_tr_tally_dist(s, s->strstart - 1 - s->prev_match, |
|
|
|
|
s->prev_length - MIN_MATCH, bflush); |
|
|
|
|
|
|
|
|
|
/* Insert in hash table all strings up to the end of the match.
|
|
|
|
|
* strstart-1 and strstart are already inserted. If there is not |
|
|
|
|
* strstart - 1 and strstart are already inserted. If there is not |
|
|
|
|
* enough lookahead, the last two strings are not inserted in |
|
|
|
|
* the hash table. |
|
|
|
|
*/ |
|
|
|
|
s->lookahead -= s->prev_length-1; |
|
|
|
|
s->lookahead -= s->prev_length - 1; |
|
|
|
|
s->prev_length -= 2; |
|
|
|
|
do { |
|
|
|
|
if (++s->strstart <= max_insert) { |
|
|
|
@ -2078,8 +2082,8 @@ local block_state deflate_slow(s, flush) |
|
|
|
|
* single literal. If there was a match but the current match |
|
|
|
|
* is longer, truncate the previous match to a single literal. |
|
|
|
|
*/ |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart-1])); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart-1], bflush); |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart - 1])); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart - 1], bflush); |
|
|
|
|
if (bflush) { |
|
|
|
|
FLUSH_BLOCK_ONLY(s, 0); |
|
|
|
|
} |
|
|
|
@ -2097,8 +2101,8 @@ local block_state deflate_slow(s, flush) |
|
|
|
|
} |
|
|
|
|
Assert (flush != Z_NO_FLUSH, "no flush?"); |
|
|
|
|
if (s->match_available) { |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart-1])); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart-1], bflush); |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart - 1])); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart - 1], bflush); |
|
|
|
|
s->match_available = 0; |
|
|
|
|
} |
|
|
|
|
s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; |
|
|
|
@ -2155,7 +2159,8 @@ local block_state deflate_rle(s, flush) |
|
|
|
|
if (s->match_length > s->lookahead) |
|
|
|
|
s->match_length = s->lookahead; |
|
|
|
|
} |
|
|
|
|
Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); |
|
|
|
|
Assert(scan <= s->window + (uInt)(s->window_size - 1), |
|
|
|
|
"wild scan"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Emit match if have run of MIN_MATCH or longer, else emit literal */ |
|
|
|
@ -2170,7 +2175,7 @@ local block_state deflate_rle(s, flush) |
|
|
|
|
} else { |
|
|
|
|
/* No match, output a literal byte */ |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart])); |
|
|
|
|
_tr_tally_lit (s, s->window[s->strstart], bflush); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart], bflush); |
|
|
|
|
s->lookahead--; |
|
|
|
|
s->strstart++; |
|
|
|
|
} |
|
|
|
@ -2210,7 +2215,7 @@ local block_state deflate_huff(s, flush) |
|
|
|
|
/* Output a literal byte */ |
|
|
|
|
s->match_length = 0; |
|
|
|
|
Tracevv((stderr,"%c", s->window[s->strstart])); |
|
|
|
|
_tr_tally_lit (s, s->window[s->strstart], bflush); |
|
|
|
|
_tr_tally_lit(s, s->window[s->strstart], bflush); |
|
|
|
|
s->lookahead--; |
|
|
|
|
s->strstart++; |
|
|
|
|
if (bflush) FLUSH_BLOCK(s, 0); |
|
|
|
|