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.

parseResource

cvtres.parseResource
pub fn parseResource(allocator: Allocator, reader: *std.Io.Reader, max_size: u64) !ResourceAndSize

File

Code

pub fn parseResource(allocator: Allocator, reader: *std.Io.Reader, max_size: u64) !ResourceAndSize {
    const data_size = try reader.takeInt(u32, .little);
    const header_size = try reader.takeInt(u32, .little);
    const total_size: u64 = @as(u64, header_size) + data_size;
    if (total_size > max_size) return error.ImpossibleSize;

    const remaining_header_bytes = try reader.take(header_size -| 8);
    var remaining_header_reader: std.Io.Reader = .fixed(remaining_header_bytes);
    const type_value = try parseNameOrOrdinal(allocator, &remaining_header_reader);
    errdefer type_value.deinit(allocator);

    const name_value = try parseNameOrOrdinal(allocator, &remaining_header_reader);
    errdefer name_value.deinit(allocator);

    const padding_after_name = numPaddingBytesNeeded(@intCast(remaining_header_reader.seek));
    try remaining_header_reader.discardAll(padding_after_name);

    std.debug.assert(remaining_header_reader.seek % 4 == 0);
    const data_version = try remaining_header_reader.takeInt(u32, .little);
    const memory_flags: MemoryFlags = @bitCast(try remaining_header_reader.takeInt(u16, .little));
    const language: Language = @bitCast(try remaining_header_reader.takeInt(u16, .little));
    const version = try remaining_header_reader.takeInt(u32, .little);
    const characteristics = try remaining_header_reader.takeInt(u32, .little);

    if (remaining_header_reader.seek != remaining_header_reader.end) return error.HeaderSizeMismatch;

    const data = try allocator.alloc(u8, data_size);
    errdefer allocator.free(data);
    try reader.readSliceAll(data);

    const padding_after_data = numPaddingBytesNeeded(@intCast(data_size));
    try reader.discardAll(padding_after_data);

    return .{
        .resource = .{
            .name_value = name_value,
            .type_value = type_value,
            .language = language,
            .memory_flags = memory_flags,
            .version = version,
            .characteristics = characteristics,
            .data_version = data_version,
            .data = data,
        },
        .total_size = header_size + data.len + padding_after_data,
    };
}