struct SequencesSection [src]
Fields
header: Header
literals_length_table: Table
offset_table: Table
match_length_table: Table
Members
- Header (struct)
Source
pub const SequencesSection = struct {
header: Header,
literals_length_table: Table,
offset_table: Table,
match_length_table: Table,
pub const Header = struct {
sequence_count: u24,
match_lengths: Mode,
offsets: Mode,
literal_lengths: Mode,
pub const Mode = enum(u2) {
predefined,
rle,
fse,
repeat,
};
pub const DecodeError = error{
ReservedBitSet,
EndOfStream,
ReadFailed,
};
pub fn decode(in: *Reader, remaining: *Limit) DecodeError!Header {
var sequence_count: u24 = undefined;
remaining.* = remaining.subtract(1) orelse return error.EndOfStream;
const byte0 = try in.takeByte();
if (byte0 == 0) {
return .{
.sequence_count = 0,
.offsets = undefined,
.match_lengths = undefined,
.literal_lengths = undefined,
};
} else if (byte0 < 128) {
remaining.* = remaining.subtract(1) orelse return error.EndOfStream;
sequence_count = byte0;
} else if (byte0 < 255) {
remaining.* = remaining.subtract(2) orelse return error.EndOfStream;
sequence_count = (@as(u24, (byte0 - 128)) << 8) + try in.takeByte();
} else {
remaining.* = remaining.subtract(3) orelse return error.EndOfStream;
sequence_count = (try in.takeByte()) + (@as(u24, try in.takeByte()) << 8) + 0x7F00;
}
const compression_modes = try in.takeByte();
const matches_mode: Header.Mode = @enumFromInt((compression_modes & 0b00001100) >> 2);
const offsets_mode: Header.Mode = @enumFromInt((compression_modes & 0b00110000) >> 4);
const literal_mode: Header.Mode = @enumFromInt((compression_modes & 0b11000000) >> 6);
if (compression_modes & 0b11 != 0) return error.ReservedBitSet;
return .{
.sequence_count = sequence_count,
.offsets = offsets_mode,
.match_lengths = matches_mode,
.literal_lengths = literal_mode,
};
}
};
}