]> wimlib.net Git - wimlib/blobdiff - src/xpress_compress.c
WIMBoot / system compression: try WOFADK in addition to WOF
[wimlib] / src / xpress_compress.c
index 65c4b026627bdeaf912b29e04cdba435779f7cef..6750160450ae76ec8fa4991f78867f89eea147fe 100644 (file)
@@ -1031,7 +1031,8 @@ xpress_get_compressor_size(size_t max_bufsize, unsigned compression_level)
 }
 
 static u64
-xpress_get_needed_memory(size_t max_bufsize, unsigned compression_level)
+xpress_get_needed_memory(size_t max_bufsize, unsigned compression_level,
+                        bool destructive)
 {
        u64 size = 0;
 
@@ -1060,7 +1061,7 @@ xpress_get_needed_memory(size_t max_bufsize, unsigned compression_level)
 
 static int
 xpress_create_compressor(size_t max_bufsize, unsigned compression_level,
-                        void **c_ret)
+                        bool destructive, void **c_ret)
 {
        struct xpress_compressor *c;
 
@@ -1088,6 +1089,13 @@ xpress_create_compressor(size_t max_bufsize, unsigned compression_level,
                        c->impl = xpress_compress_lazy;
                        c->max_search_depth = (compression_level * 24) / 32;
                        c->nice_match_length = (compression_level * 48) / 32;
+
+                       /* xpress_compress_lazy() needs max_search_depth >= 2
+                        * because it halves the max_search_depth when
+                        * attempting a lazy match, and max_search_depth cannot
+                        * be 0.  */
+                       if (c->max_search_depth < 2)
+                               c->max_search_depth = 2;
                }
        }
 #if SUPPORT_NEAR_OPTIMAL_PARSING
@@ -1113,6 +1121,10 @@ xpress_create_compressor(size_t max_bufsize, unsigned compression_level,
        }
 #endif /* SUPPORT_NEAR_OPTIMAL_PARSING */
 
+       /* max_search_depth == 0 is invalid.  */
+       if (c->max_search_depth < 1)
+               c->max_search_depth = 1;
+
        *c_ret = c;
        return 0;
 
@@ -1123,8 +1135,8 @@ oom0:
 }
 
 static size_t
-xpress_compress(const void *in, size_t in_nbytes,
-               void *out, size_t out_nbytes_avail, void *_c)
+xpress_compress(const void *restrict in, size_t in_nbytes,
+               void *restrict out, size_t out_nbytes_avail, void *restrict _c)
 {
        struct xpress_compressor *c = _c;