]> wimlib.net Git - wimlib/blobdiff - src/lzx_decompress.c
subtables
[wimlib] / src / lzx_decompress.c
index 9accd8df2a84cba97a9961c1684722f2864ee99c..78119261a7860656f4dedc07f2a9c8ac75756a0b 100644 (file)
 #define LZX_PRECODE_TABLEBITS          6
 #define LZX_ALIGNEDCODE_TABLEBITS      7
 
+static void _unused_attribute
+check_enough_values(void)
+{
+/* ./enough 656 11 16 */
+#define LZX_MAINCODE_ENOUGH            2726
+       STATIC_ASSERT(LZX_MAINCODE_MAX_NUM_SYMBOLS == 656);
+       STATIC_ASSERT(LZX_MAINCODE_TABLEBITS == 11);
+       STATIC_ASSERT(LZX_MAX_MAIN_CODEWORD_LEN == 16);
+
+/* ./enough 249 10 16 */
+#define LZX_LENCODE_ENOUGH             1326
+       STATIC_ASSERT(LZX_LENCODE_NUM_SYMBOLS == 249);
+       STATIC_ASSERT(LZX_LENCODE_TABLEBITS == 10);
+       STATIC_ASSERT(LZX_MAX_LEN_CODEWORD_LEN == 16);
+
+/* ./enough 20 6 15 */
+#define LZX_PRECODE_ENOUGH             582
+       STATIC_ASSERT(LZX_PRECODE_NUM_SYMBOLS == 20);
+       STATIC_ASSERT(LZX_PRECODE_TABLEBITS == 6);
+       STATIC_ASSERT(LZX_MAX_PRE_CODEWORD_LEN == 15);
+
+/* ./enough 8 7 7 */
+#define LZX_ALIGNEDCODE_ENOUGH         128
+       STATIC_ASSERT(LZX_ALIGNEDCODE_NUM_SYMBOLS == 8);
+       STATIC_ASSERT(LZX_ALIGNEDCODE_TABLEBITS == 7);
+       STATIC_ASSERT(LZX_MAX_ALIGNED_CODEWORD_LEN == 7);
+}
+
+
 #define LZX_READ_LENS_MAX_OVERRUN 50
 
 /* Reusable heap-allocated memory for LZX decompression */
 struct lzx_decompressor {
 
-       /* Huffman decoding tables, and arrays that map symbols to codeword
-        * lengths  */
+       /* Huffman decoding tables and codeword lengths */
 
-       u16 maincode_decode_table[(1 << LZX_MAINCODE_TABLEBITS) +
-                                       (LZX_MAINCODE_MAX_NUM_SYMBOLS * 2)]
-                                       _aligned_attribute(DECODE_TABLE_ALIGNMENT);
+       u16 maincode_decode_table[LZX_MAINCODE_ENOUGH]
+                       _aligned_attribute(DECODE_TABLE_ALIGNMENT);
        u8 maincode_lens[LZX_MAINCODE_MAX_NUM_SYMBOLS + LZX_READ_LENS_MAX_OVERRUN];
 
-
-       u16 lencode_decode_table[(1 << LZX_LENCODE_TABLEBITS) +
-                                       (LZX_LENCODE_NUM_SYMBOLS * 2)]
-                                       _aligned_attribute(DECODE_TABLE_ALIGNMENT);
+       u16 lencode_decode_table[LZX_LENCODE_ENOUGH]
+                       _aligned_attribute(DECODE_TABLE_ALIGNMENT);
        u8 lencode_lens[LZX_LENCODE_NUM_SYMBOLS + LZX_READ_LENS_MAX_OVERRUN];
 
        union {
-               u16 alignedcode_decode_table[(1 << LZX_ALIGNEDCODE_TABLEBITS) +
-                                               (LZX_ALIGNEDCODE_NUM_SYMBOLS * 2)]
-                                               _aligned_attribute(DECODE_TABLE_ALIGNMENT);
+               u16 alignedcode_decode_table[LZX_ALIGNEDCODE_ENOUGH]
+                       _aligned_attribute(DECODE_TABLE_ALIGNMENT);
                u8 alignedcode_lens[LZX_ALIGNEDCODE_NUM_SYMBOLS];
        };
 
        union {
-               u16 precode_decode_table[(1 << LZX_PRECODE_TABLEBITS) +
-                                        (LZX_PRECODE_NUM_SYMBOLS * 2)]
-                                               _aligned_attribute(DECODE_TABLE_ALIGNMENT);
+               u16 precode_decode_table[LZX_PRECODE_ENOUGH]
+                       _aligned_attribute(DECODE_TABLE_ALIGNMENT);
                u8 precode_lens[LZX_PRECODE_NUM_SYMBOLS];
        };