From: Hans Kristian Rosbach Date: Sat, 12 Jul 2025 10:48:03 +0000 (+0200) Subject: Revert "Clean up insert_match() in deflate_medium" X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb7dc6cfa9e276cc6a68671a9377dd9f82851d5f;p=thirdparty%2Fzlib-ng.git Revert "Clean up insert_match() in deflate_medium" This reverts commit 56d3d9851a824aeb921c9853042776866aa195a3. --- diff --git a/deflate_medium.c b/deflate_medium.c index 2aeebe20..ca334e4b 100644 --- a/deflate_medium.c +++ b/deflate_medium.c @@ -45,12 +45,10 @@ static void insert_match(deflate_state *s, struct match match) { if (UNLIKELY(s->lookahead <= (unsigned int)(match.match_length + WANT_MIN_MATCH))) return; - /* string at strstart already in table */ - match.strstart++; - match.match_length--; - /* matches that are not long enough we need to emit as literals */ - if (LIKELY(match.match_length < WANT_MIN_MATCH - 1)) { + if (LIKELY(match.match_length < WANT_MIN_MATCH)) { + match.strstart++; + match.match_length--; if (UNLIKELY(match.match_length > 0)) { if (match.strstart >= match.orgstart) { if (match.strstart + match.match_length - 1 >= match.orgstart) { @@ -65,18 +63,33 @@ static void insert_match(deflate_state *s, struct match match) { return; } - /* Insert into hash table. */ - if (LIKELY(match.strstart >= match.orgstart)) { - if (LIKELY(match.strstart + match.match_length - 1 >= match.orgstart)) { - insert_string(s, match.strstart, match.match_length); - } else { - insert_string(s, match.strstart, match.orgstart - match.strstart + 1); + /* Insert new strings in the hash table. */ + if (s->lookahead >= WANT_MIN_MATCH) { + match.match_length--; /* string at strstart already in table */ + match.strstart++; + + if (LIKELY(match.strstart >= match.orgstart)) { + if (LIKELY(match.strstart + match.match_length - 1 >= match.orgstart)) { + insert_string(s, match.strstart, match.match_length); + } else { + insert_string(s, match.strstart, match.orgstart - match.strstart + 1); + } + } else if (match.orgstart < match.strstart + match.match_length) { + insert_string(s, match.orgstart, match.strstart + match.match_length - match.orgstart); } - } else if (match.orgstart < match.strstart + match.match_length) { - insert_string(s, match.orgstart, match.strstart + match.match_length - match.orgstart); + match.strstart += match.match_length; + match.match_length = 0; + } else { + match.strstart += match.match_length; + match.match_length = 0; + + if (match.strstart >= (STD_MIN_MATCH - 2)) + quick_insert_string(s, match.strstart + 2 - STD_MIN_MATCH); + + /* If lookahead < WANT_MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ } - match.strstart += match.match_length; - match.match_length = 0; } static void fizzle_matches(deflate_state *s, struct match *current, struct match *next) {