Function decode [src]

Prototype

pub fn decode(in: *Reader, remaining: *Limit, buffer: []u8) DecodeError!LiteralsSection

Parameters

in: *Readerremaining: *Limitbuffer: []u8

Possible Errors

EndOfStream

Not enough bytes to complete the section.

MalformedAccuracyLog

Compressed literals have invalid accuracy.

MalformedFseTable

Compressed literals have invalid FSE table.

MalformedHuffmanTree

Failed decoding a Huffamn tree.

MalformedLiteralsHeader

Invalid header.

MalformedLiteralsSection

Decoding errors.

MissingStartBit
ReadFailed

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, }; }, } }