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.

expandDelta

Expands delta data from delta_reader to writer.

The format of the delta data is documented in pack-format.

git.expandDelta
fn expandDelta(base_object: []const u8, delta_reader: *Io.Reader, writer: *Io.Writer) !void

File

Code

fn expandDelta(base_object: []const u8, delta_reader: *Io.Reader, writer: *Io.Writer) !void {
    while (true) {
        const inst: packed struct { value: u7, copy: bool } = @bitCast(delta_reader.takeByte() catch |e| switch (e) {
            error.EndOfStream => return,
            else => |other| return other,
        });
        if (inst.copy) {
            const available: packed struct {
                offset1: bool,
                offset2: bool,
                offset3: bool,
                offset4: bool,
                size1: bool,
                size2: bool,
                size3: bool,
            } = @bitCast(inst.value);
            const offset_parts: packed struct { offset1: u8, offset2: u8, offset3: u8, offset4: u8 } = .{
                .offset1 = if (available.offset1) try delta_reader.takeByte() else 0,
                .offset2 = if (available.offset2) try delta_reader.takeByte() else 0,
                .offset3 = if (available.offset3) try delta_reader.takeByte() else 0,
                .offset4 = if (available.offset4) try delta_reader.takeByte() else 0,
            };
            const base_offset: u32 = @bitCast(offset_parts);
            const size_parts: packed struct { size1: u8, size2: u8, size3: u8 } = .{
                .size1 = if (available.size1) try delta_reader.takeByte() else 0,
                .size2 = if (available.size2) try delta_reader.takeByte() else 0,
                .size3 = if (available.size3) try delta_reader.takeByte() else 0,
            };
            var size: u24 = @bitCast(size_parts);
            if (size == 0) size = 0x10000;
            try writer.writeAll(base_object[base_offset..][0..size]);
        } else if (inst.value != 0) {
            try delta_reader.streamExact(writer, inst.value);
        } else {
            return error.InvalidDeltaInstruction;
        }
    }
}