aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/Archive.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-08-19 09:07:33 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-08-29 11:39:34 +0200
commit702bcfecf5732eceada9bfbca0804c706c238d49 (patch)
tree7a54653dd6e7dd77c0e5c59b98689bf0cb185853 /src/link/MachO/Archive.zig
parent69193a4ae421a1d69481addbba03e459df8d2a14 (diff)
downloadzig-702bcfecf5732eceada9bfbca0804c706c238d49.tar.gz
zig-702bcfecf5732eceada9bfbca0804c706c238d49.zip
macho: simplify input file parsing for both drivers
Diffstat (limited to 'src/link/MachO/Archive.zig')
-rw-r--r--src/link/MachO/Archive.zig36
1 files changed, 10 insertions, 26 deletions
diff --git a/src/link/MachO/Archive.zig b/src/link/MachO/Archive.zig
index 5276bf041e..f3922f6ff9 100644
--- a/src/link/MachO/Archive.zig
+++ b/src/link/MachO/Archive.zig
@@ -87,6 +87,13 @@ const ar_hdr = extern struct {
}
};
+pub fn isArchive(file: fs.File, fat_offset: u64) bool {
+ const reader = file.reader();
+ const magic = reader.readBytesNoEof(SARMAG) catch return false;
+ defer file.seekTo(fat_offset) catch {};
+ return mem.eql(u8, &magic, ARMAG);
+}
+
pub fn deinit(self: *Archive, allocator: Allocator) void {
self.file.close();
for (self.toc.keys()) |*key| {
@@ -100,21 +107,8 @@ pub fn deinit(self: *Archive, allocator: Allocator) void {
}
pub fn parse(self: *Archive, allocator: Allocator, reader: anytype) !void {
- const magic = try reader.readBytesNoEof(SARMAG);
- if (!mem.eql(u8, &magic, ARMAG)) {
- log.debug("invalid magic: expected '{s}', found '{s}'", .{ ARMAG, magic });
- return error.NotArchive;
- }
-
+ _ = try reader.readBytesNoEof(SARMAG);
self.header = try reader.readStruct(ar_hdr);
- if (!mem.eql(u8, &self.header.ar_fmag, ARFMAG)) {
- log.debug("invalid header delimiter: expected '{s}', found '{s}'", .{
- ARFMAG,
- self.header.ar_fmag,
- });
- return error.NotArchive;
- }
-
const name_or_length = try self.header.nameOrLength();
var embedded_name = try parseName(allocator, name_or_length, reader);
log.debug("parsing archive '{s}' at '{s}'", .{ embedded_name, self.name });
@@ -182,22 +176,12 @@ fn parseTableOfContents(self: *Archive, allocator: Allocator, reader: anytype) !
}
}
-pub fn parseObject(
- self: Archive,
- gpa: Allocator,
- cpu_arch: std.Target.Cpu.Arch,
- offset: u32,
-) !Object {
+pub fn parseObject(self: Archive, gpa: Allocator, offset: u32) !Object {
const reader = self.file.reader();
try reader.context.seekTo(self.fat_offset + offset);
const object_header = try reader.readStruct(ar_hdr);
- if (!mem.eql(u8, &object_header.ar_fmag, ARFMAG)) {
- log.err("invalid header delimiter: expected '{s}', found '{s}'", .{ ARFMAG, object_header.ar_fmag });
- return error.MalformedArchive;
- }
-
const name_or_length = try object_header.nameOrLength();
const object_name = try parseName(gpa, name_or_length, reader);
defer gpa.free(object_name);
@@ -227,7 +211,7 @@ pub fn parseObject(
.contents = contents,
};
- try object.parse(gpa, cpu_arch);
+ try object.parse(gpa);
return object;
}