Added parent_path to Files
Should allow for (future) better path parsing
This commit is contained in:
+16
-4
@@ -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
@@ -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 = "",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user