Function decodeSequencesHeader [src]
Decode a sequences section header.
Errors returned:
error.ReservedBitSet if the reserved bit is set
error.EndOfStream if there are not enough bytes in source
Prototype
pub fn decodeSequencesHeader( source: anytype, ) !SequencesSection.Header
Source
pub fn decodeSequencesHeader(
source: anytype,
) !SequencesSection.Header {
var sequence_count: u24 = undefined;
const byte0 = try source.readByte();
if (byte0 == 0) {
return SequencesSection.Header{
.sequence_count = 0,
.offsets = undefined,
.match_lengths = undefined,
.literal_lengths = undefined,
};
} else if (byte0 < 128) {
sequence_count = byte0;
} else if (byte0 < 255) {
sequence_count = (@as(u24, (byte0 - 128)) << 8) + try source.readByte();
} else {
sequence_count = (try source.readByte()) + (@as(u24, try source.readByte()) << 8) + 0x7F00;
}
const compression_modes = try source.readByte();
const matches_mode = @as(SequencesSection.Header.Mode, @enumFromInt((compression_modes & 0b00001100) >> 2));
const offsets_mode = @as(SequencesSection.Header.Mode, @enumFromInt((compression_modes & 0b00110000) >> 4));
const literal_mode = @as(SequencesSection.Header.Mode, @enumFromInt((compression_modes & 0b11000000) >> 6));
if (compression_modes & 0b11 != 0) return error.ReservedBitSet;
return SequencesSection.Header{
.sequence_count = sequence_count,
.offsets = offsets_mode,
.match_lengths = matches_mode,
.literal_lengths = literal_mode,
};
}