From 716dd485cb87f80b356fb3a739c1135fcb016765 Mon Sep 17 00:00:00 2001 From: stephena Date: Fri, 3 Feb 2012 22:21:02 +0000 Subject: [PATCH] Refactored the PERL properties set tools, in preparation for additional tools. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2378 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- src/tools/PropSet.pm | 118 +++++++++++++++++++++++++++++++++ src/tools/create_props.pl | 128 ++++-------------------------------- src/tools/create_shaders.pl | 71 -------------------- 3 files changed, 129 insertions(+), 188 deletions(-) create mode 100755 src/tools/PropSet.pm delete mode 100755 src/tools/create_shaders.pl diff --git a/src/tools/PropSet.pm b/src/tools/PropSet.pm new file mode 100755 index 000000000..e7d7bd7f5 --- /dev/null +++ b/src/tools/PropSet.pm @@ -0,0 +1,118 @@ +package PropSet; + +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 +); + +my @prop_defaults = ( + "", + "", + "", + "Untitled", + "", + "", + "MONO", + "AUTO-DETECT", + "B", + "B", + "COLOR", + "NO", + "JOYSTICK", + "JOYSTICK", + "NO", + "AUTO", + "AUTO-DETECT", + "34", + "210", + "NO", + "77" +); + +# Load and parse a properties file into an hash table of property +# objects, indexed by md5sum +sub load_prop_set($) { + my $file = $_[0]; + print "Loading properties from file: $file\n"; + + my @props = (); + while(($key, $value) = each(%prop_type)) { + $props[$value] = ""; + } + + my %propset = (); + open(INFILE, $file); + foreach $line () { + chomp $line; + + # 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 ]; + + 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"; + } + } + } + close(INFILE); + return %propset; +} + +# Get the number of property tags in one PropSet element +sub num_prop_types { + return keys( %prop_type ); +} + +# 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, "\"\""); + } + } + + $result .= join(", ", @items); + $result .= " }"; + + return $result; +} diff --git a/src/tools/create_props.pl b/src/tools/create_props.pl index 4baf4fea8..231d67c86 100755 --- a/src/tools/create_props.pl +++ b/src/tools/create_props.pl @@ -1,105 +1,17 @@ #!/usr/bin/perl -my @props = (); -my %propset = (); +use PropSet; -my %proptype = ( -"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_defaults = ( - "", - "", - "", - "Untitled", - "", - "", - "MONO", - "AUTO-DETECT", - "B", - "B", - "COLOR", - "NO", - "JOYSTICK", - "JOYSTICK", - "NO", - "AUTO", - "AUTO-DETECT", - "34", - "210", - "NO", - "77" -); - - -@props = (); -while(($key, $value) = each(%proptype)) { - $props[$value] = ""; -} - -print "@ARGV\n"; usage() if @ARGV != 2; -# Must provide input and output files -open(INFILE, "$ARGV[0]"); -open(OUTFILE, ">$ARGV[1]"); +my %propset = PropSet::load_prop_set($ARGV[0]); +my $setsize = keys (%propset); +my $typesize = PropSet::num_prop_types(); -# Parse the properties file into an array of property objects -foreach $line () { - chomp $line; - - # Start a new item - if ($line =~ /^""/) { - my $key = $props[$proptype{'Cartridge.MD5'}]; -# print "Inserting properties for key = $key\n"; - - if(defined($propset{$key})) { - print "Duplicate: $key\n"; - } - $propset{$key} = [ @props ]; - - undef @props; - while(($key, $value) = each(%proptype)) { - $props[$value] = ""; - } - } elsif ($line !~ /^$/) { - ($key, $value) = ($line =~ m/"(.*)" "(.*)"/); - if (defined $proptype{$key}) { - $index = $proptype{$key}; - $props[$index] = $value; - } else { - print "ERROR: $line\n"; - print "Invalid key = \'$key\' for md5 = \'$props[0]\', ignoring ...\n"; - } - } -} - -my $size = keys (%propset); -printf "Valid properties found: $size\n"; +printf "Valid properties found: $setsize\n"; # Construct the output file in C++ format -# Walk the results array and print each item -# This array will now contain the original tree converted to a BST in array format +open(OUTFILE, ">$ARGV[1]"); print OUTFILE "//============================================================================\n"; print OUTFILE "//\n"; print OUTFILE "// SSSS tt lll lll\n"; @@ -128,16 +40,17 @@ print OUTFILE " located in the src/tools directory. All properties changes\n"; print OUTFILE " should be made in stella.pro, and then this file should be\n"; print OUTFILE " regenerated and the application recompiled.\n"; print OUTFILE "*/\n"; -print OUTFILE "\n#define DEF_PROPS_SIZE " . $size; +print OUTFILE "\n#define DEF_PROPS_SIZE " . $setsize; print OUTFILE "\n\n"; -print OUTFILE "static const char* DefProps[DEF_PROPS_SIZE][" . keys( %proptype ) . "] = {\n"; +print OUTFILE "static const char* DefProps[DEF_PROPS_SIZE][" . $typesize . "] = {\n"; +# Walk the hash map and print each item in order of md5sum my $idx = 0; for my $key ( sort keys %propset ) { - print OUTFILE build_prop_string(@{ $propset{$key} }); + print OUTFILE PropSet::build_prop_string(@{ $propset{$key} }); - if ($idx+1 < $size) { + if ($idx+1 < $setsize) { print OUTFILE ", "; } print OUTFILE "\n"; @@ -148,7 +61,6 @@ print OUTFILE "};\n"; print OUTFILE "\n"; print OUTFILE "#endif\n"; -close(INFILE); close(OUTFILE); @@ -156,21 +68,3 @@ sub usage { print "create_props.pl \n"; exit(0); } - -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, "\"\""); - } - } - - $result .= join(", ", @items); - $result .= " }"; - - return $result; -} diff --git a/src/tools/create_shaders.pl b/src/tools/create_shaders.pl deleted file mode 100755 index e4ffb2d23..000000000 --- a/src/tools/create_shaders.pl +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/perl - -use File::Basename; - -usage() if @ARGV < 2; - -$numfiles = @ARGV; -$outfile = $ARGV[$numfiles-1]; - -# Construct the output file in C++ format -# Walk the ARGV list and convert each item -open(OUTFILE, ">$outfile"); - -print OUTFILE "//============================================================================\n"; -print OUTFILE "//\n"; -print OUTFILE "// SSSS tt lll lll\n"; -print OUTFILE "// SS SS tt ll ll\n"; -print OUTFILE "// SS tttttt eeee ll ll aaaa\n"; -print OUTFILE "// SSSS tt ee ee ll ll aa\n"; -print OUTFILE "// SS tt eeeeee ll ll aaaaa -- \"An Atari 2600 VCS Emulator\"\n"; -print OUTFILE "// SS SS tt ee ll ll aa aa\n"; -print OUTFILE "// SSSS ttt eeeee llll llll aaaaa\n"; -print OUTFILE "//\n"; -print OUTFILE "// Copyright (c) 1995-2012 by Bradford W. Mott, Stephen Anthony\n"; -print OUTFILE "// and the Stella Team\n"; -print OUTFILE "//\n"; -print OUTFILE "// See the file \"License.txt\" for information on usage and redistribution of\n"; -print OUTFILE "// this file, and for a DISCLAIMER OF ALL WARRANTIES.\n"; -print OUTFILE "//\n"; -print OUTFILE "// \$Id\$\n"; -print OUTFILE "//============================================================================\n"; -print OUTFILE "\n"; -print OUTFILE "#ifndef GL_SHADER_PROGS_HXX\n"; -print OUTFILE "#define GL_SHADER_PROGS_HXX\n"; -print OUTFILE "\n"; -print OUTFILE "/**\n"; -print OUTFILE " This code is generated using the 'create_shaders.pl' script,\n"; -print OUTFILE " located in the src/tools directory.\n"; -print OUTFILE "*/\n"; -print OUTFILE "\n"; -print OUTFILE "namespace GLShader {\n\n"; - -for ($i = 0; $i < $numfiles - 1; $i++) -{ - open(INFILE, "$ARGV[$i]"); - - ($base,$path,$type) = fileparse($ARGV[$i]); - $base =~ s/\./_/g; - - print OUTFILE "static const char* " . $base . "[] = {\n"; - foreach $line () - { - chomp($line); - print OUTFILE "\"" . $line . "\\n\"\n"; - } - print OUTFILE "\"\\0\"\n"; - print OUTFILE "};\n\n"; - - close(INFILE); -} - -print OUTFILE "} // namespace GLShader\n\n"; -print OUTFILE "#endif\n"; - -close(OUTFILE); - - -sub usage { - print "create_shaders.pl \n"; - exit(0); -}