| ... | ... | @@ -368,35 +368,11 @@ pub const Member = struct { |
| 368 | 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 | 371 | /// Sets `name` as the name field of this member's header, either directly (if it's short enough), |
| 392 | 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 { |
| 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: { |
| 400 | 376 | const gpa = coff.base.comp.gpa; |
| 401 | 377 | const entries_ctx = LongNamesTable.Adapter{ .coff = coff }; |
| 402 | 378 | const gop = try coff.long_names_table.entries.getOrPutAdapted( |
| ... | ... | @@ -410,7 +386,7 @@ pub const Member = struct { |
| 410 | 386 | |
| 411 | 387 | _, const old_size = Node.known.longnames_member.location(&coff.mf).resolve(&coff.mf); |
| 412 | 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 | 391 | try Node.known.longnames_member.resize(&coff.mf, gpa, new_size); |
| 416 | 392 | const name_table_slice = Node.known.longnames_member.slice(&coff.mf); |