- int ret;
-
- /* In the most common case, there are at least max_codeword_len bits
- * remaining in the stream. */
- if (likely(bitstream_ensure_bits(istream, max_codeword_len) == 0)) {
-
- /* Use the next table_bits of the input as an index into the
- * decode_table. */
- u16 key_bits = bitstream_peek_bits(istream, table_bits);
-
- u16 sym = decode_table[key_bits];
-
- /* If the entry in the decode table is not a valid symbol, it is
- * the offset of the root of its Huffman subtree. */
- if (likely(sym < num_syms)) {
- wimlib_assert2(lens[sym] <= table_bits);
- bitstream_remove_bits(istream, lens[sym]);
- } else {
- bitstream_remove_bits(istream, table_bits);
- do {
- key_bits = sym + bitstream_peek_bits(istream, 1);
- bitstream_remove_bits(istream, 1);
-
- wimlib_assert2(key_bits < num_syms * 2 +
- (1 << table_bits));
- } while ((sym = decode_table[key_bits]) >= num_syms);
- }
- *n = sym;
- ret = 0;
+ /* If there are fewer bits remaining in the input than the maximum
+ * codeword length, use the slow path that has extra checks. */
+ if (unlikely(bitstream_ensure_bits(istream, max_codeword_len))) {
+ return read_huffsym_near_end_of_input(istream, decode_table,
+ lens, num_syms,
+ table_bits, n);
+ }
+
+ /* Use the next table_bits of the input as an index into the
+ * decode_table. */
+ u16 key_bits = bitstream_peek_bits(istream, table_bits);
+
+ u16 sym = decode_table[key_bits];
+
+ if (likely(sym < num_syms)) {
+ /* Fast case: The decode table directly provided the symbol. */
+ bitstream_remove_bits(istream, lens[sym]);