Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › compress/ › xz/ › Decompress.zig › readBlock
readBlock
Decompress.readBlock
fn readBlock (input : *Reader , allocating : *Writer .Allocating ) !void
File
Code
fn readBlock (input : *Reader , allocating : *Writer .Allocating ) !void {
var packed_size : ?u64 = null ;
var unpacked_size : ?u64 = null ;
const header_size = h : {
const first_byte : usize = try input .peekByte ();
if (first_byte == 0 ) return error .SuccessfulEndOfStream ;
const declared_header_size = first_byte * 4 ;
try input .fill (declared_header_size );
const header_seek_start = input .seek ;
input .toss (1 );
const Flags = packed struct (u8 ) {
last_filter_index : u2 ,
reserved : u4 ,
has_packed_size : bool ,
has_unpacked_size : bool ,
};
const flags = try input .takeStruct (Flags , .little );
const filter_count = @as (u3 , flags .last_filter_index ) + 1 ;
if (filter_count > 1 ) return error .Unsupported ;
if (flags .has_packed_size ) packed_size = try input .takeLeb128 (u64 );
if (flags .has_unpacked_size ) unpacked_size = try input .takeLeb128 (u64 );
const FilterId = enum (u64 ) {
lzma2 = 0x21 ,
_ ,
};
const filter_id : FilterId = @fromBackingInt (@intCast (try input .takeLeb128 (u64 )));
if (filter_id != .lzma2 ) return error .Unsupported ;
const properties_size = try input .takeLeb128 (u64 );
if (properties_size != 1 ) return error .CorruptInput ;
_ = try input .takeByte ();
const actual_header_size = input .seek - header_seek_start ;
if (actual_header_size > declared_header_size ) return error .CorruptInput ;
const remaining_bytes = declared_header_size - actual_header_size ;
for (0 ..remaining_bytes ) |_ | {
if (try input .takeByte () != 0 ) return error .CorruptInput ;
}
const header_slice = input .buffer [header_seek_start ..][0 ..declared_header_size ];
const computed_checksum = Crc32 .hash (header_slice );
const declared_checksum = try input .takeInt (u32 , .little );
if (computed_checksum != declared_checksum ) return error .WrongChecksum ;
break :h declared_header_size ;
};
var lzma2_decode = try lzma2 .Decode .init (allocating .allocator );
defer lzma2_decode .deinit (allocating .allocator );
const before_size = allocating .writer .end ;
const packed_bytes_read = try lzma2_decode .decompress (input , allocating );
const unpacked_bytes = allocating .writer .end - before_size ;
if (packed_size ) |s | {
if (s != packed_bytes_read ) return error .CorruptInput ;
}
if (unpacked_size ) |s | {
if (s != unpacked_bytes ) return error .CorruptInput ;
}
const block_counter = header_size + packed_bytes_read ;
const padding = try input .take (@intCast ((4 - (block_counter % 4 )) % 4 ));
for (padding ) |byte | {
if (byte != 0 ) return error .CorruptInput ;
}
}