]> wimlib.net Git - wimlib/blobdiff - src/compress.c
win32_capture.c: Fix exclusion when capture path ends in slash
[wimlib] / src / compress.c
index a3c95b0f5d965fa07dec7b36e307eb9feb28d8ee..039836af5c8f19d62b954c5e79ea537762bca109 100644 (file)
@@ -38,8 +38,8 @@ struct wimlib_compressor {
 };
 
 static const struct compressor_ops *compressor_ops[] = {
-       [WIMLIB_COMPRESSION_TYPE_LZX]    = &lzx_compressor_ops,
        [WIMLIB_COMPRESSION_TYPE_XPRESS] = &xpress_compressor_ops,
+       [WIMLIB_COMPRESSION_TYPE_LZX]    = &lzx_compressor_ops,
        [WIMLIB_COMPRESSION_TYPE_LZMS]   = &lzms_compressor_ops,
 };
 
@@ -64,6 +64,11 @@ wimlib_set_default_compressor_params(enum wimlib_compression_type ctype,
        if (!compressor_ctype_valid(ctype))
                return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
 
+       if (params != NULL &&
+           compressor_ops[ctype]->params_valid != NULL &&
+           !compressor_ops[ctype]->params_valid(params))
+               return WIMLIB_ERR_INVALID_PARAM;
+
        dup = NULL;
        if (params) {
                dup = memdup(params, params->size);
@@ -85,6 +90,35 @@ cleanup_compressor_params(void)
        }
 }
 
+WIMLIBAPI u64
+wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype,
+                                   size_t max_block_size,
+                                   const struct wimlib_compressor_params_header *extra_params)
+{
+       const struct compressor_ops *ops;
+       const struct wimlib_compressor_params_header *params;
+       u64 size;
+
+       if (!compressor_ctype_valid(ctype))
+               return 0;
+
+       ops = compressor_ops[ctype];
+
+       if (extra_params) {
+               params = extra_params;
+               if (ops->params_valid && !ops->params_valid(params))
+                       return 0;
+       } else {
+               params = compressor_default_params[ctype];
+       }
+
+       size = sizeof(struct wimlib_compressor);
+       if (ops->get_needed_memory)
+               size += ops->get_needed_memory(max_block_size, params);
+       return size;
+}
+
+
 WIMLIBAPI int
 wimlib_create_compressor(enum wimlib_compression_type ctype,
                         size_t max_block_size,
@@ -108,10 +142,15 @@ wimlib_create_compressor(enum wimlib_compression_type ctype,
                const struct wimlib_compressor_params_header *params;
                int ret;
 
-               if (extra_params)
+               if (extra_params) {
                        params = extra_params;
-               else
+                       if (c->ops->params_valid && !c->ops->params_valid(params)) {
+                               FREE(c);
+                               return WIMLIB_ERR_INVALID_PARAM;
+                       }
+               } else {
                        params = compressor_default_params[ctype];
+               }
                ret = c->ops->create_compressor(max_block_size,
                                                params, &c->private);
                if (ret) {