Function decode [src]

Prototype

pub fn decode(in: *Reader, remaining: *Limit) DecodeError!Header

Parameters

in: *Readerremaining: *Limit

Possible Errors

EndOfStream
ReadFailed
ReservedBitSet

Source

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