X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flzms_decompress.c;h=b0d0670ea4a0a8a82d39ae2543d2c3b9789549f3;hp=a54cc804aea9b64794cecb7e99774000a055e641;hb=ffb1ee49d51d7322e9d2d960e1d8eb693a29c7e3;hpb=a141cf94ae7562406ea1bc32c026ac85b37751a6 diff --git a/src/lzms_decompress.c b/src/lzms_decompress.c index a54cc804..b0d0670e 100644 --- a/src/lzms_decompress.c +++ b/src/lzms_decompress.c @@ -307,7 +307,6 @@ struct lzms_huffman_rebuild_info { unsigned num_syms; unsigned rebuild_freq; u32 *codewords; - u8 *lens; u32 *freqs; u16 *decode_table; unsigned table_bits; @@ -386,7 +385,6 @@ struct lzms_decompressor { struct lzms_huffman_rebuild_info delta_power_rebuild_info; u32 codewords[LZMS_MAX_NUM_SYMS]; - u8 lens[LZMS_MAX_NUM_SYMS]; }; // struct @@ -430,9 +428,7 @@ lzms_ensure_bits(struct lzms_input_bitstream *is, unsigned num_bits) static inline bitbuf_t lzms_peek_bits(struct lzms_input_bitstream *is, unsigned num_bits) { - if (unlikely(num_bits == 0)) - return 0; - return is->bitbuf >> (sizeof(is->bitbuf) * 8 - num_bits); + return (is->bitbuf >> 1) >> (sizeof(is->bitbuf) * 8 - num_bits - 1); } /* Remove @num_bits bits from the bitbuffer variable. */ @@ -551,28 +547,28 @@ lzms_decode_match_bit(struct lzms_decompressor *d) } static int -lzms_decode_lz_match_bit(struct lzms_decompressor *d) +lzms_decode_lz_bit(struct lzms_decompressor *d) { return lzms_decode_bit(&d->rd, &d->lz_state, LZMS_NUM_LZ_PROBS, d->lz_probs); } static int -lzms_decode_delta_match_bit(struct lzms_decompressor *d) +lzms_decode_delta_bit(struct lzms_decompressor *d) { return lzms_decode_bit(&d->rd, &d->delta_state, LZMS_NUM_DELTA_PROBS, d->delta_probs); } static noinline int -lzms_decode_lz_repeat_match_bit(struct lzms_decompressor *d, int idx) +lzms_decode_lz_rep_bit(struct lzms_decompressor *d, int idx) { return lzms_decode_bit(&d->rd, &d->lz_rep_states[idx], LZMS_NUM_LZ_REP_PROBS, d->lz_rep_probs[idx]); } static noinline int -lzms_decode_delta_repeat_match_bit(struct lzms_decompressor *d, int idx) +lzms_decode_delta_rep_bit(struct lzms_decompressor *d, int idx) { return lzms_decode_bit(&d->rd, &d->delta_rep_states[idx], LZMS_NUM_DELTA_REP_PROBS, d->delta_rep_probs[idx]); @@ -584,13 +580,13 @@ lzms_build_huffman_code(struct lzms_huffman_rebuild_info *rebuild_info) make_canonical_huffman_code(rebuild_info->num_syms, LZMS_MAX_CODEWORD_LENGTH, rebuild_info->freqs, - rebuild_info->lens, + (u8 *)rebuild_info->decode_table, rebuild_info->codewords); make_huffman_decode_table(rebuild_info->decode_table, rebuild_info->num_syms, rebuild_info->table_bits, - rebuild_info->lens, + (u8 *)rebuild_info->decode_table, LZMS_MAX_CODEWORD_LENGTH); rebuild_info->num_syms_until_rebuild = rebuild_info->rebuild_freq; @@ -599,13 +595,12 @@ lzms_build_huffman_code(struct lzms_huffman_rebuild_info *rebuild_info) static void lzms_init_huffman_code(struct lzms_huffman_rebuild_info *rebuild_info, unsigned num_syms, unsigned rebuild_freq, - u32 *codewords, u8 *lens, u32 *freqs, + u32 *codewords, u32 *freqs, u16 *decode_table, unsigned table_bits) { rebuild_info->num_syms = num_syms; rebuild_info->rebuild_freq = rebuild_freq; rebuild_info->codewords = codewords; - rebuild_info->lens = lens; rebuild_info->freqs = freqs; rebuild_info->decode_table = decode_table; rebuild_info->table_bits = table_bits; @@ -753,19 +748,19 @@ lzms_decode_items(struct lzms_decompressor * const restrict d, d->pending_lz_offset = 0; } - if (!lzms_decode_lz_match_bit(d)) { + if (!lzms_decode_lz_bit(d)) { /* Explicit offset */ offset = lzms_decode_lz_offset(d); } else { /* Repeat offset */ BUILD_BUG_ON(LZMS_NUM_LZ_REPS != 3); - if (!lzms_decode_lz_repeat_match_bit(d, 0)) { + if (!lzms_decode_lz_rep_bit(d, 0)) { offset = d->recent_lz_offsets[0]; d->recent_lz_offsets[0] = d->recent_lz_offsets[1]; d->recent_lz_offsets[1] = d->recent_lz_offsets[2]; d->recent_lz_offsets[2] = d->recent_lz_offsets[3]; - } else if (!lzms_decode_lz_repeat_match_bit(d, 1)) { + } else if (!lzms_decode_lz_rep_bit(d, 1)) { offset = d->recent_lz_offsets[1]; d->recent_lz_offsets[1] = d->recent_lz_offsets[2]; d->recent_lz_offsets[2] = d->recent_lz_offsets[3]; @@ -818,7 +813,7 @@ lzms_decode_items(struct lzms_decompressor * const restrict d, d->pending_delta_pair = 0; } - if (!lzms_decode_delta_match_bit(d)) { + if (!lzms_decode_delta_bit(d)) { /* Explicit offset */ power = lzms_decode_delta_power(d); raw_offset = lzms_decode_delta_offset(d); @@ -827,12 +822,12 @@ lzms_decode_items(struct lzms_decompressor * const restrict d, u64 val; BUILD_BUG_ON(LZMS_NUM_DELTA_REPS != 3); - if (!lzms_decode_delta_repeat_match_bit(d, 0)) { + if (!lzms_decode_delta_rep_bit(d, 0)) { val = d->recent_delta_pairs[0]; d->recent_delta_pairs[0] = d->recent_delta_pairs[1]; d->recent_delta_pairs[1] = d->recent_delta_pairs[2]; d->recent_delta_pairs[2] = d->recent_delta_pairs[3]; - } else if (!lzms_decode_delta_repeat_match_bit(d, 1)) { + } else if (!lzms_decode_delta_rep_bit(d, 1)) { val = d->recent_delta_pairs[1]; d->recent_delta_pairs[1] = d->recent_delta_pairs[2]; d->recent_delta_pairs[2] = d->recent_delta_pairs[3]; @@ -936,7 +931,6 @@ lzms_init_decompressor(struct lzms_decompressor *d, const void *in, LZMS_NUM_LITERAL_SYMS, LZMS_LITERAL_CODE_REBUILD_FREQ, d->codewords, - d->lens, d->literal_freqs, d->literal_decode_table, LZMS_LITERAL_TABLEBITS); @@ -945,7 +939,6 @@ lzms_init_decompressor(struct lzms_decompressor *d, const void *in, num_offset_slots, LZMS_LZ_OFFSET_CODE_REBUILD_FREQ, d->codewords, - d->lens, d->lz_offset_freqs, d->lz_offset_decode_table, LZMS_LZ_OFFSET_TABLEBITS); @@ -954,7 +947,6 @@ lzms_init_decompressor(struct lzms_decompressor *d, const void *in, LZMS_NUM_LENGTH_SYMS, LZMS_LENGTH_CODE_REBUILD_FREQ, d->codewords, - d->lens, d->length_freqs, d->length_decode_table, LZMS_LENGTH_TABLEBITS); @@ -963,7 +955,6 @@ lzms_init_decompressor(struct lzms_decompressor *d, const void *in, num_offset_slots, LZMS_DELTA_OFFSET_CODE_REBUILD_FREQ, d->codewords, - d->lens, d->delta_offset_freqs, d->delta_offset_decode_table, LZMS_DELTA_OFFSET_TABLEBITS); @@ -972,7 +963,6 @@ lzms_init_decompressor(struct lzms_decompressor *d, const void *in, LZMS_NUM_DELTA_POWER_SYMS, LZMS_DELTA_POWER_CODE_REBUILD_FREQ, d->codewords, - d->lens, d->delta_power_freqs, d->delta_power_decode_table, LZMS_DELTA_POWER_TABLEBITS);