X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdecompress.c;h=f149b48c7bcf06f9172d48d9e7da0568b26f80fb;hb=768d53aa2bde3b39dfa85fe0dd940d67ae97d5ef;hp=5c308b2d7bd2cdfba9425fc41c8cdf7abed11219;hpb=1530b6dab02a9e1e5faf81529ab502aee68d8cd2;p=wimlib diff --git a/src/decompress.c b/src/decompress.c index 5c308b2d..f149b48c 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2012 Eric Biggers + * Copyright (C) 2012, 2013 Eric Biggers * * This file is part of wimlib, a library for working with WIM files. * @@ -23,7 +23,13 @@ * along with wimlib; if not, see http://www.gnu.org/licenses/. */ -#include "decompress.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "wimlib/decompress.h" +#include "wimlib/util.h" + #include /* @@ -89,9 +95,10 @@ * indices into the decoding table, and symbol entries are distinguished from * pointers by the fact that values less than @num_syms must be symbol values. */ -int make_huffman_decode_table(u16 decode_table[], unsigned num_syms, - unsigned table_bits, const u8 lens[], - unsigned max_codeword_len) +int +make_huffman_decode_table(u16 * restrict decode_table, unsigned num_syms, + unsigned table_bits, const u8 * restrict lens, + unsigned max_codeword_len) { unsigned len_counts[max_codeword_len + 1]; u16 sorted_syms[num_syms]; @@ -164,30 +171,13 @@ int make_huffman_decode_table(u16 decode_table[], unsigned num_syms, break; unsigned num_entries = 1 << (table_bits - codeword_len); - const unsigned entries_per_long = sizeof(unsigned long) / - sizeof(decode_table[0]); - if (num_entries >= entries_per_long) { - wimlib_assert2(decode_table_pos % entries_per_long == 0); - BUILD_BUG_ON(sizeof(unsigned long) != 4 && - sizeof(unsigned long) != 8); - - unsigned long *p = (unsigned long *)&decode_table[decode_table_pos]; - unsigned n = num_entries / entries_per_long; - unsigned long v = sym; - if (sizeof(unsigned long) >= 4) - v |= v << 16; - if (sizeof(unsigned long) >= 8) - v |= v << 32; - do { - *p++ = v; - } while (--n); - - decode_table_pos += num_entries; - } else { - do { - decode_table[decode_table_pos++] = sym; - } while (--num_entries); - } + + /* Fill in the Huffman decode table entries one 16-bit + * integer at a time. */ + do { + decode_table[decode_table_pos++] = sym; + } while (--num_entries); + wimlib_assert2(decode_table_pos <= table_num_entries); if (++i == num_used_syms) { wimlib_assert2(decode_table_pos == table_num_entries); @@ -234,7 +224,6 @@ int make_huffman_decode_table(u16 decode_table[], unsigned num_syms, unsigned sym = sorted_syms[i]; unsigned codeword_len = lens[sym]; unsigned extra_bits = codeword_len - table_bits; - unsigned extra_mask; cur_codeword <<= (codeword_len - prev_codeword_len); prev_codeword_len = codeword_len; @@ -284,12 +273,13 @@ int make_huffman_decode_table(u16 decode_table[], unsigned num_syms, /* Reads a Huffman-encoded symbol from the bistream when the number of remaining * bits is less than the maximum codeword length. */ -int read_huffsym_near_end_of_input(struct input_bitstream *istream, - const u16 decode_table[], - const u8 lens[], - unsigned num_syms, - unsigned table_bits, - unsigned *n) +int +read_huffsym_near_end_of_input(struct input_bitstream *istream, + const u16 decode_table[], + const u8 lens[], + unsigned num_syms, + unsigned table_bits, + unsigned *n) { unsigned bitsleft = istream->bitsleft; unsigned key_size;