authorgravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-01-23 16:26:03+11:00
committergravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-02-20 09:09:06+11:00
logfc64c279a497263c15feb857eb5442aa615179c4
tree7fdec373c00100b8c11140b38cb479d979442632
parentcbfaa876d466a885c54ead16a5901399619ed0c8

std.compress.zstandard: clean up api


3 files changed, 113 insertions(+), 101 deletions(-)

lib/std/compress/zstandard.zig+1
......@@ -1,6 +1,7 @@
11const std = @import("std");
22
33pub const decompress = @import("zstandard/decompress.zig");
4pub usingnamespace @import("zstandard/types.zig");
45
56test "decompression" {
67 const uncompressed = @embedFile("testdata/rfc8478.txt");
lib/std/compress/zstandard/decompress.zig+109-98
......@@ -3,10 +3,10 @@ const assert = std.debug.assert;
33
44const types = @import("types.zig");
55const frame = types.frame;
6const Literals = types.compressed_block.Literals;
7const Sequences = types.compressed_block.Sequences;
6const LiteralsSection = types.compressed_block.LiteralsSection;
7const SequencesSection = types.compressed_block.SequencesSection;
88const Table = types.compressed_block.Table;
9const RingBuffer = @import("RingBuffer.zig");
9pub const RingBuffer = @import("RingBuffer.zig");
1010
1111const readInt = std.mem.readIntLittle;
1212const readIntSlice = std.mem.readIntSliceLittle;
......@@ -55,7 +55,7 @@ pub fn decodeFrame(dest: []u8, src: []const u8, verify_checksum: bool) !ReadWrit
5555 };
5656}
5757
58const DecodeState = struct {
58pub const DecodeState = struct {
5959 repeat_offsets: [3]u32,
6060
6161 offset: StateData(8),
......@@ -70,7 +70,7 @@ const DecodeState = struct {
7070
7171 literal_stream_reader: ReverseBitReader,
7272 literal_stream_index: usize,
73 huffman_tree: ?Literals.HuffmanTree,
73 huffman_tree: ?LiteralsSection.HuffmanTree,
7474
7575 literal_written_count: usize,
7676
......@@ -84,7 +84,55 @@ const DecodeState = struct {
8484 };
8585 }
8686
87 fn readInitialState(self: *DecodeState, bit_reader: anytype) !void {
87 pub fn prepare(
88 self: *DecodeState,
89 src: []const u8,
90 literals: LiteralsSection,
91 sequences_header: SequencesSection.Header,
92 ) !usize {
93 if (literals.huffman_tree) |tree| {
94 self.huffman_tree = tree;
95 } else if (literals.header.block_type == .treeless and self.huffman_tree == null) {
96 return error.TreelessLiteralsFirst;
97 }
98
99 switch (literals.header.block_type) {
100 .raw, .rle => {},
101 .compressed, .treeless => {
102 self.literal_stream_index = 0;
103 switch (literals.streams) {
104 .one => |slice| try self.initLiteralStream(slice),
105 .four => |streams| try self.initLiteralStream(streams[0]),
106 }
107 },
108 }
109
110 if (sequences_header.sequence_count > 0) {
111 var bytes_read = try self.updateFseTable(
112 src,
113 .literal,
114 sequences_header.literal_lengths,
115 );
116
117 bytes_read += try self.updateFseTable(
118 src[bytes_read..],
119 .offset,
120 sequences_header.offsets,
121 );
122
123 bytes_read += try self.updateFseTable(
124 src[bytes_read..],
125 .match,
126 sequences_header.match_lengths,
127 );
128 self.fse_tables_undefined = false;
129
130 return bytes_read;
131 }
132 return 0;
133 }
134
135 pub fn readInitialFseState(self: *DecodeState, bit_reader: anytype) !void {
88136 self.literal.state = try bit_reader.readBitsNoEof(u9, self.literal.accuracy_log);
89137 self.offset.state = try bit_reader.readBitsNoEof(u8, self.offset.accuracy_log);
90138 self.match.state = try bit_reader.readBitsNoEof(u9, self.match.accuracy_log);
......@@ -130,7 +178,7 @@ const DecodeState = struct {
130178 self: *DecodeState,
131179 src: []const u8,
132180 comptime choice: DataType,
133 mode: Sequences.Header.Mode,
181 mode: SequencesSection.Header.Mode,
134182 ) !usize {
135183 const field_name = @tagName(choice);
136184 switch (mode) {
......@@ -213,7 +261,13 @@ const DecodeState = struct {
213261 };
214262 }
215263
216 fn executeSequenceSlice(self: *DecodeState, dest: []u8, write_pos: usize, literals: Literals, sequence: Sequence) !void {
264 fn executeSequenceSlice(
265 self: *DecodeState,
266 dest: []u8,
267 write_pos: usize,
268 literals: LiteralsSection,
269 sequence: Sequence,
270 ) !void {
217271 try self.decodeLiteralsSlice(dest[write_pos..], literals, sequence.literal_length);
218272
219273 // TODO: should we validate offset against max_window_size?
......@@ -225,7 +279,12 @@ const DecodeState = struct {
225279 std.mem.copy(u8, dest[write_pos + sequence.literal_length ..], dest[copy_start..copy_end]);
226280 }
227281
228 fn executeSequenceRingBuffer(self: *DecodeState, dest: *RingBuffer, literals: Literals, sequence: Sequence) !void {
282 fn executeSequenceRingBuffer(
283 self: *DecodeState,
284 dest: *RingBuffer,
285 literals: LiteralsSection,
286 sequence: Sequence,
287 ) !void {
229288 try self.decodeLiteralsRingBuffer(dest, literals, sequence.literal_length);
230289 // TODO: check that ring buffer window is full enough for match copies
231290 const copy_slice = dest.sliceAt(dest.write_index + dest.data.len - sequence.offset, sequence.match_length);
......@@ -234,11 +293,11 @@ const DecodeState = struct {
234293 for (copy_slice.second) |b| dest.writeAssumeCapacity(b);
235294 }
236295
237 fn decodeSequenceSlice(
296 pub fn decodeSequenceSlice(
238297 self: *DecodeState,
239298 dest: []u8,
240299 write_pos: usize,
241 literals: Literals,
300 literals: LiteralsSection,
242301 bit_reader: anytype,
243302 last_sequence: bool,
244303 ) !usize {
......@@ -255,10 +314,10 @@ const DecodeState = struct {
255314 return sequence.match_length + sequence.literal_length;
256315 }
257316
258 fn decodeSequenceRingBuffer(
317 pub fn decodeSequenceRingBuffer(
259318 self: *DecodeState,
260319 dest: *RingBuffer,
261 literals: Literals,
320 literals: LiteralsSection,
262321 bit_reader: anytype,
263322 last_sequence: bool,
264323 ) !usize {
......@@ -280,7 +339,7 @@ const DecodeState = struct {
280339 return sequence.match_length + sequence.literal_length;
281340 }
282341
283 fn nextLiteralMultiStream(self: *DecodeState, literals: Literals) !void {
342 fn nextLiteralMultiStream(self: *DecodeState, literals: LiteralsSection) !void {
284343 self.literal_stream_index += 1;
285344 try self.initLiteralStream(literals.streams.four[self.literal_stream_index]);
286345 }
......@@ -290,7 +349,7 @@ const DecodeState = struct {
290349 try self.literal_stream_reader.init(bytes);
291350 }
292351
293 fn decodeLiteralsSlice(self: *DecodeState, dest: []u8, literals: Literals, len: usize) !void {
352 pub fn decodeLiteralsSlice(self: *DecodeState, dest: []u8, literals: LiteralsSection, len: usize) !void {
294353 if (self.literal_written_count + len > literals.header.regenerated_size) return error.MalformedLiteralsLength;
295354 switch (literals.header.block_type) {
296355 .raw => {
......@@ -310,7 +369,7 @@ const DecodeState = struct {
310369 // const written_bytes_per_stream = (literals.header.regenerated_size + 3) / 4;
311370 const huffman_tree = self.huffman_tree orelse unreachable;
312371 const max_bit_count = huffman_tree.max_bit_count;
313 const starting_bit_count = Literals.HuffmanTree.weightToBitCount(
372 const starting_bit_count = LiteralsSection.HuffmanTree.weightToBitCount(
314373 huffman_tree.nodes[huffman_tree.symbol_count_minus_one].weight,
315374 max_bit_count,
316375 );
......@@ -345,7 +404,7 @@ const DecodeState = struct {
345404 },
346405 .index => |index| {
347406 huffman_tree_index = index;
348 const bit_count = Literals.HuffmanTree.weightToBitCount(
407 const bit_count = LiteralsSection.HuffmanTree.weightToBitCount(
349408 huffman_tree.nodes[index].weight,
350409 max_bit_count,
351410 );
......@@ -359,7 +418,7 @@ const DecodeState = struct {
359418 }
360419 }
361420
362 fn decodeLiteralsRingBuffer(self: *DecodeState, dest: *RingBuffer, literals: Literals, len: usize) !void {
421 pub fn decodeLiteralsRingBuffer(self: *DecodeState, dest: *RingBuffer, literals: LiteralsSection, len: usize) !void {
363422 if (self.literal_written_count + len > literals.header.regenerated_size) return error.MalformedLiteralsLength;
364423 switch (literals.header.block_type) {
365424 .raw => {
......@@ -378,7 +437,7 @@ const DecodeState = struct {
378437 // const written_bytes_per_stream = (literals.header.regenerated_size + 3) / 4;
379438 const huffman_tree = self.huffman_tree orelse unreachable;
380439 const max_bit_count = huffman_tree.max_bit_count;
381 const starting_bit_count = Literals.HuffmanTree.weightToBitCount(
440 const starting_bit_count = LiteralsSection.HuffmanTree.weightToBitCount(
382441 huffman_tree.nodes[huffman_tree.symbol_count_minus_one].weight,
383442 max_bit_count,
384443 );
......@@ -413,7 +472,7 @@ const DecodeState = struct {
413472 },
414473 .index => |index| {
415474 huffman_tree_index = index;
416 const bit_count = Literals.HuffmanTree.weightToBitCount(
475 const bit_count = LiteralsSection.HuffmanTree.weightToBitCount(
417476 huffman_tree.nodes[index].weight,
418477 max_bit_count,
419478 );
......@@ -647,54 +706,6 @@ fn decodeRleBlockRingBuffer(dest: *RingBuffer, src: []const u8, block_size: u21,
647706 return block_size;
648707}
649708
650fn prepareDecodeState(
651 decode_state: *DecodeState,
652 src: []const u8,
653 literals: Literals,
654 sequences_header: Sequences.Header,
655) !usize {
656 if (literals.huffman_tree) |tree| {
657 decode_state.huffman_tree = tree;
658 } else if (literals.header.block_type == .treeless and decode_state.huffman_tree == null) {
659 return error.TreelessLiteralsFirst;
660 }
661
662 switch (literals.header.block_type) {
663 .raw, .rle => {},
664 .compressed, .treeless => {
665 decode_state.literal_stream_index = 0;
666 switch (literals.streams) {
667 .one => |slice| try decode_state.initLiteralStream(slice),
668 .four => |streams| try decode_state.initLiteralStream(streams[0]),
669 }
670 },
671 }
672
673 if (sequences_header.sequence_count > 0) {
674 var bytes_read = try decode_state.updateFseTable(
675 src,
676 .literal,
677 sequences_header.literal_lengths,
678 );
679
680 bytes_read += try decode_state.updateFseTable(
681 src[bytes_read..],
682 .offset,
683 sequences_header.offsets,
684 );
685
686 bytes_read += try decode_state.updateFseTable(
687 src[bytes_read..],
688 .match,
689 sequences_header.match_lengths,
690 );
691 decode_state.fse_tables_undefined = false;
692
693 return bytes_read;
694 }
695 return 0;
696}
697
698709pub fn decodeBlock(
699710 dest: []u8,
700711 src: []const u8,
......@@ -715,7 +726,7 @@ pub fn decodeBlock(
715726 const literals = try decodeLiteralsSection(src, &bytes_read);
716727 const sequences_header = try decodeSequencesHeader(src[bytes_read..], &bytes_read);
717728
718 bytes_read += try prepareDecodeState(decode_state, src[bytes_read..], literals, sequences_header);
729 bytes_read += try decode_state.prepare(src[bytes_read..], literals, sequences_header);
719730
720731 var bytes_written: usize = 0;
721732 if (sequences_header.sequence_count > 0) {
......@@ -723,7 +734,7 @@ pub fn decodeBlock(
723734 var bit_stream: ReverseBitReader = undefined;
724735 try bit_stream.init(bit_stream_bytes);
725736
726 try decode_state.readInitialState(&bit_stream);
737 try decode_state.readInitialFseState(&bit_stream);
727738
728739 var i: usize = 0;
729740 while (i < sequences_header.sequence_count) : (i += 1) {
......@@ -780,7 +791,7 @@ pub fn decodeBlockRingBuffer(
780791 const literals = try decodeLiteralsSection(src, &bytes_read);
781792 const sequences_header = try decodeSequencesHeader(src[bytes_read..], &bytes_read);
782793
783 bytes_read += try prepareDecodeState(decode_state, src[bytes_read..], literals, sequences_header);
794 bytes_read += try decode_state.prepare(src[bytes_read..], literals, sequences_header);
784795
785796 var bytes_written: usize = 0;
786797 if (sequences_header.sequence_count > 0) {
......@@ -788,7 +799,7 @@ pub fn decodeBlockRingBuffer(
788799 var bit_stream: ReverseBitReader = undefined;
789800 try bit_stream.init(bit_stream_bytes);
790801
791 try decode_state.readInitialState(&bit_stream);
802 try decode_state.readInitialFseState(&bit_stream);
792803
793804 var i: usize = 0;
794805 while (i < sequences_header.sequence_count) : (i += 1) {
......@@ -928,7 +939,7 @@ pub fn decodeBlockHeader(src: *const [3]u8) frame.ZStandard.Block.Header {
928939 };
929940}
930941
931pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !Literals {
942pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !LiteralsSection {
932943 // TODO: we probably want to enable safety for release-fast and release-small (or insert custom checks)
933944 var bytes_read: usize = 0;
934945 const header = decodeLiteralsHeader(src, &bytes_read);
......@@ -936,7 +947,7 @@ pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !Literals
936947 .raw => {
937948 const stream = src[bytes_read .. bytes_read + header.regenerated_size];
938949 consumed_count.* += header.regenerated_size + bytes_read;
939 return Literals{
950 return LiteralsSection{
940951 .header = header,
941952 .huffman_tree = null,
942953 .streams = .{ .one = stream },
......@@ -945,7 +956,7 @@ pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !Literals
945956 .rle => {
946957 const stream = src[bytes_read .. bytes_read + 1];
947958 consumed_count.* += 1 + bytes_read;
948 return Literals{
959 return LiteralsSection{
949960 .header = header,
950961 .huffman_tree = null,
951962 .streams = .{ .one = stream },
......@@ -966,7 +977,7 @@ pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !Literals
966977 const stream = src[bytes_read .. bytes_read + total_streams_size];
967978 bytes_read += total_streams_size;
968979 consumed_count.* += bytes_read;
969 return Literals{
980 return LiteralsSection{
970981 .header = header,
971982 .huffman_tree = huffman_tree,
972983 .streams = .{ .one = stream },
......@@ -988,7 +999,7 @@ pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !Literals
988999
9891000 consumed_count.* += total_streams_size + bytes_read;
9901001
991 return Literals{
1002 return LiteralsSection{
9921003 .header = header,
9931004 .huffman_tree = huffman_tree,
9941005 .streams = .{ .four = .{
......@@ -1002,7 +1013,7 @@ pub fn decodeLiteralsSection(src: []const u8, consumed_count: *usize) !Literals
10021013 }
10031014}
10041015
1005fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanTree {
1016fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !LiteralsSection.HuffmanTree {
10061017 var bytes_read: usize = 0;
10071018 bytes_read += 1;
10081019 const header = src[0];
......@@ -1094,7 +1105,7 @@ fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanT
10941105 weights[symbol_count - 1] = @intCast(u4, std.math.log2_int(u16, next_power_of_two - weight_power_sum) + 1);
10951106 log.debug("weights[{d}] = {d}", .{ symbol_count - 1, weights[symbol_count - 1] });
10961107
1097 var weight_sorted_prefixed_symbols: [256]Literals.HuffmanTree.PrefixedSymbol = undefined;
1108 var weight_sorted_prefixed_symbols: [256]LiteralsSection.HuffmanTree.PrefixedSymbol = undefined;
10981109 for (weight_sorted_prefixed_symbols[0..symbol_count]) |_, i| {
10991110 weight_sorted_prefixed_symbols[i] = .{
11001111 .symbol = @intCast(u8, i),
......@@ -1104,7 +1115,7 @@ fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanT
11041115 }
11051116
11061117 std.sort.sort(
1107 Literals.HuffmanTree.PrefixedSymbol,
1118 LiteralsSection.HuffmanTree.PrefixedSymbol,
11081119 weight_sorted_prefixed_symbols[0..symbol_count],
11091120 weights,
11101121 lessThanByWeight,
......@@ -1137,7 +1148,7 @@ fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanT
11371148 }
11381149 }
11391150 consumed_count.* += bytes_read;
1140 const tree = Literals.HuffmanTree{
1151 const tree = LiteralsSection.HuffmanTree{
11411152 .max_bit_count = max_number_of_bits,
11421153 .symbol_count_minus_one = @intCast(u8, prefixed_symbol_count - 1),
11431154 .nodes = weight_sorted_prefixed_symbols,
......@@ -1148,8 +1159,8 @@ fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanT
11481159
11491160fn lessThanByWeight(
11501161 weights: [256]u4,
1151 lhs: Literals.HuffmanTree.PrefixedSymbol,
1152 rhs: Literals.HuffmanTree.PrefixedSymbol,
1162 lhs: LiteralsSection.HuffmanTree.PrefixedSymbol,
1163 rhs: LiteralsSection.HuffmanTree.PrefixedSymbol,
11531164) bool {
11541165 // NOTE: this function relies on the use of a stable sorting algorithm,
11551166 // otherwise a special case of if (weights[lhs] == weights[rhs]) return lhs < rhs;
......@@ -1157,11 +1168,11 @@ fn lessThanByWeight(
11571168 return weights[lhs.symbol] < weights[rhs.symbol];
11581169}
11591170
1160pub fn decodeLiteralsHeader(src: []const u8, consumed_count: *usize) Literals.Header {
1171pub fn decodeLiteralsHeader(src: []const u8, consumed_count: *usize) LiteralsSection.Header {
11611172 // TODO: we probably want to enable safety for release-fast and release-small (or insert custom checks)
11621173 const start = consumed_count.*;
11631174 const byte0 = src[0];
1164 const block_type = @intToEnum(Literals.BlockType, byte0 & 0b11);
1175 const block_type = @intToEnum(LiteralsSection.BlockType, byte0 & 0b11);
11651176 const size_format = @intCast(u2, (byte0 & 0b1100) >> 2);
11661177 var regenerated_size: u20 = undefined;
11671178 var compressed_size: ?u18 = null;
......@@ -1220,7 +1231,7 @@ pub fn decodeLiteralsHeader(src: []const u8, consumed_count: *usize) Literals.He
12201231 compressed_size,
12211232 },
12221233 );
1223 return Literals.Header{
1234 return LiteralsSection.Header{
12241235 .block_type = block_type,
12251236 .size_format = size_format,
12261237 .regenerated_size = regenerated_size,
......@@ -1228,7 +1239,7 @@ pub fn decodeLiteralsHeader(src: []const u8, consumed_count: *usize) Literals.He
12281239 };
12291240}
12301241
1231fn decodeSequencesHeader(src: []const u8, consumed_count: *usize) !Sequences.Header {
1242pub fn decodeSequencesHeader(src: []const u8, consumed_count: *usize) !SequencesSection.Header {
12321243 var sequence_count: u24 = undefined;
12331244
12341245 var bytes_read: usize = 0;
......@@ -1237,7 +1248,7 @@ fn decodeSequencesHeader(src: []const u8, consumed_count: *usize) !Sequences.Hea
12371248 bytes_read += 1;
12381249 log.debug("decoded sequences header '{}': sequence count = 0", .{std.fmt.fmtSliceHexUpper(src[0..bytes_read])});
12391250 consumed_count.* += bytes_read;
1240 return Sequences.Header{
1251 return SequencesSection.Header{
12411252 .sequence_count = 0,
12421253 .offsets = undefined,
12431254 .match_lengths = undefined,
......@@ -1258,9 +1269,9 @@ fn decodeSequencesHeader(src: []const u8, consumed_count: *usize) !Sequences.Hea
12581269 bytes_read += 1;
12591270
12601271 consumed_count.* += bytes_read;
1261 const matches_mode = @intToEnum(Sequences.Header.Mode, (compression_modes & 0b00001100) >> 2);
1262 const offsets_mode = @intToEnum(Sequences.Header.Mode, (compression_modes & 0b00110000) >> 4);
1263 const literal_mode = @intToEnum(Sequences.Header.Mode, (compression_modes & 0b11000000) >> 6);
1272 const matches_mode = @intToEnum(SequencesSection.Header.Mode, (compression_modes & 0b00001100) >> 2);
1273 const offsets_mode = @intToEnum(SequencesSection.Header.Mode, (compression_modes & 0b00110000) >> 4);
1274 const literal_mode = @intToEnum(SequencesSection.Header.Mode, (compression_modes & 0b11000000) >> 6);
12641275 log.debug("decoded sequences header '{}': (sc={d},o={s},m={s},l={s})", .{
12651276 std.fmt.fmtSliceHexUpper(src[0..bytes_read]),
12661277 sequence_count,
......@@ -1270,7 +1281,7 @@ fn decodeSequencesHeader(src: []const u8, consumed_count: *usize) !Sequences.Hea
12701281 });
12711282 if (compression_modes & 0b11 != 0) return error.ReservedBitSet;
12721283
1273 return Sequences.Header{
1284 return SequencesSection.Header{
12741285 .sequence_count = sequence_count,
12751286 .offsets = offsets_mode,
12761287 .match_lengths = matches_mode,
......@@ -1428,25 +1439,25 @@ const ReversedByteReader = struct {
14281439 }
14291440};
14301441
1431const ReverseBitReader = struct {
1442pub const ReverseBitReader = struct {
14321443 byte_reader: ReversedByteReader,
14331444 bit_reader: std.io.BitReader(.Big, ReversedByteReader.Reader),
14341445
1435 fn init(self: *ReverseBitReader, bytes: []const u8) !void {
1446 pub fn init(self: *ReverseBitReader, bytes: []const u8) !void {
14361447 self.byte_reader = ReversedByteReader.init(bytes);
14371448 self.bit_reader = std.io.bitReader(.Big, self.byte_reader.reader());
14381449 while (0 == self.readBitsNoEof(u1, 1) catch return error.BitStreamHasNoStartBit) {}
14391450 }
14401451
1441 fn readBitsNoEof(self: *@This(), comptime U: type, num_bits: usize) !U {
1452 pub fn readBitsNoEof(self: *@This(), comptime U: type, num_bits: usize) !U {
14421453 return self.bit_reader.readBitsNoEof(U, num_bits);
14431454 }
14441455
1445 fn readBits(self: *@This(), comptime U: type, num_bits: usize, out_bits: *usize) !U {
1456 pub fn readBits(self: *@This(), comptime U: type, num_bits: usize, out_bits: *usize) !U {
14461457 return try self.bit_reader.readBits(U, num_bits, out_bits);
14471458 }
14481459
1449 fn alignToByte(self: *@This()) void {
1460 pub fn alignToByte(self: *@This()) void {
14501461 self.bit_reader.alignToByte();
14511462 }
14521463};
......@@ -1514,7 +1525,7 @@ fn dumpFseTable(prefix: []const u8, table: []const Table.Fse) void {
15141525 }
15151526}
15161527
1517fn dumpHuffmanTree(tree: Literals.HuffmanTree) void {
1528fn dumpHuffmanTree(tree: LiteralsSection.HuffmanTree) void {
15181529 log.debug("Huffman tree: max bit count = {}, symbol count = {}", .{ tree.max_bit_count, tree.symbol_count_minus_one + 1 });
15191530 for (tree.nodes[0 .. tree.symbol_count_minus_one + 1]) |node| {
15201531 log.debug("symbol = {[symbol]d}, prefix = {[prefix]d}, weight = {[weight]d}", node);
lib/std/compress/zstandard/types.zig+3-3
......@@ -52,7 +52,7 @@ pub const frame = struct {
5252};
5353
5454pub const compressed_block = struct {
55 pub const Literals = struct {
55 pub const LiteralsSection = struct {
5656 header: Header,
5757 huffman_tree: ?HuffmanTree,
5858 streams: Streams,
......@@ -119,8 +119,8 @@ pub const compressed_block = struct {
119119 }
120120 };
121121
122 pub const Sequences = struct {
123 header: Sequences.Header,
122 pub const SequencesSection = struct {
123 header: SequencesSection.Header,
124124 literals_length_table: Table,
125125 offset_table: Table,
126126 match_length_table: Table,