cmpconfigs.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:26 2010 from cmpconfigs.pl 2009/08/21 6.7 KB.

#!/perl -w
# NAME: cmpconfigs.pl
# AIM: Compare 2 config files...
# 8/21/2009 - geoff mclane - http://geoffair.net/mperl/
use strict;
use warnings;
require 'logfile.pl' or die "Unable to load logfile.pl ...\n";
# log file stuff
my ($LF);
my $pgmname = $0;
if ($pgmname =~ /\w{1}:\\.*/) {
   my @tmpsp = split(/\\/,$pgmname);
   $pgmname = $tmpsp[-1];
}
my $outfile = "temp.$pgmname.txt";
open_log($outfile);
prt( "$0 ... Hello, World ...\n" );
my $in_file1 = 'S:\geoff\projects\Handbrake\hb-svn\build1\contrib\ffmpeg\ffmpeg-r19067\config.h';
my $in_file2 = 'C:\Projects\hb\ffmpeg\build\msvc\conf.h';
# comments dropped
# // until end of line
# /* until */
sub drop_comments($) {
   my ($l) = shift;
   my $ll = length($l);
   my $ic = 0;
   my ($j, $c, $pc, $nc);
   $pc = '';
   my $newl = '';
   for ($j = 0; $j < $ll; $j++) {
      $c = substr($l,$j,1);
      $nc = (($j + 1) < $ll) ? substr($l,$j+1,1) : ' ';
      if ($ic) {
         if (($c eq '/')&&($pc eq '*')) {
            $ic = 0;
         }
      } elsif (($c eq '/') && ( ($nc eq '*') || ($nc eq '/') ) ) {
         $ic = 1;
         return $newl if ($nc eq '/');
      }
      $pc = $c;
      $newl .= $c if (!$ic);
   }
   return $newl;
}
sub is_config_other($) {
   my ($typ) = shift;
   if ( ($typ =~ /^CONFIG_/) && 
      !(($typ =~ /_PARSER/)||($typ =~ /_DECODER/)||($typ =~ /_ENCODER/)||($typ =~ /_MUXER/)||($typ =~ /_DEMUXER/)) ) {
      return 1;
   }
   return 0;
}
sub   out_hash_list($) { # like ( \%same );
   my ($rh) = shift;
   my ($v1, $k1, $v2, $tcnt);
   # ENCODERS
   $v2 = 0;
   $tcnt = 0;
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_ENCODER/) {
         $tcnt++;
      }
   }
   prt( "// $tcnt CONFIG ENCODERS\n") if ($tcnt);
   $tcnt = 0;
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_ENCODER/) {
         prt( "#define $k1 $v1\n" );
      } else {
         $v2++;
      }
   }
   # DECODERS
   $tcnt = 0;
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_DECODER/) {
         $tcnt++
      }
   }
   prt( "// $tcnt CONFIG DECODERS\n") if ($tcnt);
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_DECODER/) {
         prt( "#define $k1 $v1\n" );
      } else {
         $v2++;
      }
   }
   # PARSERS
   $tcnt = 0;
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_PARSER/) {
         $tcnt++;
      }
   }
   prt( "// $tcnt CONFIG PARSER\n") if ($tcnt);
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_PARSER/) {
         prt( "#define $k1 $v1\n" );
      } else {
         $v2++;
      }
   }
   # MUXER
   $tcnt = 0;
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_MUXER/) {
         $tcnt++
      }
   }
   prt( "// $tcnt CONFIG MUXER\n") if ($tcnt);
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_MUXER/) {
         prt( "#define $k1 $v1\n" );
      } else {
         $v2++;
      }
   }
   # DEMUXER
   $tcnt = 0;
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_DEMUXER/) {
         $tcnt++
      }
   }
   prt( "// $tcnt CONFIG DEMUXER\n") if ($tcnt);
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ($k1 =~ /^CONFIG_(.+)_DEMUXER/) {
         prt( "#define $k1 $v1\n" );
      } else {
         $v2++;
      }
   }
   $tcnt = 0;
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ( is_config_other($k1) ) {
         $tcnt++;
      }
   }
   prt( "// $tcnt CONFIG OTHERS\n") if ($tcnt);
   foreach $k1 (keys %$rh) {
      $v1 = $$rh{$k1};
      if ( is_config_other($k1) ) {
         prt( "#define $k1 $v1\n" );
      }
   }
   prt("\n") if ($v2);
   $tcnt = 0;
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ( !($k1 =~ /^CONFIG_/) ) {
         $tcnt++;
      }
   }
   prt( "// $tcnt OTHER OTHERS\n") if ($tcnt);
   foreach $k1 (sort keys %$rh) {
      $v1 = $$rh{$k1};
      if ( !($k1 =~ /^CONFIG_/) ) {
         prt( "#define $k1 $v1\n" );
      }
   }
}
sub load_cfg_file($) {
   my ($fil) = shift;
   my %hash = ();
   if (open INF, "<$fil") {
      my @lns = <INF>;
      close INF;
      my $lnc = scalar @lns;
      prt( "Got $lnc lines, from $fil...\n" );
      my $lnnum = 0;
      foreach my $ln (@lns) {
         $lnnum++;
         chomp $ln;
         $ln = trim_all($ln);
         $ln = drop_comments($ln);
         if ($ln =~ /#\s*define\s+(.+)/) {
            my $def = $1;
            my @a = split(/\s/,$def);
            if (scalar @a > 1) {
               my $dfn = $a[0];
               my $dfv = $a[1];
               if (defined $hash{$dfn}) {
                  prt( "$dfn: already defined as ".$hash{$dfn}.", now changed to $dfv!\n" );
               }
               $hash{$dfn} = $dfv;
            } else {
               prt("WARNING: $lnnum: did not split [$ln]\n");
            }
         }
      }
   } else {
      prt("ERROR: unable to open [$fil]...\n");
      exit 1;
   }
   return %hash;
}
sub compare_2_hashes($$) {
   my ($rh1, $rh2) = @_;
   my $h1c = scalar keys(%$rh1);
   my $h2c = scalar keys(%$rh2);
   prt( "Compare $h1c with $h2c...\n" );
   my ($k1, $v1, $k2, $v2, $tcnt);
   my %diffs = ();
   my %newd = ();
   my %same = ();
   my $nd1 = 0;
   my $df1 = 0;
   my $sm1 = 0;
   my $nd2 = 0;
   # run file 1 hash, and compare to 2
   foreach $k1 (keys %$rh1) {
      $v1 = $$rh1{$k1};
      if (defined $$rh2{$k1}) {
         $v2 = $$rh2{$k1};
         if ($v1 != $v2) {
            prt("DIFF: $k1 $v1 vs $v2\n");
            $df1++;
            $diffs{$k1} = $v1;
         } else {
            $sm1++;
            $same{$k1} = $v1;
         }
      } else {
         prt("H1: $k1 $v1, NOT defined in 2\n" );
         $newd{$k1} = $v1;
         $nd1++;
      }
   }
   # run file 2 hash, and compare to 1, only for missing
   foreach $k2 (keys %$rh2) {
      $v2 = $$rh2{$k2};
      if (defined $$rh1{$k2}) {
         # already dealt with these...
      } else {
         prt("H2: $k2 $v2, NOT defined in 1\n" );
         $nd2++;
      }
   }
   prt( "// Summary: Same $sm1, Diff $df1, NDef1 $nd1, NDef2 $nd2\n" );
   prt( "// ".YYYYMMDD(time())." generated by $pgmname for Handbrake project.\n" );
   if ($sm1) {
      prt( "// Same SAME $sm1...\n" );
      out_hash_list( \%same );
      prt( "// Done Same SAME $sm1...\n" );
   }
   if ($df1) {
      prt( "\nSuggested differences $df1...\n" );
      out_hash_list( \%diffs );
      prt( "Done $df1 differences...\n" );
   }
   if ($nd1) {
      prt( "\nSuggested additions to 2 - $nd1...\n" );
      out_hash_list( \%newd );
      prt( "Done $nd1 additions...\n" );
   }
   prt( "// Done: Same $sm1, Diff $df1, NDef1 $nd1, NDef2 $nd2\n" );
}
################################################
# My particular time 'translation'
sub YYYYMMDD() {
   #  0    1    2     3     4    5     6     7     8
   my ($tm) = shift;
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($tm);
   $year += 1900;
   $mon += 1;
   my $ymd = "$year/";
   if ($mon < 10) {
      $ymd .= '0'.$mon.'/';
   } else {
      $ymd .= "$mon/";
   }
   if ($mday < 10) {
      $ymd .= '0'.$mday;
   } else {
      $ymd .= "$mday";
   }
   return $ymd;
}
my %hash1 = load_cfg_file($in_file1);
my %hash2 = load_cfg_file($in_file2);
compare_2_hashes( \%hash1, \%hash2 );
close_log($outfile,1);
exit(0);
# eof

index -|- top

checked by tidy  Valid HTML 4.01 Transitional