struct Header [src]

Fields

sequence_count: u24
match_lengths: Mode
offsets: Mode
literal_lengths: Mode

Members

Source

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