Updated several tools to automatically perform the work that I've been doing

manually up to this point:

 - 'rom_diff.pl' command inspects two directories and looks at differences
    in filenames, and copies ROMs into 3 new directories (ADDED, REMOVED,
    and CHANGED).  This is most useful for when RomHunter releases new
    romsets.

 - 'merge_props.pl' command merges all properties from a source file that
    also exist in a destination file.  This is useful when I do a mass-edit
    of many ROMs, with the info being saved into my personal stella.pro file.
    Running this command afterwards will 'merge' them into the master
    stella.pro file, and then Stella can be recompiled with the new properties.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2379 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2012-02-04 14:51:26 +00:00
parent 716dd485cb
commit da9cfd8109
6 changed files with 18929 additions and 18748 deletions

View File

@ -1936,7 +1936,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "947317a89af38a49c4864d6bdd6a91fb", "CBS Electronics, Bob Curtiss", "4L 2487 5000", "Solar Fox (1983) (CBS Electronics)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "94b92a882f6dbaa6993a46e2dcc58402", "Activision, Larry Miller", "AX-026, AX-026-04", "Enduro (1983) (Activision)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "94d90f63678e086f6b6d5e1bc6c4c8c2", "Digivision", "", "Seaquest (Digivision)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "94e3fbc19107a169909e274187247a9d", "", "2402-044-01", "Freeway (Unknown)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "94e3fbc19107a169909e274187247a9d", "", "2402-044-01", "2-in-1 Freeway and Tennis (Unknown)", "", "", "", "2IN1", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "94e4c9b924286038527f49cdc20fda69", "Retroactive", "", "Qb (V2.12) (Stella) (2001) (Retroactive)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },
{ "94e7cc6342d11e508e7e8b2ddf53c255", "", "", "Missile Command (208 in 1) (Unknown) (PAL) (Hack)", "", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "94ff6b7489ed401dcaaf952fece10f67", "Atari - GCC, Mark Ackerman, Noellie Alito", "CX2692", "Moon Patrol (07-31-1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },

File diff suppressed because it is too large Load Diff

View File

@ -1,27 +1,52 @@
package PropSet;
# NOTE: If the property types ever change in Stella, the following hashmap
# and array must be updated (and stay in sequence)
my %prop_type = (
"Cartridge.MD5" => 0,
"Cartridge.Manufacturer" => 1,
"Cartridge.ModelNo" => 2,
"Cartridge.Name" => 3,
"Cartridge.Note" => 4,
"Cartridge.Rarity" => 5,
"Cartridge.Sound" => 6,
"Cartridge.Type" => 7,
"Console.LeftDifficulty" => 8,
"Console.RightDifficulty" => 9,
"Console.TelevisionType" => 10,
"Console.SwapPorts" => 11,
"Controller.Left" => 12,
"Controller.Right" => 13,
"Controller.SwapPaddles" => 14,
"Controller.MouseAxis" => 15,
"Display.Format" => 16,
"Display.YStart" => 17,
"Display.Height" => 18,
"Display.Phosphor" => 19,
"Display.PPBlend" => 20
"Cartridge.MD5" => 0,
"Cartridge.Manufacturer" => 1,
"Cartridge.ModelNo" => 2,
"Cartridge.Name" => 3,
"Cartridge.Note" => 4,
"Cartridge.Rarity" => 5,
"Cartridge.Sound" => 6,
"Cartridge.Type" => 7,
"Console.LeftDifficulty" => 8,
"Console.RightDifficulty" => 9,
"Console.TelevisionType" => 10,
"Console.SwapPorts" => 11,
"Controller.Left" => 12,
"Controller.Right" => 13,
"Controller.SwapPaddles" => 14,
"Controller.MouseAxis" => 15,
"Display.Format" => 16,
"Display.YStart" => 17,
"Display.Height" => 18,
"Display.Phosphor" => 19,
"Display.PPBlend" => 20
);
my @prop_type_as_string = (
"Cartridge.MD5",
"Cartridge.Manufacturer",
"Cartridge.ModelNo",
"Cartridge.Name",
"Cartridge.Note",
"Cartridge.Rarity",
"Cartridge.Sound",
"Cartridge.Type",
"Console.LeftDifficulty",
"Console.RightDifficulty",
"Console.TelevisionType",
"Console.SwapPorts",
"Controller.Left",
"Controller.Right",
"Controller.SwapPaddles",
"Controller.MouseAxis",
"Display.Format",
"Display.YStart",
"Display.Height",
"Display.Phosphor",
"Display.PPBlend"
);
my @prop_defaults = (
@ -56,43 +81,63 @@ sub load_prop_set($) {
my @props = ();
while(($key, $value) = each(%prop_type)) {
$props[$value] = "";
$props[$value] = "";
}
my %propset = ();
open(INFILE, $file);
foreach $line (<INFILE>) {
chomp $line;
chomp $line;
# Start a new item
if ($line =~ /^""/) {
my $key = $props[$prop_type{'Cartridge.MD5'}];
# print "Inserting properties for key = $key\n";
# Start a new item
if ($line =~ /^""/) {
my $key = $props[$prop_type{'Cartridge.MD5'}];
# print "Inserting properties for key = $key\n";
if(defined($propset{$key})) {
print "Duplicate: $key\n";
}
$propset{$key} = [ @props ];
if(defined($propset{$key})) {
print "Duplicate: $key\n";
}
$propset{$key} = [ @props ];
undef @props;
while(($key, $value) = each(%prop_type)) {
$props[$value] = "";
}
} elsif ($line !~ /^$/) {
($key, $value) = ($line =~ m/"(.*)" "(.*)"/);
if (defined $prop_type{$key}) {
$index = $prop_type{$key};
$props[$index] = $value;
} else {
undef @props;
while(($key, $value) = each(%prop_type)) {
$props[$value] = "";
}
} elsif ($line !~ /^$/) {
($key, $value) = ($line =~ m/"(.*)" "(.*)"/);
if (defined $prop_type{$key}) {
$index = $prop_type{$key};
$props[$index] = $value;
} else {
print "ERROR: $line\n";
print "Invalid key = \'$key\' for md5 = \'$props[0]\', ignoring ...\n";
}
}
print "Invalid key = \'$key\' for md5 = \'$props[0]\', ignoring ...\n";
}
}
}
close(INFILE);
return %propset;
}
# Load and parse a properties file into an hash table of property
# objects, indexed by md5sum
sub save_prop_set {
my $file = shift;
my $hashref = shift;
print "Saving " . keys(%$hashref) . " properties to file: $file\n";
open(OUTFILE, ">$file");
while (($md5, $props) = each(%$hashref)) {
my @array = @$props;
for (my $i = 0; $i < @array; $i++) {
if ($array[$i] ne "") {
print OUTFILE "\"$prop_type_as_string[$i]\" \"$array[$i]\"\n";
}
}
print OUTFILE "\"\"\n\n";
}
close(OUTFILE);
}
# Get the number of property tags in one PropSet element
sub num_prop_types {
return keys( %prop_type );
@ -100,19 +145,19 @@ sub num_prop_types {
# Convert a properties set into a C++ compatible string
sub build_prop_string {
my @array = @_;
my $result = " { ";
my @items = ();
for (my $i = 0; $i < @array; $i++) {
if($prop_defaults[$i] ne $array[$i]) {
push(@items, "\"$array[$i]\"");
} else {
push(@items, "\"\"");
}
}
my @array = @_;
my $result = " { ";
my @items = ();
for (my $i = 0; $i < @array; $i++) {
if($prop_defaults[$i] ne $array[$i]) {
push(@items, "\"$array[$i]\"");
} else {
push(@items, "\"\"");
}
}
$result .= join(", ", @items);
$result .= " }";
$result .= join(", ", @items);
$result .= " }";
return $result;
return $result;
}

View File

@ -1,5 +1,8 @@
#!/usr/bin/perl
# Locate the 'PropSet' module
use FindBin;
use lib "$FindBin::Bin";
use PropSet;
usage() if @ARGV != 2;
@ -48,13 +51,13 @@ print OUTFILE "static const char* DefProps[DEF_PROPS_SIZE][" . $typesize . "] =
my $idx = 0;
for my $key ( sort keys %propset )
{
print OUTFILE PropSet::build_prop_string(@{ $propset{$key} });
print OUTFILE PropSet::build_prop_string(@{ $propset{$key} });
if ($idx+1 < $setsize) {
print OUTFILE ", ";
}
print OUTFILE "\n";
$idx++;
if ($idx+1 < $setsize) {
print OUTFILE ", ";
}
print OUTFILE "\n";
$idx++;
}
print OUTFILE "};\n";
@ -65,6 +68,8 @@ close(OUTFILE);
sub usage {
print "create_props.pl <INPUT STELLA PROPS> <OUTPUT C++ header>\n";
exit(0);
print "create_props.pl <INPUT properties file> <OUTPUT C++ header>\n";
print "\n";
print "Convert the given properties file into a C++ compatible header file.\n";
exit(0);
}

41
src/tools/merge_props.pl Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/perl
# Locate the 'PropSet' module
use FindBin;
use lib "$FindBin::Bin";
use PropSet;
usage() if @ARGV != 2;
my %usr_propset = PropSet::load_prop_set($ARGV[0]);
my %sys_propset = PropSet::load_prop_set($ARGV[1]);
print "\n";
print "Valid properties found in user file: " . keys (%usr_propset) . "\n";
print "Valid properties found in system file: " . keys (%sys_propset) . "\n";
# Determine which properties exist in both files
for my $key ( keys %usr_propset ) {
if (defined $sys_propset{$key}) {
$sys_propset{$key} = $usr_propset{$key};
delete $usr_propset{$key};
}
}
print "\n";
print "Updated properties found in user file: " . keys (%usr_propset) . "\n";
print "Updated properties found in system file: " . keys (%sys_propset) . "\n";
print "\n";
# Write both files back to disk
PropSet::save_prop_set($ARGV[0], \%usr_propset);
PropSet::save_prop_set($ARGV[1], \%sys_propset);
sub usage {
print "merge_props.pl <USER properties file> <SYSTEM properties file>\n";
print "\n";
print "Scan both properties files, and for every entry found in both files,\n";
print "remove it from the USER file and overwrite it in the SYSTEM file.\n";
exit(0);
}

88
src/tools/rom_diff.pl Executable file
View File

@ -0,0 +1,88 @@
#!/usr/bin/perl
use File::Basename;
usage() if @ARGV != 2;
# Generate md5sums for source and destination directories
my @src_files = `md5sum $ARGV[0]/*`;
my @dest_files = `md5sum $ARGV[1]/*`;
# Build hash for source ROMs
my %src_md5 = ();
foreach $file (@src_files) {
chomp $file;
($md5, $name) = split(" ", $file);
$src_md5{ $md5 } = $name;
}
print "Found " . keys( %src_md5 ) . " ROMs in " . $ARGV[0] . "\n";
# Build hash for destination ROMs
my %dest_md5 = ();
foreach $file (@dest_files) {
chomp $file;
($md5, $name) = split(" ", $file);
$dest_md5{ $md5 } = $name;
}
print "Found " . keys( %dest_md5 ) . " ROMs in " . $ARGV[1] . "\n";
my @added = (), @removed = (), @changed = ();
# Check for added ROMs
for my $key ( keys %dest_md5 ) {
if (defined $src_md5{$key}) {
($src_rom,$path,$type) = fileparse($src_md5{$key});
($dest_rom,$path,$type) = fileparse($dest_md5{$key});
if($src_rom ne $dest_rom) {
push(@changed, $dest_md5{$key});
}
}
else {
push(@added, $dest_md5{$key});
}
}
# Check for removed ROMs
for my $key ( keys %src_md5 ) {
if (!defined $dest_md5{$key}) {
push(@removed, $src_md5{$key});
}
}
# Report our findings, create directories and copy files
print "\n";
my $numAdded = @added;
print "Added ROMs: $numAdded\n";
if ($numAdded > 0) {
system("mkdir -p ADDED");
foreach $rom (@added) {
system("cp \"$rom\" ADDED/");
}
}
my $numRemoved = @removed;
print "Removed ROMs: $numRemoved\n";
if ($numRemoved > 0) {
system("mkdir -p REMOVED");
foreach $rom (@removed) {
system("cp \"$rom\" REMOVED/");
}
}
my $numChanged = @changed;
print "Changed ROMs: $numChanged\n";
if ($numChanged > 0) {
system("mkdir -p CHANGED");
foreach $rom (@changed) {
system("cp \"$rom\" CHANGED/");
}
}
sub usage {
print "rom_diff.pl <source directory> <destination directory>\n";
print "\n";
print "Analyze the ROMs in both directories by md5sum and name.\n";
print "Three directories are created named 'ADDED', 'REMOVED' and 'CHANGED',\n";
print "indicating the differences in ROMs from the source and destination\n";
print "directories. ROMs are then copied into these new directories as specified.\n";
exit(0);
}