#include "wimlib/compressor_ops.h"
#include "wimlib/compress_common.h"
#include "wimlib/error.h"
+#include "wimlib/lz_hash.h"
#include "wimlib/util.h"
#include "wimlib/xpress.h"
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#endif
-#include <stdlib.h>
#include <string.h>
struct xpress_record_ctx {
u32 max_window_size;
struct xpress_match *matches;
input_idx_t *prev_tab;
- u16 codewords[XPRESS_NUM_SYMBOLS];
+ u32 codewords[XPRESS_NUM_SYMBOLS];
u8 lens[XPRESS_NUM_SYMBOLS];
struct xpress_record_ctx record_ctx;
};
static void
xpress_write_match(struct xpress_match match,
struct output_bitstream *restrict ostream,
- const u16 codewords[restrict],
+ const u32 codewords[restrict],
const u8 lens[restrict])
{
u8 len_hdr = min(match.adjusted_len, 0xf);
xpress_write_matches_and_literals(struct output_bitstream *ostream,
const struct xpress_match matches[restrict],
input_idx_t num_matches,
- const u16 codewords[restrict],
+ const u32 codewords[restrict],
const u8 lens[restrict])
{
for (input_idx_t i = 0; i < num_matches; i++) {
return WIMLIB_ERR_NOMEM;
}
+static u64
+xpress_get_needed_memory(size_t max_window_size,
+ const struct wimlib_compressor_params_header *params)
+{
+ u64 size = 0;
+
+ size += sizeof(struct xpress_compressor);
+ size += max_window_size + 8;
+ size += max_window_size * sizeof(((struct xpress_compressor*)0)->matches[0]);
+ size += max_window_size * sizeof(((struct xpress_compressor*)0)->prev_tab[0]);
+
+ return size;
+}
+
const struct compressor_ops xpress_compressor_ops = {
+ .get_needed_memory = xpress_get_needed_memory,
.create_compressor = xpress_create_compressor,
.compress = xpress_compress,
.free_compressor = xpress_free_compressor,