]> wimlib.net Git - wimlib/blobdiff - src/compress.c
lzx-compress.c: Faster extension of repeat offset matches
[wimlib] / src / compress.c
index bea8ea5a2c79c500437e5419b32e517e83fef539..aed609aa7aff560a05e11a2021af3fabdb227749 100644 (file)
@@ -65,10 +65,9 @@ compressor_ctype_valid(int ctype)
 }
 
 WIMLIBAPI int
-wimlib_set_default_compression_level(enum wimlib_compression_type ctype,
-                                    unsigned int compression_level)
+wimlib_set_default_compression_level(int ctype, unsigned int compression_level)
 {
-       if ((int)ctype == -1) {
+       if (ctype == -1) {
                for (int i = 0; i < ARRAY_LEN(default_compression_levels); i++)
                        default_compression_levels[i] = compression_level;
        } else {
@@ -91,6 +90,9 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype,
        if (!compressor_ctype_valid(ctype))
                return 0;
 
+       if (max_block_size == 0)
+               return 0;
+
        ops = compressor_ops[ctype];
 
        if (compression_level == 0)
@@ -98,10 +100,16 @@ wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype,
        if (compression_level == 0)
                compression_level = DEFAULT_COMPRESSION_LEVEL;
 
-       size = sizeof(struct wimlib_compressor);
-       if (ops->get_needed_memory)
-               size += ops->get_needed_memory(max_block_size, compression_level);
-       return size;
+       if (ops->get_needed_memory) {
+               size = ops->get_needed_memory(max_block_size, compression_level);
+
+               /* 0 is never valid and indicates an invalid max_block_size.  */
+               if (size == 0)
+                       return 0;
+       } else {
+               size = 0;
+       }
+       return size + sizeof(struct wimlib_compressor);
 }
 
 WIMLIBAPI int
@@ -112,15 +120,15 @@ wimlib_create_compressor(enum wimlib_compression_type ctype,
 {
        struct wimlib_compressor *c;
 
+       if (!compressor_ctype_valid(ctype))
+               return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
+
        if (c_ret == NULL)
                return WIMLIB_ERR_INVALID_PARAM;
 
        if (max_block_size == 0)
                return WIMLIB_ERR_INVALID_PARAM;
 
-       if (!compressor_ctype_valid(ctype))
-               return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
-
        c = MALLOC(sizeof(*c));
        if (c == NULL)
                return WIMLIB_ERR_NOMEM;
@@ -155,7 +163,8 @@ wimlib_compress(const void *uncompressed_data, size_t uncompressed_size,
 {
        size_t compressed_size;
 
-       wimlib_assert(uncompressed_size <= c->max_block_size);
+       if (unlikely(uncompressed_size == 0 || uncompressed_size > c->max_block_size))
+               return 0;
 
        compressed_size = c->ops->compress(uncompressed_data,
                                           uncompressed_size,