diff --git a/src/directory.zig b/src/directory.zig index 2582ff8..11fc4cc 100644 --- a/src/directory.zig +++ b/src/directory.zig @@ -48,13 +48,19 @@ pub fn readDirectory(alloc: std.mem.Allocator, rdr: io.AnyReader, size: u64) !st var out: std.StringHashMap(DirEntry) = .init(alloc); errdefer out.deinit(); var red_size: u64 = 3; - var hdr: DirHeader = try rdr.readStruct(DirHeader); - while (red_size < size) : (hdr = try rdr.readStruct(DirHeader)) { + var hdr: DirHeader align(4) = undefined; + // rdr.readStruct reads 16 bytes, due to alignment. get around this by manually reading the memory and decoding + var hdr_tmp: [12]u8 = [_]u8{0} ** 12; + while (red_size < size) { + _ = try rdr.readAll(&hdr_tmp); + hdr = std.mem.bytesToValue(DirHeader, &hdr_tmp); + red_size += 12; var i: u32 = 0; + try out.ensureUnusedCapacity(hdr.count + 1); while (i <= hdr.count) : (i += 1) { var tmp: DirEntry = try .init(alloc, hdr, rdr); errdefer tmp.deinit(alloc); - try out.put(tmp.name, tmp); + out.putAssumeCapacity(tmp.name, tmp); red_size += 8 + tmp.name.len; } } diff --git a/src/file.zig b/src/file.zig index 93c4fbd..be4abe9 100644 --- a/src/file.zig +++ b/src/file.zig @@ -38,12 +38,11 @@ pub const File = struct { } fn realOpen(self: *File, reader: *Reader, path: []const u8, first: bool) !File { - const clean_path: []const u8 = std.mem.trimLeft(u8, path, "/"); + const clean_path: []const u8 = std.mem.trim(u8, path, "/"); if (clean_path.len == 0) { return self.*; } if (!first) { - defer reader.alloc.free(path); defer self.deinit(reader.alloc); } switch (self.inode.header.inode_type) { @@ -95,6 +94,7 @@ pub const File = struct { reader.super.decomp, ); defer meta_rdr.deinit(); + try meta_rdr.skip(offset); self.dirEntries = try directory.readDirectory(reader.alloc, meta_rdr.any(), size); self.hasEntries = true; } diff --git a/src/reader.zig b/src/reader.zig index d421394..023d9d8 100644 --- a/src/reader.zig +++ b/src/reader.zig @@ -61,5 +61,5 @@ test "reader" { var fil = try rdr.root.open(&rdr, test_file_path); defer fil.deinit(rdr.alloc); - std.debug.print("{}\n", .{fil}); + std.debug.print("{s}\n", .{fil.name}); }