]> wimlib.net Git - wimlib/blobdiff - src/decompress.c
Compiler stuff
[wimlib] / src / decompress.c
index bed7b5a486876c3d056f4888f20cd9e0cb031823..f149b48c7bcf06f9172d48d9e7da0568b26f80fb 100644 (file)
@@ -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.
  *
  * 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 <string.h>
 
 /*
  * 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,41 +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) {
-                       /* Fill in the Huffman decode table entries one unsigned
-                        * long at a time.  On 32-bit systems this is 2 entries
-                        * per store, while on 64-bit systems this is 4 entries
-                        * per store. */
-                       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) {
-                               /* This may produce a compiler warning if an
-                                * unsigned long is 32 bits, but this won't be
-                                * executed unless an unsigned long is at least
-                                * 64 bits anyway. */
-                               v |= v << 32;
-                       }
-                       do {
-                               *p++ = v;
-                       } while (--n);
 
-                       decode_table_pos += num_entries;
-               } else {
-                       /* Fill in the Huffman decode table entries one 16-bit
-                        * integer at a time. */
-                       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);
@@ -294,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;