for (u32 j = 0; j < LZMS_COST_SHIFT; j++) {
w *= w;
bit_count <<= 1;
- while (w >= (1U << 16)) {
+ while (w >= ((u32)1 << 16)) {
w >>= 1;
++bit_count;
}
len = 2;
i = 0;
do {
- position_cost = base_cost + lzms_lz_offset_cost(c,
- matches[i].offset);
+ position_cost = base_cost + lzms_lz_offset_cost(c, matches[i].offset);
do {
cost = position_cost + lzms_fast_length_cost(c, len);
if (cost < (cur_optimum_ptr + len)->cost) {
* the parser will not go too long without updating the
* probability tables.
*
- * Note: no check for end-of-block is needed because
- * end-of-block will trigger condition (1).
+ * Note: no check for end-of-window is needed because
+ * end-of-window will trigger condition (1).
*/
if (cur_optimum_ptr == end_optimum_ptr ||
cur_optimum_ptr == c->optimum_end)
* maximum window size. */
static void
lzms_build_params(unsigned int compression_level,
- struct lzms_compressor_params *lzms_params)
+ struct lzms_compressor_params *params)
{
/* Allow length 2 matches if the compression level is sufficiently high.
*/
if (compression_level >= 45)
- lzms_params->min_match_length = 2;
+ params->min_match_length = 2;
else
- lzms_params->min_match_length = 3;
+ params->min_match_length = 3;
/* Scale nice_match_length and max_search_depth with the compression
* level. But to allow an optimization on length cost calculations,
* don't allow nice_match_length to exceed LZMS_NUM_FAST_LENGTH. */
- lzms_params->nice_match_length = ((u64)compression_level * 32) / 50;
- if (lzms_params->nice_match_length < lzms_params->min_match_length)
- lzms_params->nice_match_length = lzms_params->min_match_length;
- if (lzms_params->nice_match_length > LZMS_NUM_FAST_LENGTHS)
- lzms_params->nice_match_length = LZMS_NUM_FAST_LENGTHS;
- lzms_params->max_search_depth = compression_level;
-
- lzms_params->optim_array_length = 1024;
+ params->nice_match_length = ((u64)compression_level * 32) / 50;
+ if (params->nice_match_length < params->min_match_length)
+ params->nice_match_length = params->min_match_length;
+ if (params->nice_match_length > LZMS_NUM_FAST_LENGTHS)
+ params->nice_match_length = LZMS_NUM_FAST_LENGTHS;
+ params->max_search_depth = compression_level;
+
+ params->optim_array_length = 1024;
}
/* Given the internal compression parameters and maximum window size, build the
{
unsigned order;
- if (max_block_size == 0 || max_block_size > (1 << LZX_MAX_WINDOW_ORDER))
+ if (max_block_size == 0 || max_block_size > LZX_MAX_WINDOW_SIZE)
return 0;
order = bsr32(max_block_size);
- if ((1 << order) != max_block_size)
+ if (((u32)1 << order) != max_block_size)
order++;
return max(order, LZX_MIN_WINDOW_ORDER);
unsigned
lzx_get_num_main_syms(unsigned window_order)
{
- u32 window_size = 1 << window_order;
+ u32 window_size = (u32)1 << window_order;
/* NOTE: the calculation *should* be as follows:
*
* offset.
*/
static inline unsigned
-lzx_get_matches(struct lzx_compressor *c,
- const struct lz_match **matches_ret)
+lzx_get_matches(struct lzx_compressor *c, const struct lz_match **matches_ret)
{
return (*c->get_matches_func)(c, matches_ret);
}
unsigned main_symbol;
if (len - LZX_MIN_MATCH_LEN < LZX_NUM_PRIMARY_LENS) {
- len_header = len - LZX_MIN_MATCH_LEN ;
+ len_header = len - LZX_MIN_MATCH_LEN;
cost = 0;
} else {
len_header = LZX_NUM_PRIMARY_LENS;
lzx_choose_verbatim_or_aligned(const struct lzx_freqs * freqs,
const struct lzx_codes * codes)
{
- unsigned aligned_cost = 0;
- unsigned verbatim_cost = 0;
+ u32 aligned_cost = 0;
+ u32 verbatim_cost = 0;
- /* A verbatim block require 3 bits in each place that an aligned symbol
- * was used. */
+ /* A verbatim block requires 3 bits in each place that an aligned symbol
+ * would be used in an aligned offset block. */
for (unsigned i = 0; i < LZX_ALIGNEDCODE_NUM_SYMBOLS; i++) {
verbatim_cost += 3 * freqs->aligned[i];
aligned_cost += codes->lens.aligned[i] * freqs->aligned[i];
*/
u32 mc_item_data;
#define MC_OFFSET_SHIFT 16
-#define MC_LEN_MASK ((1 << MC_OFFSET_SHIFT) - 1)
+#define MC_LEN_MASK (((u32)1 << MC_OFFSET_SHIFT) - 1)
};
* @matches must be sorted by strictly increasing length and strictly
* increasing offset. This is guaranteed by the match-finder.
*
- * We consider each length from the minimum (2) to the longest
+ * We consider each length from the minimum (3) to the longest
* (matches[num_matches - 1].len). For each length, we consider only
* the smallest offset for which that length is available. Although
* this is not guaranteed to be optimal due to the possibility of a
* XPRESS_OPTIM_ARRAY_LENGTH is high enough that on most
* inputs this limit is never reached.
*
- * Note: no check for end-of-block is needed because
- * end-of-block will trigger condition (1).
+ * Note: no check for end-of-window is needed because
+ * end-of-window will trigger condition (1).
*/
if (cur_optimum_ptr == end_optimum_ptr ||
cur_optimum_ptr == &c->optimum[XPRESS_OPTIM_ARRAY_LENGTH])
c->cur_window_size = uncompressed_size;
lz_mf_load_window(c->mf, c->cur_window, c->cur_window_size);
memset(c->freqs, 0, sizeof(c->freqs));
+
num_chosen_items = xpress_choose_items(c);
+
c->freqs[XPRESS_END_OF_DATA]++;
xpress_make_huffman_code(c);
/* Output the Huffman code as a series of 512 4-bit lengths. */
cptr = compressed_data;
for (unsigned i = 0; i < XPRESS_NUM_SYMBOLS; i += 2)
- *cptr++ = (c->lens[i] & 0xf) | (c->lens[i + 1] << 4);
+ *cptr++ = (c->lens[i + 1] << 4) | c->lens[i];
/* Output the encoded matches/literals. */
xpress_init_output(&os, cptr,
if (c) {
lz_mf_free(c->mf);
- FREE(c->cached_matches);
FREE(c->optimum);
+ FREE(c->cached_matches);
FREE(c->chosen_items);
FREE(c);
}