authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-05 01:55:34-04:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-23 00:22:41-04:00
log9bf95b438196f8eef28a37e35976142aea152ae9
tree1b18ea1e371ca75a956cb52e2a97f814add20634
parent3c3f5dfc4fc87fabe8b9a64a7589d9af09f64d7f

Coff: Progress on loading inputs

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

1 files changed, 4 insertions(+), 28 deletions(-)

src/link/Coff.zig+4-28
......@@ -368,35 +368,11 @@ pub const Member = struct {
368368 return @ptrCast(@alignCast(member.header_ni.slice(&coff.mf)));
369369 }
370370
371 pub fn initHeader(member: *Member, coff: *Coff, name: []const u8, timestamp: u32) !void {
372 const header = member.headerPtr(coff);
373 try storeHeaderName(coff, &header.name, name);
374 storeHeaderDecimalStr(&header.date, timestamp);
375
376 // Matching the Microsoft behaviour of emitting blanks for these fields
377 header.user_id = @splat(' ');
378 header.group_id = @splat(' ');
379
380 // file_mode is actually octal, but we only ever write 0 to it
381 storeHeaderDecimalStr(&header.file_mode, 0);
382 if (!member.content_ni.hasResized(&coff.mf))
383 storeHeaderDecimalStr(
384 &header.size,
385 member.content_ni.location(&coff.mf).resolve(&coff.mf)[1],
386 );
387
388 @memcpy(&header.end_of_header, "`\n");
389 }
390
391371 /// Sets `name` as the name field of this member's header, either directly (if it's short enough),
392372 /// or by creating an entry in the longnames member and storing a reference to that entry.
393 pub fn storeHeaderName(coff: *Coff, field: *[16]u8, name: []const u8) !void {
394 if (name.len < field.len) {
395 @memcpy(field[0..name.len], name);
396 field[name.len] = '/';
397 const padding = field.len - name.len - 1;
398 if (padding > 0) @memset(field[field.len - padding ..], ' ');
399 } else {
373 pub fn initHeader(member: *Member, coff: *Coff, name: []const u8, timestamp: u32) !void {
374 const max_name_len = @typeInfo(@FieldType(std.coff.ArchiveMemberHeader, "name")).array.len;
375 const opt_name_offset = if (name.len >= max_name_len) offset: {
400376 const gpa = coff.base.comp.gpa;
401377 const entries_ctx = LongNamesTable.Adapter{ .coff = coff };
402378 const gop = try coff.long_names_table.entries.getOrPutAdapted(
......@@ -410,7 +386,7 @@ pub const Member = struct {
410386
411387 _, const old_size = Node.known.longnames_member.location(&coff.mf).resolve(&coff.mf);
412388 const new_size = old_size + name.len + 1;
413 assert(new_size < comptime try std.math.powi(u64, 10, field.len - 1));
389 assert(new_size < comptime try std.math.powi(u64, 10, max_name_len - 1));
414390
415391 try Node.known.longnames_member.resize(&coff.mf, gpa, new_size);
416392 const name_table_slice = Node.known.longnames_member.slice(&coff.mf);