Function decode [src]
Prototype
pub fn decode(in: *Reader, remaining: *Limit, buffer: []u8) DecodeError!LiteralsSection Parameters
in: *Readerremaining: *Limitbuffer: []u8 Possible Errors
Not enough bytes to complete the section.
Compressed literals have invalid accuracy.
Compressed literals have invalid FSE table.
Failed decoding a Huffamn tree.
Invalid header.
Decoding errors.
Source
pub fn decode(in: *Reader, remaining: *Limit, buffer: []u8) DecodeError!LiteralsSection {
const header = try Header.decode(in, remaining);
switch (header.block_type) {
.raw => {
if (buffer.len < header.regenerated_size) return error.MalformedLiteralsSection;
remaining.* = remaining.subtract(header.regenerated_size) orelse return error.EndOfStream;
try in.readSliceAll(buffer[0..header.regenerated_size]);
return .{
.header = header,
.huffman_tree = null,
.streams = .{ .one = buffer },
};
},
.rle => {
remaining.* = remaining.subtract(1) orelse return error.EndOfStream;
buffer[0] = try in.takeByte();
return .{
.header = header,
.huffman_tree = null,
.streams = .{ .one = buffer[0..1] },
};
},
.compressed, .treeless => {
const before_remaining = remaining.*;
const huffman_tree = if (header.block_type == .compressed)
try HuffmanTree.decode(in, remaining)
else
null;
const huffman_tree_size = @intFromEnum(before_remaining) - @intFromEnum(remaining.*);
const total_streams_size = std.math.sub(usize, header.compressed_size.?, huffman_tree_size) catch
return error.MalformedLiteralsSection;
if (total_streams_size > buffer.len) return error.MalformedLiteralsSection;
remaining.* = remaining.subtract(total_streams_size) orelse return error.EndOfStream;
try in.readSliceAll(buffer[0..total_streams_size]);
const stream_data = buffer[0..total_streams_size];
const streams = try Streams.decode(header.size_format, stream_data);
return .{
.header = header,
.huffman_tree = huffman_tree,
.streams = streams,
};
},
}
}