]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Revert "Clean up insert_match() in deflate_medium"
authorHans Kristian Rosbach <hk-git@circlestorm.org>
Sat, 12 Jul 2025 10:48:03 +0000 (12:48 +0200)
committerHans Kristian Rosbach <hk-git@circlestorm.org>
Sat, 12 Jul 2025 10:48:03 +0000 (12:48 +0200)
This reverts commit 56d3d9851a824aeb921c9853042776866aa195a3.

deflate_medium.c

index 2aeebe2026bda85d39e991cbf725e5fed4142cad..ca334e4b3558013fd71a6adee5112c643af401f1 100644 (file)
@@ -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) {