From a86680485311ea3dcf8e8c28c6bba1f9f63aeb56 Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Tue, 13 May 2025 22:29:45 -0500 Subject: [PATCH] A bit more work on metadata reader --- metadata_reader.zig | 36 +++++++++++++++++++++++++++++++++++- squashfs.zig | 1 - 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/metadata_reader.zig b/metadata_reader.zig index 1bab78a..9d4b597 100644 --- a/metadata_reader.zig +++ b/metadata_reader.zig @@ -1,11 +1,45 @@ const std = @import("std"); +const io = std.io; const MetadataHeader = packed struct { - compressed: bool, + not_compressed: bool, size: u15, }; const MetadataReader = struct { rdr: std.io.AnyReader, + alloc: std.heap.Allocator, curBlock: []const u8, + curOffset: u16, + + pub fn init(rdr: io.AnyReader, alloc: std.heap.Allocator) !MetadataReader { + const out = .{ + .rdr = rdr, + .alloc = alloc, + .curBlock = undefined, + .curOffset = 0, + }; + try out.readNextBlock(); + return out; + } + pub fn any(self: MetadataReader) !io.AnyReader { + return .{ + .context = @ptrCast(&self), + .readFn = typeErasedReadFn, + }; + } + + fn readNextBlock(self: MetadataReader) !void { + if (self.curBlock != undefined) { + self.alloc.free(self.curBlock); + } + self.curOffset = 0; + const hdr = try self.rdr.readStruct(MetadataHeader); + const buf = try self.alloc.alloc(u8, hdr.size); + if (hdr.not_compressed) { + self.curBlock = buf; + } else { + //TODO: decompress + } + } }; diff --git a/squashfs.zig b/squashfs.zig index 1da4d9e..93c75ad 100644 --- a/squashfs.zig +++ b/squashfs.zig @@ -23,7 +23,6 @@ pub fn newReader(filename: []const u8) !Reader { errdefer alloc.deinit(); const super = try file.reader().readStruct(Superblock); try super.valid(); - return Reader{ .super = super, .rdr = file,