#define MIN_LEVEL_FOR_NEAR_OPTIMAL 60
/*
- * The maximum window order for the matchfinder. This must be the base 2
- * logarithm of the maximum buffer size.
+ * Matchfinder definitions. For XPRESS, only a 16-bit matchfinder is needed.
*/
-#define MATCHFINDER_MAX_WINDOW_ORDER 16
+#define mf_pos_t u16
+#define MF_SUFFIX
/*
* Note: although XPRESS can potentially use a sliding window, it isn't well
* optimizations.
*/
-#include <string.h>
-
#include "wimlib/bitops.h"
#include "wimlib/compress_common.h"
#include "wimlib/compressor_ops.h"
const u8 * const in_end = in_begin + in_nbytes;
struct xpress_item *next_chosen_item = c->chosen_items;
unsigned len_3_too_far;
+ u32 next_hashes[2] = {};
if (in_nbytes <= 8192)
len_3_too_far = 2048;
length = hc_matchfinder_longest_match(&c->hc_mf,
in_begin,
- in_next,
+ in_next - in_begin,
XPRESS_MIN_MATCH_LEN - 1,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
c->max_search_depth,
+ next_hashes,
&offset);
if (length >= XPRESS_MIN_MATCH_LEN &&
!(length == XPRESS_MIN_MATCH_LEN && offset >= len_3_too_far))
in_next += 1;
hc_matchfinder_skip_positions(&c->hc_mf,
in_begin,
- in_next,
- in_end,
- length - 1);
+ in_next - in_begin,
+ in_end - in_begin,
+ length - 1,
+ next_hashes);
in_next += length - 1;
} else {
/* No match found */
const u8 * const in_end = in_begin + in_nbytes;
struct xpress_item *next_chosen_item = c->chosen_items;
unsigned len_3_too_far;
+ u32 next_hashes[2] = {};
if (in_nbytes <= 8192)
len_3_too_far = 2048;
/* Find the longest match at the current position. */
cur_len = hc_matchfinder_longest_match(&c->hc_mf,
in_begin,
- in_next,
+ in_next - in_begin,
XPRESS_MIN_MATCH_LEN - 1,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
c->max_search_depth,
+ next_hashes,
&cur_offset);
in_next += 1;
hc_matchfinder_skip_positions(&c->hc_mf,
in_begin,
- in_next,
- in_end,
- cur_len - 1);
+ in_next - in_begin,
+ in_end - in_begin,
+ cur_len - 1,
+ next_hashes);
in_next += cur_len - 1;
continue;
}
*/
next_len = hc_matchfinder_longest_match(&c->hc_mf,
in_begin,
- in_next,
+ in_next - in_begin,
cur_len,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
c->max_search_depth / 2,
+ next_hashes,
&next_offset);
in_next += 1;
xpress_record_match(c, cur_len, cur_offset);
hc_matchfinder_skip_positions(&c->hc_mf,
in_begin,
- in_next,
- in_end,
- cur_len - 2);
+ in_next - in_begin,
+ in_end - in_begin,
+ cur_len - 2,
+ next_hashes);
in_next += cur_len - 2;
continue;
}
const u8 *in_next = in_begin;
const u8 * const in_end = in_begin + in_nbytes;
struct lz_match *cache_ptr = c->match_cache;
- u32 next_hash;
+ u32 next_hash = 0;
bt_matchfinder_init(&c->bt_mf);
- next_hash = bt_matchfinder_hash_3_bytes(in_next);
do {
struct lz_match *matches;
cache_ptr =
bt_matchfinder_get_matches(&c->bt_mf,
in_begin,
- in_next,
- XPRESS_MIN_MATCH_LEN,
+ in_next - in_begin,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
c->max_search_depth,
do {
bt_matchfinder_skip_position(&c->bt_mf,
in_begin,
- in_next,
- in_end,
+ in_next - in_begin,
+ in_end - in_next,
min(in_end - in_next,
c->nice_match_length),
c->max_search_depth,
if (max_bufsize > XPRESS_MAX_BUFSIZE)
return WIMLIB_ERR_INVALID_PARAM;
- c = ALIGNED_MALLOC(xpress_get_compressor_size(max_bufsize, compression_level),
- MATCHFINDER_ALIGNMENT);
+ c = MALLOC(xpress_get_compressor_size(max_bufsize, compression_level));
if (!c)
goto oom0;
return 0;
oom1:
- ALIGNED_FREE(c);
+ FREE(c);
oom0:
return WIMLIB_ERR_NOMEM;
}
} else
#endif
FREE(c->chosen_items);
- ALIGNED_FREE(c);
+ FREE(c);
}
const struct compressor_ops xpress_compressor_ops = {