Added parent_path to Files

Should allow for (future) better path parsing
This commit is contained in:
Caleb Gardner
2025-05-31 21:49:09 -05:00
parent 8cc576a7fd
commit d48ed4259e
2 changed files with 22 additions and 9 deletions
+16 -4
View File
@@ -17,8 +17,9 @@ const MetadataReader = @import("readers/metadata.zig").MetadataReader;
pub const File = struct { pub const File = struct {
name: []const u8, name: []const u8,
inode: inode.Inode, inode: inode.Inode,
dirEntries: ?std.StringHashMap(DirEntry) = null, parent_path: []const u8,
dirEntries: ?std.StringHashMap(DirEntry) = null,
data_rdr: ?DataReader = null, data_rdr: ?DataReader = null,
pub const FileError = error{ pub const FileError = error{
@@ -28,7 +29,7 @@ pub const File = struct {
NotFound, NotFound,
}; };
fn fromDirEntry(rdr: *Reader, ent: DirEntry) !File { fn fromDirEntry(rdr: *Reader, ent: DirEntry, parent_path: []const u8) !File {
var offset_rdr = rdr.holder.readerAt(ent.block_start + rdr.super.inode_table_start); var offset_rdr = rdr.holder.readerAt(ent.block_start + rdr.super.inode_table_start);
var meta_rdr: MetadataReader = .init( var meta_rdr: MetadataReader = .init(
rdr.alloc, rdr.alloc,
@@ -47,6 +48,7 @@ pub const File = struct {
meta_rdr.any(), meta_rdr.any(),
rdr.super.block_size, rdr.super.block_size,
), ),
.parent_path = parent_path,
}; };
switch (out.inode.header.inode_type) { switch (out.inode.header.inode_type) {
.file, .ext_file => { .file, .ext_file => {
@@ -57,9 +59,19 @@ pub const File = struct {
return out; return out;
} }
fn file_path(self: File, alloc: std.mem.Allocator) ![]u8 {
if (self.parent_path.len == 0) {
const out = try alloc.alloc(u8, self.name.len);
@memcpy(out, self.name);
return out;
}
return std.mem.concat(alloc, u8, &[3][]const u8{ self.parent_path, "/", self.name });
}
pub fn deinit(self: *File, alloc: std.mem.Allocator) void { pub fn deinit(self: *File, alloc: std.mem.Allocator) void {
self.inode.deinit(); self.inode.deinit();
alloc.free(self.name); alloc.free(self.name);
alloc.free(self.parent_path);
if (self.data_rdr != null) self.data_rdr.?.deinit(); if (self.data_rdr != null) self.data_rdr.?.deinit();
if (self.dirEntries != null) { if (self.dirEntries != null) {
var iter = self.dirEntries.?.iterator(); var iter = self.dirEntries.?.iterator();
@@ -100,7 +112,7 @@ pub const File = struct {
if (ent == null) { if (ent == null) {
return FileError.NotFound; return FileError.NotFound;
} }
var fil = try fromDirEntry(rdr, ent.?); var fil = try fromDirEntry(rdr, ent.?, try self.file_path(rdr.alloc));
return fil.realOpen(rdr, clean_path[split_idx..], false); return fil.realOpen(rdr, clean_path[split_idx..], false);
} }
@@ -125,7 +137,7 @@ pub const File = struct {
var dirEntryIter = self.dirEntries.?.valueIterator(); var dirEntryIter = self.dirEntries.?.valueIterator();
var i: u32 = 0; var i: u32 = 0;
while (dirEntryIter.next()) |ent| : (i += 1) { while (dirEntryIter.next()) |ent| : (i += 1) {
files[i] = try .fromDirEntry(rdr, ent.*); files[i] = try .fromDirEntry(rdr, ent.*, try self.file_path(rdr.alloc));
} }
return .{ return .{
.alloc = rdr.alloc, .alloc = rdr.alloc,
+6 -5
View File
@@ -50,7 +50,7 @@ pub const Reader = struct {
super.id_table_start, super.id_table_start,
super.id_count, super.id_count,
); );
out.root = try out.fileFromRef(super.root_ref, ""); out.root = try out.rootFile();
return out; return out;
} }
pub fn deinit(self: *Reader) void { pub fn deinit(self: *Reader) void {
@@ -65,22 +65,23 @@ pub const Reader = struct {
return self.root.open(self, path); return self.root.open(self, path);
} }
fn fileFromRef(self: *Reader, ref: inode.InodeRef, name: []const u8) !File { fn rootFile(self: *Reader) !File {
var offset_rdr = self.holder.readerAt(ref.block_start + self.super.inode_table_start); var offset_rdr = self.holder.readerAt(self.super.root_ref.block_start + self.super.inode_table_start);
var meta_rdr: MetadataReader = .init( var meta_rdr: MetadataReader = .init(
self.alloc, self.alloc,
self.super.decomp, self.super.decomp,
offset_rdr.any(), offset_rdr.any(),
); );
defer meta_rdr.deinit(); defer meta_rdr.deinit();
try meta_rdr.skip(ref.offset); try meta_rdr.skip(self.super.root_ref.offset);
return .{ return .{
.name = name, .name = "",
.inode = try .init( .inode = try .init(
self.alloc, self.alloc,
meta_rdr.any(), meta_rdr.any(),
self.super.block_size, self.super.block_size,
), ),
.parent_path = "",
}; };
} }
}; };