Function decodeZstandardFrameBlocksArrayList [src]

Prototype

pub fn decodeZstandardFrameBlocksArrayList( allocator: Allocator, dest: *std.ArrayList(u8), src: []const u8, frame_context: *FrameContext, ) (error{OutOfMemory} || FrameError)!usize

Parameters

allocator: Allocatordest: *std.ArrayList(u8)src: []const u8frame_context: *FrameContext

Source

pub fn decodeZstandardFrameBlocksArrayList( allocator: Allocator, dest: *std.ArrayList(u8), src: []const u8, frame_context: *FrameContext, ) (error{OutOfMemory} || FrameError)!usize { const initial_len = dest.items.len; var ring_buffer = try RingBuffer.init(allocator, frame_context.window_size); defer ring_buffer.deinit(allocator); // These tables take 7680 bytes var literal_fse_data: [types.compressed_block.table_size_max.literal]Table.Fse = undefined; var match_fse_data: [types.compressed_block.table_size_max.match]Table.Fse = undefined; var offset_fse_data: [types.compressed_block.table_size_max.offset]Table.Fse = undefined; var block_header = try block.decodeBlockHeaderSlice(src); var consumed_count: usize = 3; var decode_state = block.DecodeState.init(&literal_fse_data, &match_fse_data, &offset_fse_data); while (true) : ({ block_header = try block.decodeBlockHeaderSlice(src[consumed_count..]); consumed_count += 3; }) { const written_size = try block.decodeBlockRingBuffer( &ring_buffer, src[consumed_count..], block_header, &decode_state, &consumed_count, frame_context.block_size_max, ); if (frame_context.content_size) |size| { if (dest.items.len - initial_len > size) { return error.BadContentSize; } } if (written_size > 0) { const written_slice = ring_buffer.sliceLast(written_size); try dest.appendSlice(written_slice.first); try dest.appendSlice(written_slice.second); if (frame_context.hasher_opt) |*hasher| { hasher.update(written_slice.first); hasher.update(written_slice.second); } } if (block_header.last_block) break; } if (frame_context.content_size) |size| { if (dest.items.len - initial_len != size) { return error.BadContentSize; } } if (frame_context.has_checksum) { if (src.len < consumed_count + 4) return error.EndOfStream; const checksum = std.mem.readInt(u32, src[consumed_count..][0..4], .little); consumed_count += 4; if (frame_context.hasher_opt) |*hasher| { if (checksum != computeChecksum(hasher)) return error.ChecksumFailure; } } return consumed_count; }