structstd.compress.lzma.decode.Params[src]

Fields

properties: Properties
dict_size: u32
unpacked_size: ?u64

Functions

FunctionreadHeader[src]

pub fn readHeader(reader: anytype, options: Options) !Params

Parameters

options: Options

Source Code

Source code
pub fn readHeader(reader: anytype, options: Options) !Params {
    var props = try reader.readByte();
    if (props >= 225) {
        return error.CorruptInput;
    }

    const lc = @as(u4, @intCast(props % 9));
    props /= 9;
    const lp = @as(u3, @intCast(props % 5));
    props /= 5;
    const pb = @as(u3, @intCast(props));

    const dict_size_provided = try reader.readInt(u32, .little);
    const dict_size = @max(0x1000, dict_size_provided);

    const unpacked_size = switch (options.unpacked_size) {
        .read_from_header => blk: {
            const unpacked_size_provided = try reader.readInt(u64, .little);
            const marker_mandatory = unpacked_size_provided == 0xFFFF_FFFF_FFFF_FFFF;
            break :blk if (marker_mandatory)
                null
            else
                unpacked_size_provided;
        },
        .read_header_but_use_provided => |x| blk: {
            _ = try reader.readInt(u64, .little);
            break :blk x;
        },
        .use_provided => |x| x,
    };

    return Params{
        .properties = Properties{ .lc = lc, .lp = lp, .pb = pb },
        .dict_size = dict_size,
        .unpacked_size = unpacked_size,
    };
}

Source Code

Source code
pub const Params = struct {
    properties: Properties,
    dict_size: u32,
    unpacked_size: ?u64,

    pub fn readHeader(reader: anytype, options: Options) !Params {
        var props = try reader.readByte();
        if (props >= 225) {
            return error.CorruptInput;
        }

        const lc = @as(u4, @intCast(props % 9));
        props /= 9;
        const lp = @as(u3, @intCast(props % 5));
        props /= 5;
        const pb = @as(u3, @intCast(props));

        const dict_size_provided = try reader.readInt(u32, .little);
        const dict_size = @max(0x1000, dict_size_provided);

        const unpacked_size = switch (options.unpacked_size) {
            .read_from_header => blk: {
                const unpacked_size_provided = try reader.readInt(u64, .little);
                const marker_mandatory = unpacked_size_provided == 0xFFFF_FFFF_FFFF_FFFF;
                break :blk if (marker_mandatory)
                    null
                else
                    unpacked_size_provided;
            },
            .read_header_but_use_provided => |x| blk: {
                _ = try reader.readInt(u64, .little);
                break :blk x;
            },
            .use_provided => |x| x,
        };

        return Params{
            .properties = Properties{ .lc = lc, .lp = lp, .pb = pb },
            .dict_size = dict_size,
            .unpacked_size = unpacked_size,
        };
    }
}