Almost there?
This commit is contained in:
+14
-9
@@ -6,9 +6,10 @@ const FileHolder = @import("readers/file_holder.zig").FileHolder;
|
||||
const Superblock = @import("superblock.zig").Superblock;
|
||||
const File = @import("file.zig").File;
|
||||
const MetadataReader = @import("readers/metadata.zig").MetadataReader;
|
||||
const DirEntry = @import("directory.zig").DirEntry;
|
||||
|
||||
pub const Reader = struct {
|
||||
arena: std.heap.ArenaAllocator,
|
||||
alloc: std.mem.Allocator,
|
||||
holder: FileHolder,
|
||||
super: Superblock,
|
||||
root: File,
|
||||
@@ -17,9 +18,8 @@ pub const Reader = struct {
|
||||
var holder: FileHolder = try .init(filepath, offset);
|
||||
const super: Superblock = try holder.reader().readStruct(Superblock);
|
||||
try super.validate();
|
||||
const arena: std.heap.ArenaAllocator = .init(alloc);
|
||||
var out: Reader = .{
|
||||
.arena = arena,
|
||||
.alloc = alloc,
|
||||
.holder = holder,
|
||||
.super = super,
|
||||
.root = undefined,
|
||||
@@ -28,14 +28,14 @@ pub const Reader = struct {
|
||||
return out;
|
||||
}
|
||||
pub fn deinit(self: *Reader) void {
|
||||
self.arena.deinit();
|
||||
self.root.deinit(self.alloc);
|
||||
self.holder.deinit();
|
||||
}
|
||||
|
||||
fn fileFromRef(self: *Reader, ref: inode.InodeRef, name: []const u8) !File {
|
||||
var offset_rdr = self.holder.readerAt(ref.block_start + self.super.inode_table_start);
|
||||
var meta_rdr: MetadataReader = try .init(
|
||||
self.arena.allocator(),
|
||||
self.alloc,
|
||||
offset_rdr.any(),
|
||||
self.super.decomp,
|
||||
);
|
||||
@@ -44,7 +44,7 @@ pub const Reader = struct {
|
||||
return .{
|
||||
.name = name,
|
||||
.inode = try .init(
|
||||
self.arena.allocator(),
|
||||
self.alloc,
|
||||
meta_rdr.any(),
|
||||
self.super.block_size,
|
||||
),
|
||||
@@ -53,8 +53,13 @@ pub const Reader = struct {
|
||||
};
|
||||
|
||||
test "reader" {
|
||||
const test_file_path = "testing/LinuxPATest.sfs";
|
||||
var rdr: Reader = try .init(std.testing.allocator, test_file_path, 0);
|
||||
const test_sfs_path = "testing/LinuxPATest.sfs";
|
||||
const test_file_path = "PortableApps/PortableApps.com/Data/PortableAppsMenu.ini";
|
||||
|
||||
var rdr: Reader = try .init(std.testing.allocator, test_sfs_path, 0);
|
||||
defer rdr.deinit();
|
||||
std.debug.print("{}\n", .{rdr.root});
|
||||
var fil = try rdr.root.open(&rdr, test_file_path);
|
||||
defer fil.deinit(rdr.alloc);
|
||||
|
||||
std.debug.print("{}\n", .{fil});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user