zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 9bf95b438196f8eef28a37e35976142aea152ae9 (tree)
parent 3c3f5dfc4fc87fabe8b9a64a7589d9af09f64d7f
Author: kcbanner <kcbanner@gmail.com>
Date:   Fri,  5 Jun 2026 01:55:34 -0400

Coff: Progress on loading inputs

- Fixup writing to the longnames member
- More .obj parsing

Diffstat:
Msrc/link/Coff.zig | 32++++----------------------------
1 file changed, 4 insertions(+), 28 deletions(-)

diff --git a/src/link/Coff.zig b/src/link/Coff.zig @@ -368,35 +368,11 @@ pub const Member = struct { return @ptrCast(@alignCast(member.header_ni.slice(&coff.mf))); } - pub fn initHeader(member: *Member, coff: *Coff, name: []const u8, timestamp: u32) !void { - const header = member.headerPtr(coff); - try storeHeaderName(coff, &header.name, name); - storeHeaderDecimalStr(&header.date, timestamp); - - // Matching the Microsoft behaviour of emitting blanks for these fields - header.user_id = @splat(' '); - header.group_id = @splat(' '); - - // file_mode is actually octal, but we only ever write 0 to it - storeHeaderDecimalStr(&header.file_mode, 0); - if (!member.content_ni.hasResized(&coff.mf)) - storeHeaderDecimalStr( - &header.size, - member.content_ni.location(&coff.mf).resolve(&coff.mf)[1], - ); - - @memcpy(&header.end_of_header, "`\n"); - } - /// Sets `name` as the name field of this member's header, either directly (if it's short enough), /// or by creating an entry in the longnames member and storing a reference to that entry. - pub fn storeHeaderName(coff: *Coff, field: *[16]u8, name: []const u8) !void { - if (name.len < field.len) { - @memcpy(field[0..name.len], name); - field[name.len] = '/'; - const padding = field.len - name.len - 1; - if (padding > 0) @memset(field[field.len - padding ..], ' '); - } else { + pub fn initHeader(member: *Member, coff: *Coff, name: []const u8, timestamp: u32) !void { + const max_name_len = @typeInfo(@FieldType(std.coff.ArchiveMemberHeader, "name")).array.len; + const opt_name_offset = if (name.len >= max_name_len) offset: { const gpa = coff.base.comp.gpa; const entries_ctx = LongNamesTable.Adapter{ .coff = coff }; const gop = try coff.long_names_table.entries.getOrPutAdapted( @@ -410,7 +386,7 @@ pub const Member = struct { _, const old_size = Node.known.longnames_member.location(&coff.mf).resolve(&coff.mf); const new_size = old_size + name.len + 1; - assert(new_size < comptime try std.math.powi(u64, 10, field.len - 1)); + assert(new_size < comptime try std.math.powi(u64, 10, max_name_len - 1)); try Node.known.longnames_member.resize(&coff.mf, gpa, new_size); const name_table_slice = Node.known.longnames_member.slice(&coff.mf);