86 lines
2 KiB
Perl
Executable file
86 lines
2 KiB
Perl
Executable file
#!/usr/bin/env perl
|
|
|
|
=head1 NAME
|
|
|
|
compressedfileconverter.pl
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This script converts files compressed by some crunchers
|
|
so they can be loaded and decompressed in-place, on the fly.
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
compressedfileconverter.pl [dnx|lc] uncompressed_infile compressed_infile outfile
|
|
|
|
=cut
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
|
|
my %margins = (
|
|
'' => 0,
|
|
'dnx' => 4,
|
|
'lc' => 3
|
|
);
|
|
|
|
my $type = '';
|
|
if (scalar @ARGV == 4) {
|
|
$type = shift @ARGV;
|
|
}
|
|
|
|
if (!($type ~~ %margins) or (scalar @ARGV != 3)) {
|
|
die "Usage: $0 [dnx|lc] uncompressed_infile compressed_infile outfile\n";
|
|
}
|
|
|
|
my $uncompressed_infile = shift @ARGV;
|
|
my $compressed_infile = shift @ARGV;
|
|
my $converted_outfile = shift @ARGV;
|
|
|
|
|
|
open UNCOMPRESSED, $uncompressed_infile
|
|
or die "\nCan't open uncompressed file $uncompressed_infile for reading: $!\n";
|
|
binmode UNCOMPRESSED;
|
|
|
|
my $uncompressed_address;
|
|
read(UNCOMPRESSED, $uncompressed_address, 2);
|
|
my $uncompressed_data;
|
|
my $uncompressed_size = read(UNCOMPRESSED, $uncompressed_data, 65536);
|
|
$uncompressed_address = unpack("S", $uncompressed_address);
|
|
close UNCOMPRESSED;
|
|
|
|
|
|
open COMPRESSED, $compressed_infile
|
|
or die "\nCan't open compressed file $compressed_infile for reading: $!\n";
|
|
binmode COMPRESSED;
|
|
|
|
my $compressed_data;
|
|
if (!($type eq 'lc')) {
|
|
my $compressed_address;
|
|
read(COMPRESSED, $compressed_address, 2);
|
|
}
|
|
my $compressed_size = read(COMPRESSED, $compressed_data, 65536);
|
|
close COMPRESSED;
|
|
|
|
open CONVERTED, ">$converted_outfile"
|
|
or die "\nCan't open converted file $converted_outfile for writing: $!\n";
|
|
binmode CONVERTED;
|
|
|
|
my $offset = 0;
|
|
my $safety_margin = $margins{$type};
|
|
$compressed_size += $offset;
|
|
my $converted_address = $uncompressed_address + $uncompressed_size + $safety_margin - $compressed_size;
|
|
|
|
|
|
$converted_address = pack("S", $converted_address);
|
|
print CONVERTED $converted_address;
|
|
if ($offset) {
|
|
$uncompressed_address = pack("S<", $uncompressed_address);
|
|
print CONVERTED $uncompressed_address;
|
|
}
|
|
print CONVERTED $compressed_data;
|
|
close CONVERTED;
|
|
|
|
exit 0;
|