| ... | ... | @@ -59,7 +59,7 @@ fn assignWeights(huff_bits: *readers.ReverseBitReader, accuracy_log: usize, entr |
| 59 | 59 | var even_state: u32 = huff_bits.readBitsNoEof(u32, accuracy_log) catch return error.MalformedHuffmanTree; |
| 60 | 60 | var odd_state: u32 = huff_bits.readBitsNoEof(u32, accuracy_log) catch return error.MalformedHuffmanTree; |
| 61 | 61 | |
| 62 | | while (i < 255) { |
| 62 | while (i < 254) { |
| 63 | 63 | const even_data = entries[even_state]; |
| 64 | 64 | var read_bits: usize = 0; |
| 65 | 65 | const even_bits = huff_bits.readBits(u32, even_data.bits, &read_bits) catch unreachable; |
| ... | ... | @@ -78,7 +78,7 @@ fn assignWeights(huff_bits: *readers.ReverseBitReader, accuracy_log: usize, entr |
| 78 | 78 | weights[i] = std.math.cast(u4, odd_data.symbol) orelse return error.MalformedHuffmanTree; |
| 79 | 79 | i += 1; |
| 80 | 80 | if (read_bits < odd_data.bits) { |
| 81 | | if (i == 256) return error.MalformedHuffmanTree; |
| 81 | if (i == 255) return error.MalformedHuffmanTree; |
| 82 | 82 | weights[i] = std.math.cast(u4, entries[even_state].symbol) orelse return error.MalformedHuffmanTree; |
| 83 | 83 | i += 1; |
| 84 | 84 | break; |
| ... | ... | @@ -147,16 +147,18 @@ fn assignSymbols(weight_sorted_prefixed_symbols: []LiteralsSection.HuffmanTree.P |
| 147 | 147 | } |
| 148 | 148 | |
| 149 | 149 | fn buildHuffmanTree(weights: *[256]u4, symbol_count: usize) error{MalformedHuffmanTree}!LiteralsSection.HuffmanTree { |
| 150 | | var weight_power_sum: u16 = 0; |
| 150 | var weight_power_sum_big: u32 = 0; |
| 151 | 151 | for (weights[0 .. symbol_count - 1]) |value| { |
| 152 | 152 | if (value > 0) { |
| 153 | | weight_power_sum += @as(u16, 1) << (value - 1); |
| 153 | weight_power_sum_big += @as(u16, 1) << (value - 1); |
| 154 | 154 | } |
| 155 | 155 | } |
| 156 | | if (weight_power_sum >= 1 << 11) return error.MalformedHuffmanTree; |
| 156 | if (weight_power_sum_big >= 1 << 11) return error.MalformedHuffmanTree; |
| 157 | const weight_power_sum = @intCast(u16, weight_power_sum_big); |
| 157 | 158 | |
| 158 | 159 | // advance to next power of two (even if weight_power_sum is a power of 2) |
| 159 | | const max_number_of_bits = std.math.log2_int(u16, weight_power_sum) + 1; |
| 160 | // TODO: is it valid to have weight_power_sum == 0? |
| 161 | const max_number_of_bits = if (weight_power_sum == 0) 1 else std.math.log2_int(u16, weight_power_sum) + 1; |
| 160 | 162 | const next_power_of_two = @as(u16, 1) << max_number_of_bits; |
| 161 | 163 | weights[symbol_count - 1] = std.math.log2_int(u16, next_power_of_two - weight_power_sum) + 1; |
| 162 | 164 | |