| ... | ... | @@ -15,7 +15,12 @@ pub const Error = error{ |
| 15 | 15 | EndOfStream, |
| 16 | 16 | }; |
| 17 | 17 | |
| 18 | | fn decodeFseHuffmanTree(source: anytype, compressed_size: usize, buffer: []u8, weights: *[256]u4) !usize { |
| 18 | fn decodeFseHuffmanTree( |
| 19 | source: anytype, |
| 20 | compressed_size: usize, |
| 21 | buffer: []u8, |
| 22 | weights: *[256]u4, |
| 23 | ) !usize { |
| 19 | 24 | var stream = std.io.limitedReader(source, compressed_size); |
| 20 | 25 | var bit_reader = readers.bitReader(stream.reader()); |
| 21 | 26 | |
| ... | ... | @@ -23,6 +28,7 @@ fn decodeFseHuffmanTree(source: anytype, compressed_size: usize, buffer: []u8, w |
| 23 | 28 | const table_size = decodeFseTable(&bit_reader, 256, 6, &entries) catch |err| switch (err) { |
| 24 | 29 | error.MalformedAccuracyLog, error.MalformedFseTable => |e| return e, |
| 25 | 30 | error.EndOfStream => return error.MalformedFseTable, |
| 31 | else => |e| return e, |
| 26 | 32 | }; |
| 27 | 33 | const accuracy_log = std.math.log2_int_ceil(usize, table_size); |
| 28 | 34 | |
| ... | ... | @@ -46,7 +52,8 @@ fn decodeFseHuffmanTreeSlice(src: []const u8, compressed_size: usize, weights: * |
| 46 | 52 | }; |
| 47 | 53 | const accuracy_log = std.math.log2_int_ceil(usize, table_size); |
| 48 | 54 | |
| 49 | | const start_index = std.math.cast(usize, counting_reader.bytes_read) orelse return error.MalformedHuffmanTree; |
| 55 | const start_index = std.math.cast(usize, counting_reader.bytes_read) orelse |
| 56 | return error.MalformedHuffmanTree; |
| 50 | 57 | var huff_data = src[start_index..compressed_size]; |
| 51 | 58 | var huff_bits: readers.ReverseBitReader = undefined; |
| 52 | 59 | huff_bits.init(huff_data) catch return error.MalformedHuffmanTree; |
| ... | ... | @@ -54,7 +61,12 @@ fn decodeFseHuffmanTreeSlice(src: []const u8, compressed_size: usize, weights: * |
| 54 | 61 | return assignWeights(&huff_bits, accuracy_log, &entries, weights); |
| 55 | 62 | } |
| 56 | 63 | |
| 57 | | fn assignWeights(huff_bits: *readers.ReverseBitReader, accuracy_log: usize, entries: *[1 << 6]Table.Fse, weights: *[256]u4) !usize { |
| 64 | fn assignWeights( |
| 65 | huff_bits: *readers.ReverseBitReader, |
| 66 | accuracy_log: usize, |
| 67 | entries: *[1 << 6]Table.Fse, |
| 68 | weights: *[256]u4, |
| 69 | ) !usize { |
| 58 | 70 | var i: usize = 0; |
| 59 | 71 | var even_state: u32 = huff_bits.readBitsNoEof(u32, accuracy_log) catch return error.MalformedHuffmanTree; |
| 60 | 72 | var odd_state: u32 = huff_bits.readBitsNoEof(u32, accuracy_log) catch return error.MalformedHuffmanTree; |
| ... | ... | @@ -173,7 +185,10 @@ fn buildHuffmanTree(weights: *[256]u4, symbol_count: usize) error{MalformedHuffm |
| 173 | 185 | return tree; |
| 174 | 186 | } |
| 175 | 187 | |
| 176 | | pub fn decodeHuffmanTree(source: anytype, buffer: []u8) !LiteralsSection.HuffmanTree { |
| 188 | pub fn decodeHuffmanTree( |
| 189 | source: anytype, |
| 190 | buffer: []u8, |
| 191 | ) (@TypeOf(source).Error || Error)!LiteralsSection.HuffmanTree { |
| 177 | 192 | const header = try source.readByte(); |
| 178 | 193 | var weights: [256]u4 = undefined; |
| 179 | 194 | const symbol_count = if (header < 128) |
| ... | ... | @@ -185,7 +200,10 @@ pub fn decodeHuffmanTree(source: anytype, buffer: []u8) !LiteralsSection.Huffman |
| 185 | 200 | return buildHuffmanTree(&weights, symbol_count); |
| 186 | 201 | } |
| 187 | 202 | |
| 188 | | pub fn decodeHuffmanTreeSlice(src: []const u8, consumed_count: *usize) Error!LiteralsSection.HuffmanTree { |
| 203 | pub fn decodeHuffmanTreeSlice( |
| 204 | src: []const u8, |
| 205 | consumed_count: *usize, |
| 206 | ) Error!LiteralsSection.HuffmanTree { |
| 189 | 207 | if (src.len == 0) return error.MalformedHuffmanTree; |
| 190 | 208 | const header = src[0]; |
| 191 | 209 | var bytes_read: usize = 1; |