| ... | @@ -368,35 +368,11 @@ pub const Member = struct { | ... | @@ -368,35 +368,11 @@ pub const Member = struct { |
| 368 | return @ptrCast(@alignCast(member.header_ni.slice(&coff.mf))); | 368 | return @ptrCast(@alignCast(member.header_ni.slice(&coff.mf))); |
| 369 | } | 369 | } |
| 370 | | 370 | |
| 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 | | | |
| 391 | /// Sets `name` as the name field of this member's header, either directly (if it's short enough), | 371 | /// Sets `name` as the name field of this member's header, either directly (if it's short enough), |
| 392 | /// or by creating an entry in the longnames member and storing a reference to that entry. | 372 | /// 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 { | 373 | pub fn initHeader(member: *Member, coff: *Coff, name: []const u8, timestamp: u32) !void { |
| 394 | if (name.len < field.len) { | 374 | const max_name_len = @typeInfo(@FieldType(std.coff.ArchiveMemberHeader, "name")).array.len; |
| 395 | @memcpy(field[0..name.len], name); | 375 | const opt_name_offset = if (name.len >= max_name_len) offset: { |
| 396 | field[name.len] = '/'; | | |
| 397 | const padding = field.len - name.len - 1; | | |
| 398 | if (padding > 0) @memset(field[field.len - padding ..], ' '); | | |
| 399 | } else { | | |
| 400 | const gpa = coff.base.comp.gpa; | 376 | const gpa = coff.base.comp.gpa; |
| 401 | const entries_ctx = LongNamesTable.Adapter{ .coff = coff }; | 377 | const entries_ctx = LongNamesTable.Adapter{ .coff = coff }; |
| 402 | const gop = try coff.long_names_table.entries.getOrPutAdapted( | 378 | const gop = try coff.long_names_table.entries.getOrPutAdapted( |
| ... | @@ -410,7 +386,7 @@ pub const Member = struct { | ... | @@ -410,7 +386,7 @@ pub const Member = struct { |
| 410 | | 386 | |
| 411 | _, const old_size = Node.known.longnames_member.location(&coff.mf).resolve(&coff.mf); | 387 | _, const old_size = Node.known.longnames_member.location(&coff.mf).resolve(&coff.mf); |
| 412 | const new_size = old_size + name.len + 1; | 388 | 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)); |
| 414 | | 390 | |
| 415 | try Node.known.longnames_member.resize(&coff.mf, gpa, new_size); | 391 | try Node.known.longnames_member.resize(&coff.mf, gpa, new_size); |
| 416 | const name_table_slice = Node.known.longnames_member.slice(&coff.mf); | 392 | const name_table_slice = Node.known.longnames_member.slice(&coff.mf); |