Function decodeLiteralsHeader [src]

Decode a literals section header. Errors returned: error.EndOfStream if there are not enough bytes in source

Prototype

pub fn decodeLiteralsHeader(source: anytype) !LiteralsSection.Header

Source

pub fn decodeLiteralsHeader(source: anytype) !LiteralsSection.Header { const byte0 = try source.readByte(); const block_type = @as(LiteralsSection.BlockType, @enumFromInt(byte0 & 0b11)); const size_format = @as(u2, @intCast((byte0 & 0b1100) >> 2)); var regenerated_size: u20 = undefined; var compressed_size: ?u18 = null; switch (block_type) { .raw, .rle => { switch (size_format) { 0, 2 => { regenerated_size = byte0 >> 3; }, 1 => regenerated_size = (byte0 >> 4) + (@as(u20, try source.readByte()) << 4), 3 => regenerated_size = (byte0 >> 4) + (@as(u20, try source.readByte()) << 4) + (@as(u20, try source.readByte()) << 12), } }, .compressed, .treeless => { const byte1 = try source.readByte(); const byte2 = try source.readByte(); switch (size_format) { 0, 1 => { regenerated_size = (byte0 >> 4) + ((@as(u20, byte1) & 0b00111111) << 4); compressed_size = ((byte1 & 0b11000000) >> 6) + (@as(u18, byte2) << 2); }, 2 => { const byte3 = try source.readByte(); regenerated_size = (byte0 >> 4) + (@as(u20, byte1) << 4) + ((@as(u20, byte2) & 0b00000011) << 12); compressed_size = ((byte2 & 0b11111100) >> 2) + (@as(u18, byte3) << 6); }, 3 => { const byte3 = try source.readByte(); const byte4 = try source.readByte(); regenerated_size = (byte0 >> 4) + (@as(u20, byte1) << 4) + ((@as(u20, byte2) & 0b00111111) << 12); compressed_size = ((byte2 & 0b11000000) >> 6) + (@as(u18, byte3) << 2) + (@as(u18, byte4) << 10); }, } }, } return LiteralsSection.Header{ .block_type = block_type, .size_format = size_format, .regenerated_size = regenerated_size, .compressed_size = compressed_size, }; }