51 lines
1006 B
Perl
Executable File
51 lines
1006 B
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
|
|
@ARGV || die "Usage: $0 <file1> <file2> ... <fileN>\n";
|
|
|
|
my @index;
|
|
my $offset = 0;
|
|
|
|
foreach my $file ( @ARGV )
|
|
{
|
|
if( -f $file && open F, "< $file" )
|
|
{
|
|
warn sprintf "Member at 0x%08X\n", $offset;
|
|
push @index, [ ];
|
|
|
|
my $size = length $file;
|
|
|
|
print $file;
|
|
print "\0" x ( $size % 4 );
|
|
|
|
$index[-1][0] = $offset;
|
|
$index[-1][1] = $size;
|
|
$index[-1][2] = $offset + $size + ( $size % 4 );
|
|
|
|
|
|
$size = 0;
|
|
while( read F, my $buffer, 4096 ) {
|
|
$size += length $buffer;
|
|
print $buffer;
|
|
}
|
|
print "\0" x ( $size % 4 );
|
|
|
|
$index[-1][3] = $size;
|
|
$offset = $index[-1][2] + $size + ( $size % 4 );
|
|
|
|
close F;
|
|
}
|
|
}
|
|
|
|
my $count = 1;
|
|
foreach my $file ( @index )
|
|
{
|
|
warn sprintf "Index[%4d]: 0x%08X 0x%08X 0x%08X 0x%08X\n", $count++, $file->[0], $file->[1], $file->[2], $file->[3];
|
|
print pack "NNNNnn", $file->[0], $file->[1], $file->[2], $file->[3], 0x0000, 0x0000;
|
|
}
|
|
|
|
warn sprintf "Index at 0x%08X, length 0x%08X\n", $offset, @index * 20;
|
|
print pack "N", $offset;
|
|
|