fgcmp2dsps.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:33 2010 from fgcmp2dsps.pl 2009/10/04 27.4 KB.

#!/perl -w
# NAME: fgcmp2dsps.pl
# AIM: Comparison of TWO DSP files - show different SOURCE files only ...
# 04/10/2009 - SEE cmp2dsps.pl FOR LATEST VERSION!!! Includes headers in compare
# 25/11/2008 - some minor additions to output
# 26/10/2008 - added parse_args() for INPUT files
# 13/08/2008 - geoff mclane - http://geoffair.net/mperl
# Compares SOURCE lists, and compares the config parameters ...
use strict;
use warnings;
use File::Basename;
use File::stat;
use Cwd;
unshift(@INC, 'C:/GTools/perl');
require 'fgutils.pl' or die "Unable to load fgutils.pl ...\n";
# log file stuff
my ($LF);
my $pgmname = $0;
if ($pgmname =~ /\w{1}:\\.*/) {
   my @tmpsp = split(/\\/,$pgmname);
   $pgmname = $tmpsp[-1];
}
my $perl_base = 'C:/GTools/perl';
my $outfile = $perl_base."/temp.$pgmname.txt";
open_log($outfile);
# USER INPUT
my $in_file1 = '';
my $in_file2 = '';
##my $in_file1 = 'temp.dc4w.dsp';
##my $in_file2 = 'C:\GTools\tools\dc4w\dc4w.dsp';
##my $in_file1 = 'tempdsp.dsp';
##my $in_file2 = 'tempvcscan.dsp';
##my $in_file1 = 'temp...#FlightGear.FlightGear.dsp';
##my $in_file2 = 'FlightGear\FlightGear.dsp';
##my $in_file1 = 'tempscan4.dsp';
##my $in_file2 = 'tempscan5.dsp';
##my $in_file1 = 'tempvcscan.dsp';
##my $in_file1 = 'temp...#FlightGear.FlightGear.dsp';
#my $in_file1 = 'tempscan.dsp';
# USER OPTIONS
my $also_show_matched = 0;  # also output MATCHED files
my $also_show_moved = 1;    # show any MOVED files
my $ignore_headers = 1;
my $minlen1 = 40;
my $minlen2 = 61;
my $load_out = 1;   # 1 to load output into notepad
# DEBUG STUFF
my $dbg_dsp = 0;
my $dbg_ds1 = 0;
my $dbg_ds2 = 0;
my $dbg_ds3 = 0;
my $dbg_ds4 = 0;   # show CPP and LINK config items - %v6_conf
my $dbg_ds5 = 0;   # show Defined items - %v6_defs
my $dbg_ds6 = 0;   # show !IF, !ELSEIF switching
my $dbg_ds7 = 0;   # show %v6_conf listing
my $big_dbg = 0;
my $dbg_ds8 = 0;   # show VC6 Filter and Group Name
my $dbg_ds9 = 0;   # show EACH VC6 source pushed
# PROGRAM VARIABLES
my $root_dir = getcwd();
my @warnings = ();
my @v6_srcs = ();  # relnm full group filter
my %v6_defs = ();
my %v6_conf = ();
# file 1 stuff
my @v6_srcs1 = ();  # relnm full group filter
my %v6_defs1 = ();
my %v6_conf1 = ();
# file 2 stuff
my @v6_srcs2 = ();  # relnm full group filter
my %v6_defs2 = ();
my %v6_conf2 = ();
#                0     1      2          3          4  5  6
#push(@v6_srcs, [$src, $ffnr, $filtname, $filttype, 0, 0, $projname] );
#push(@v6_srcs, [$src, $ffnr, $grpname, $filter,    0, 0, $proj] );
use constant {
    V6_SRC => 0,
    V6_FUL => 1,
    V6_GRP => 2,
    V6_FIL => 3,
    V6_CMP => 4,    # [4]
    V6_DON => 5,    # [5]
    V6_PRJ => 6
};
my @lines1 = ();
my @lines2 = ();
my $lncnt1 = 0;
my $lncnt2 = 0;
parse_args(@ARGV);
# 25/11/2008 - show what we are comparing
prt( "Compare of files ...\n" );
show_file_stat($in_file1, 1);
show_file_stat($in_file2, 2);
if (open INF1, "<$in_file1") {
   @lines1 = <INF1>;
   close INF1;
   $lncnt1 = scalar @lines1;
}
if (open INF2, "<$in_file2") {
   @lines2 = <INF2>;
   close INF2;
   $lncnt2 = scalar @lines2;
}
if ($lncnt1 && $lncnt2) {
   prt( "Loaded and scanning $lncnt1, and $lncnt2 DSP file lines ...\n" );
} else {
    prtw( "WARNING: One or both line counts is ZERO! ... $lncnt1, and $lncnt2 lines ...\n" );
}
# load FILE 1
clear_load();
process_DSP( $in_file1 );
@v6_srcs1 = @v6_srcs;  # relnm full group filter
%v6_defs1 = %v6_defs;
%v6_conf1 = %v6_conf;
# load FILE 2
clear_load();
process_DSP( $in_file2 );
@v6_srcs2 = @v6_srcs;  # relnm full group filter
%v6_defs2 = %v6_defs;
%v6_conf2 = %v6_conf;
# compare SOURCES
my $mdspcmp = 0;
$mdspcmp += compare_dsp_with_dsp($in_file1, $in_file2);
$mdspcmp += compare_cfg_of_dsp($in_file1, $in_file2);
if ($mdspcmp) {
    prt( "Some DIFFERENCES ($mdspcmp) ...\n" );
} else {
    prt("Appear NO differences ...\n");
}
show_warnings();
close_log($outfile,$load_out);
exit($mdspcmp);
##########################################
### SUB ONLY
##########################################
sub parse_args {
   my (@av) = @_;
    my $acnt = 0;
   while (@av) {
      my $arg = shift @av;
        if ($acnt == 0) {
            $in_file1 = $arg;
        } elsif ($acnt == 1) {
            $in_file2 = $arg;
        } else {
            prt( "ERROR: Only two arguments allowed, being the two input DSP files ...\n" );
            mydie( "ABORTING!\n" );
        }
        $acnt++;
    }
    # 25/11/2008 test the input files
    if ( !(-f $in_file1) ) {
        prt( "ERROR: Unable to locate [$in_file1] ... check name, location ...\n" );
        mydie( "ABORTING!\n" );
    }
    if ( !(-f $in_file2) ) {
        prt( "ERROR: Unable to locate [$in_file2] ... check name, location ...\n" );
        mydie( "ABORTING!\n" );
    }
}
sub comp_v1_with_v2 {
    my ($k1,$v1,$v2) = @_;
    my @a1 = space_split($v1);
    my @a2 = space_split($v2);
    my ($fnd, $i1, $i2);
    my @a1m = ();
    my $dcnt = 0;
    my $dbg_SAME = 0;
    foreach $i1 (@a1) {
        $fnd = 0;
        foreach $i2 (@a2) {
            if ($i1 eq $i2) {
                $fnd = 1;
                last;
            }
        }
        push(@a1m, $i1) if (!$fnd);
    }
    if (@a1m) {
        prt( "KEY:[$k1] Items in F1, not found in F2 ...\n" );
        foreach $i1 (@a1m) {
            prt( "$i1 " );
            $dcnt++;
        }
        prt("\n");
    } else {
        prt( "KEY:[$k1] Items in F1, not found in F2 = NONE! They are the SAME.\n" ) if ($dbg_SAME);
    }
    @a1m = ();
    foreach $i2 (@a2) {
        $fnd = 0;
        foreach $i1 (@a1) {
            if ($i1 eq $i2) {
                $fnd = 1;
                last;
            }
        }
        push(@a1m, $i2) if (!$fnd);
    }
    if (@a1m) {
        prt( "KEY:[$k1] Items in F2, not found in F1 ...\n" );
        foreach $i1 (@a1m) {
            prt( "$i1 " );
            $dcnt++;
        }
        prt("\n");
    } else {
        prt( "KEY:[$k1] Items in F2, not found in F1 = NONE! They are the SAME.\n" ) if ($dbg_SAME);
    }
    return $dcnt;
}
sub compare_cfg_of_dsp {
    my ($fil1, $fil2) = @_;
    my @done = ();
    my @keys1 = sort keys(%v6_conf1);
    my @keys2 = sort keys(%v6_conf2);
    my @dkys1 = sort keys(%v6_defs1);
    my @dkys2 = sort keys(%v6_defs2);
    my ($key1, $key2, $val1, $val2, $cnt1, $cnt2, $dcnt, $mcnt);
    $mcnt = scalar @keys1;
    $dcnt = scalar @dkys1;
    if (($mcnt == 0)&&($dcnt == 0)) {
        prtw("WARNING: No configuration compare ... File1 ALL ZERO\n");
        return 0;
    }
    $mcnt = scalar @keys2;
    $dcnt = scalar @dkys2;
    if (($mcnt == 0)&&($dcnt == 0)) {
        prtw("WARNING: No configuration compare ... File2 ALL ZERO\n");
        return 0;
    }
    prt( "F1: conf ".scalar @keys1.", defs ".scalar @dkys1."\n" );
    prt( "F2: conf ".scalar @keys2.", defs ".scalar @dkys2."\n" );
    $cnt1 = 0;
    $dcnt = 0;
    $mcnt = 0;
    foreach $key1 (@keys1) {
        $cnt1++;
        $val1 = $v6_conf1{$key1};
        if (defined $v6_conf2{$key1}) {
            $val2 = $v6_conf2{$key1};
            $dcnt += comp_v1_with_v2( $key1, $val1, $val2 );
            push(@done,$key1);
        } else {
            prt( "$cnt1: $key1 NOT IN 2 [$val1]\n" );
            $mcnt++;
        }
    }
    $cnt2 = 0;
    foreach $key2 (@keys2) {
        $cnt2++;
        $val2 = $v6_conf2{$key2};
        if (! is_in_array($key2,@done)) {
            push(@done,$key2);
            if (defined $v6_conf1{$key2}) {
                $val1 = $v6_conf1{$key2};
                $dcnt += comp_v1_with_v2( $key2, $val1, $val2 );
            } else {
                prt( "$cnt2: $key2 NOT IN 2 $val2\n" );
                $mcnt++;
            }
        }
    }
    $cnt1 = 0;
    @done = ();
    foreach $key1 (@dkys1) {
        $cnt1++;
        $val1 = $v6_defs1{$key1};
        if (defined $v6_defs2{$key1}) {
            $val2 = $v6_defs2{$key1};
            $dcnt += comp_v1_with_v2( $key1, $val1, $val2 );
            push(@done,$key1);
        } else {
            prt( "$cnt1: $key1 NOT IN 2 [$val1]\n" );
            $mcnt++;
        }
    }
    $cnt2 = 0;
    foreach $key2 (@dkys2) {
        $cnt2++;
        $val2 = $v6_defs2{$key2};
        if (! is_in_array($key2,@done)) {
            push(@done,$key2);
            if (defined $v6_defs1{$key2}) {
                $val1 = $v6_defs1{$key2};
                $dcnt += comp_v1_with_v2( $key2, $val1, $val2 );
            } else {
                prt( "$cnt2: $key2 NOT IN 2 $val2\n" );
                $mcnt++;
            }
        }
    }
    prt( "In compare of configurations of files\n" );
    show_file_stat($fil1, 1);
    show_file_stat($fil2, 2);
    if (($dcnt == 0) && ($mcnt == 0)) {
        prt( "Configurations appear EXACTLY the SAME...\n" );
    } else {
        prt( "Configurations have $dcnt differences, and $mcnt missed in one or other ...\n" );
    }
    return ($dcnt + $mcnt);
}
sub clear_load {
   @v6_srcs = ();  # relnm full group filter
   %v6_defs = ();
   %v6_conf = ();
}
sub process_DSP {
   my ($fil) = @_;
   my ($line, $prjname, $grpname, $filter, $ff, $src, $chr, $tmp, $conf, $ffnr);
   my ($itm1, $itm2, $key, $targtype);
   my $scnt = 0;
   my @dsp_lines = ();
   prt( "\nProcess DSP file $fil ... " );
    $prjname = 'UNKNOWN AT THIS POINT!';
   if ( -f $fil ) {
      prt( "already exists ...\n" );
      my ($d_name,$d_dir) = fileparse($fil);
      $d_dir = trim_all($d_dir);
      $d_dir = $root_dir."\\" if ((length($d_dir) == 0)||($d_dir eq ".\\"));
      if ( open IF, "<$fil" ) {
         @dsp_lines = <IF>;
         close IF;
         prt( "Got ".scalar @dsp_lines." lines to process ...\n" );
         my $ins = 0;
         foreach $line (@dsp_lines) {
            $line = trim_all($line);
            next if (length($line) == 0);
            $chr = substr($line, 0, 1);   # get FIRST char of LINE
            if( $chr eq '#' ) {
               # line begins with SHARP
               if ($line =~ /\s+Microsoft Developer Studio Project File - Name=\"([\.\w\s]+)+/) {
                  $prjname = $1;
                  prt( "Project NAME = $prjname ...\n" ) if ($dbg_dsp);
               } elsif ($line =~ /\s+Microsoft Developer Studio Generated Build File, Format Version ([\d\.]+)/) {
                  prt( "MSVC Version $1 ...\n" ) if ($dbg_dsp);
               } elsif ($line =~ /\s*TARGTYPE\s+\"(.+)\"\s+/) { # Win32 (x86) Console Application" 0x0103
                  $targtype = $1;
                  prt( "TARGTYPE: $targtype, name=$prjname\n" );
               } elsif ($line =~ /Begin Group \"([\s\w]+)+/ ) {
                  $grpname = $1;
                  prt( "Begin group ... $grpname\n" ) if ($dbg_dsp);
               } elsif ($line =~ /PROP\s+Default_Filter\s+\"([\w;]+)+\"/ ) {
                  $filter = $1;
                  prt( "Begin Filter group $grpname, filter $filter\n" ) if ($dbg_ds8);
               } elsif ($line =~ /Begin Source File/) {
                  $ins = 1;
                  prt( "Begin source ... $ins ...\n" ) if ($dbg_dsp);
               } elsif ($line =~ /End Source File/) {
                  $ins = 0;
                  prt( "End source ... $ins ...\n" ) if ($dbg_dsp);
               } elsif ( $line =~ /ADD BASE CPP (.+)/ )  {
                  # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c
                  $key = 'CPP '.$conf;
                  prt( "ADD BASE $key [$1]\n" ) if ($dbg_ds4);
                  $v6_conf{$key} = $1;
               } elsif ( $line =~ /ADD CPP (.+)/ )  {
                  # ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c
                  $key = 'CPP '.$conf;
                  prt( "ADD $key [$1]\n" ) if ($dbg_ds4);
                  $v6_conf{$key} = $1;
               } elsif ( $line =~ /ADD BASE LINK32 (.+)/ )  {
                  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
                  $key = 'LINK '.$conf;
                  prt( "ADD BASE $key [$1]\n" ) if ($dbg_ds4);
                  $v6_conf{$key} = $1;
               } elsif ( $line =~ /ADD LINK32 (.+)/ )  {
                  $key = 'LINK '.$conf;
                  # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
                  prt( "ADD $key [$1]\n" ) if ($dbg_ds4);
                  $v6_conf{$key} = $1;
               }
            } elsif ( $chr eq '!' ) {
               if ($line =~ /^!IF\s+(.+)/i ) {
                  prt( "Entering IF $1 ...\n" ) if ($dbg_ds6);
                  if ($line =~ /!IF\s+(.+) == (.+)/i) {
                     $itm1 = $1;
                     $itm2 = $2;
                     $itm1 =~ s/\"//g;
                     $itm2 =~ s/\"//g;
                     prt( "Got [$itm1] [$itm2]...\n" ) if ($dbg_ds6);
                     if ($itm1 =~ /^\$\((.+)\)/ ) {
                        if (defined $v6_defs{$1}) {
                           if ($v6_defs{$1} eq $itm2) {
                              $tmp = "TRUE";
                           } else {
                              $tmp = "FALSE";
                           }
                           if( $1 eq 'CFG' ) {
                              $conf = $itm2;
                           }
                           prt( "and [$1] defined as \"$v6_defs{$1}\" ... $tmp $conf\n" ) if ($dbg_ds6);
                        } else {
                           prt( "NOT DEFINED [$1] ...\n" );
                        }
                     }
                  } else {
                     prt( "FAILED IF == [$line]\n" );
                  }
               } elsif ( $line =~ /^!ELSE\s+/i ) {
                  prt( "Entering ELSE ...\n" ) if ($dbg_ds6);
               } elsif ( $line =~ /^!ELSEIF\s+(.+)/i ) {
                  prt( "Entering ELSEIF $1 ...\n" ) if ($dbg_ds6);
                  if ($line =~ /!ELSEIF\s+(.+) == (.+)/i) {
                     $itm1 = $1;
                     $itm2 = $2;
                     $itm1 =~ s/\"//g;
                     $itm2 =~ s/\"//g;
                     prt( "Got [$itm1] [$itm2]...\n" ) if ($dbg_ds6);
                     if ($itm1 =~ /^\$\((.+)\)/ ) {
                        if (defined $v6_defs{$1}) {
                           if ($v6_defs{$1} eq $itm2) {
                              $tmp = "TRUE";
                           } else {
                              $tmp = "FALSE";
                           }
                           if( $1 eq 'CFG' ) {
                              $conf = $itm2;
                           }
                           prt( "and [$1] defined as \"$v6_defs{$1}\" ... $tmp $conf\n" ) if ($dbg_ds6);
                        } else {
                           prt( "NOT DEFINED [$1] ...\n" );
                        }
                     }
                  } else {
                     prt( "FAILED ELSEIF == [$line]\n" );
                  }
               } elsif ( $line =~ /^!ENDIF\s*/i ) {
                  prt( "Out ENDIF ...\n" ) if ($dbg_ds6);
               }
            } else {
                    # SOURCE=.\test.c, or
                    # SOURCE=src\FDM\YASim\YASim.hxx OR
                    # SOURCE=".\common with space\file with space.c"
               ### if ($line =~ /SOURCE=([\.\\\w-:]+)+/ ) {
               ###   $src = $1;
               if ($line =~ /^SOURCE=/ ) {
                  $src = strip_quotes(substr($line,7));
                  $ff = $d_dir.$src;
                  $ffnr = fix_rel_path($ff);
                  ###prt( "fixed=$ffnr, src=[$src], dir=[$dir]\n" );
                  if ($ins) {
                     prt( "SOURCE = $src ($ff)... $ins \n" ) if ($dbg_dsp);
                  } else {
                     prt( "source = $src ($ff) OUTSIDE 'in source' ... $ins\n" );
                  }
                  if (is_c_source($src)) {
                     prt("SOURCE=[$src]\n") if ($dbg_ds1);
                  } elsif (is_h_source($src)) {
                     prt("HEADER=[$src]\n") if ($dbg_ds2);
                  } elsif (is_h_special($src)) {
                     prt("HEADER=[$src]\n") if ($dbg_ds2);
                  } else {
                     prt("OTHER=[$src]\n") if ($dbg_ds3);
                  }
                  #                0     1      2          3          4  5  6
                  #push(@v6_srcs, [$src, $ffnr, $filtname, $filttype, 0, 0, $projname] );
                  push(@v6_srcs, [$src, $ffnr, $grpname, $filter, 0, 0, $prjname] );
                  $scnt++;
                  prt( "$scnt v6_srcs: $src, $ffnr, $grpname, $filter, 0, 0, $prjname\n" ) if ($dbg_ds9);
               } elsif ( $line =~ /(.*)=(.*)/ ) {
                  $itm1 = $1;
                  $itm2 = $2;
                  $v6_defs{$itm1} = $itm2;
                  prt( "Defined [$itm1] = [$itm2] ...\n" ) if ($dbg_ds5);
               } else {
                  prt( "skipped [$line]\n" );
               }
            }
         }
         prt( "End DSP - got $scnt source files ...\n" );
         if ($dbg_ds7) {
            foreach $key (keys %v6_conf) {
               prt( "Config $key = [$v6_conf{$key}]\n" );
            }
         }
      } else {
         prtw( "WARNING: FAILED TO OPEN $fil FILE!\n" );
      }
   } else {
      prtw( "WARNING: $fil *** DOES NOT EXIST ***\n" );
   }
}
###############################################################################
### utitlity subs
sub compare_dsp_with_dsp {
   my ($file1,$file2) = @_;
   my ($i1, $i2, $fnd, $matched);
   my ($src1, $ff1, $fnm1, $typ1, $flg1);
   my ($src2, $ff2, $fnm2, $typ2, $flg2);
   my ($nm1, $pth1, $suf1);
   my ($nm2, $pth2, $suf2);
   my ($added, $subed, $miss1, $miss2, $min);
   my $msg = '';
    my ($moved, $numb);
    # compare SOURCES
    ###############################
   my $v6_tot1 = scalar @v6_srcs1;
   my $v6_tot2 = scalar @v6_srcs2;
    $added = 0;
    $subed = 0;   # return CHANGE counter
    if (($v6_tot1 == 0)||($v6_tot2 == 0)) {
       prtw( "WARNING: NO compare of sources MSVC6 totals $v6_tot1, with $v6_tot2 ... when 1 or both zero\n" ); 
       return ($added + $subed);   # return CHANGE counter
    }
   prt( "\nCompare of sources MSVC6 totals $v6_tot1, with $v6_tot2 ...\n" ); 
   $fnd = 0;
   $matched = 0;
   for ($i1 = 0; $i1 < $v6_tot1; $i1++) {
      $v6_srcs1[$i1][V6_CMP] = 0;  # clear matched
      $v6_srcs1[$i1][V6_DON] = 0;  # clear done
   }
   for ($i2 = 0; $i2 < $v6_tot2; $i2++) {
      $v6_srcs2[$i2][V6_CMP] = 0;  # clear matched
      $v6_srcs2[$i2][V6_DON] = 0;  # clear done
   }
    # for EACH in file 1
   for ($i1 = 0; $i1 < $v6_tot1; $i1++) {
      $src1 = $v6_srcs1[$i1][0];
      $ff1  = $v6_srcs1[$i1][1];
      $fnm1 = $v6_srcs1[$i1][2];
      $typ1 = $v6_srcs1[$i1][3];
      $flg1 = $v6_srcs1[$i1][V6_CMP]; # [4];
      $fnd = 0;
        ###prt( "Find [$src1] in file2\n" );
      for ($i2 = 0; $i2 < $v6_tot2; $i2++) {
         $src2 = $v6_srcs2[$i2][0];
         $ff2  = $v6_srcs2[$i2][1];
         $fnm2 = $v6_srcs2[$i2][2];
         $typ2 = $v6_srcs2[$i2][3];
         $flg2 = $v6_srcs2[$i2][V6_CMP]; # [4];
            ###prt( "Comp [$src2] file name\n" );
            ###exit(1) if ($i2 > 20);
         if ( is_same_file($src1,$src2) ) {
            # first a full compare with DIRECTORY included
         ###if ( is_same_file($ff1,$ff2) ) {
            $v6_srcs2[$i2][V6_CMP] = $i1 + 1;   # put INDEX plus 1
            $v6_srcs1[$i1][V6_CMP] = $i2 + 1;
            $fnd = 1;
            last;
         }
      }
      if ($fnd) {
         $matched++;
      } else {
         #prt( "NO MATCH\n" ) if ($big_dbg);
      }
   }
   $added = $v6_tot1 - $matched;
   $subed = $v6_tot2 - $matched;
    if (($added == 0)&&($subed == 0)) {
        prt( "Sources MATCH exactly ...\n" );
    } else {
        prt( "In the compare of $file1, with $file2 ...\n" );
       prt( "Matched $matched of $v6_tot1, with $matched of $v6_tot2 ...\n" );
    }
    # get sources NOT matched in file1
   $miss1 = 0;
    $moved = 0;
   for ($i1 = 0; $i1 < $v6_tot1; $i1++) {
      if ($v6_srcs1[$i1][V6_CMP] == 0) {
         $ff1  = $v6_srcs1[$i1][V6_FUL];
            if ( !$ignore_headers || is_c_source($ff1) ) {
                $miss1++;
                # find in file2
                for ($i2 = 0; $i2 < $v6_tot2; $i2++) {
                    if ($v6_srcs2[$i2][V6_CMP] == 0) {
                        $ff2  = $v6_srcs2[$i2][V6_FUL];
                        if ( fg_is_same_file_name($ff1,$ff2) ) {
                            $v6_srcs2[$i2][V6_DON] = $i1 + 1;   # put INDEX plus 1
                            $v6_srcs1[$i1][V6_DON] = $i2 + 1;
                            $moved++;
                            last;
                        }
                    }
                }
            }
      }
   }
    # 25/11/2008 - also check existance in other folder, if MISSED!
    my ($f1n,$f1d,$f1e) = fileparse($file1, qr/\.[^.]*/ );
    my ($f2n,$f2d,$f2e) = fileparse($file2, qr/\.[^.]*/ );
   if ($miss1) {
      prt( "\nF1:$file1 contains $miss1, NOT in F2:$file2 ..." );
        prt( " but $moved moved ..." ) if ($moved);
        prt( " ignoring headers ..." ) if ($ignore_headers);
        prt( "\n" );
        $numb = 0;
      for ($i1 = 0; $i1 < $v6_tot1; $i1++) {
         if ($v6_srcs1[$i1][V6_CMP] == 0) {
            $src1 = $v6_srcs1[$i1][0];
            $ff1  = $v6_srcs1[$i1][1];
            $msg = "$src1 ";
            $min = $minlen1;
            $msg .= ' ' while (length($msg) < $min);
            $msg .= "($ff1) ";
            $min += 3 + $minlen2;
            $msg .= ' ' while (length($msg) < $min);
            if (-f $ff1) {
               $msg .= "ok";
            } else {
               $msg .= "MISSING?";
                    $fnm1 = $f2d.$src1;
                    if (-f $fnm1) {
                        $msg .= " but ok, in dir of 2!";
                    }
            }
                $flg1 = $v6_srcs1[$i1][V6_DON];
             if ($flg1) {
                   $ff2  = $v6_srcs1[($flg1 - 1)][V6_FUL];
                    $msg .= " MOVED! [$ff2]";
                }
                if ( !$ignore_headers || is_c_source($ff1) ) {
                    $numb++;
                    prt( "$numb: $msg\n" );
                }
         }
      }
        prt( "Done ouput of $numb items NOT in $file2 ...\n" );
   }
    # get sources NOT matched in file2
   $miss2 = 0;
   for ($i2 = 0; $i2 < $v6_tot2; $i2++) {
      if ($v6_srcs2[$i2][V6_CMP] == 0) {
         $ff2  = $v6_srcs2[$i2][1];
            if ( !$ignore_headers || is_c_source($ff2) ) {
             $miss2++;
            }
      }
   }
   if ($miss2) {
      prt( "\nF2:$file2 contains $miss2, NOT in F1:$file1 ...\n" );
        $numb = 0;
      for ($i2 = 0; $i2 < $v6_tot2; $i2++) {
         if ($v6_srcs2[$i2][V6_CMP] == 0) {
            $src2 = $v6_srcs2[$i2][0];
            $ff2  = $v6_srcs2[$i2][1];
            $msg = "$src2 ";
            $min = $minlen1;
            $msg .= ' ' while (length($msg) < $min);
            $msg .= "($ff2) ";
            $min += 3 + $minlen2;
            $msg .= ' ' while (length($msg) < $min);
            if (-f $ff2) {
               $msg .= "ok";
            } else {
               $msg .= "MISSING?";
            }
                $flg2 = $v6_srcs2[$i2][V6_DON];
             if ($flg2) {
                    $ff1 = $v6_srcs1[($flg2 - 1)][V6_FUL];
                    $msg .= " MOVED! [$ff1]";
                }
                if ( !$ignore_headers || is_c_source($ff2) ) {
                    $numb++;
                    prt( "$numb: $msg\n" );
                }
         }
      }
        prt( "Done ouput of $numb items NOT in $file1 ...\n" );
   }
   prt("\n");
    if ($also_show_matched) {
      prt( "\n$file1 list of MATCHED to $file2 ... ".($v6_tot1 - $miss1)." items ...\n" );
        $numb = 0;
       for ($i1 = 0; $i1 < $v6_tot1; $i1++) {
          $flg1 = $v6_srcs1[$i1][V6_CMP]; # [4];
          if ($flg1 > 0) {
            $ff1  = $v6_srcs1[$i1][V6_FUL];
            $ff2  = $v6_srcs2[($flg1 - 1)][V6_FUL];
            $msg = "$ff1 ";
            $min = $minlen1;
            $msg .= ' ' while (length($msg) < $min);
            $msg .= "$ff2 ";
            $min += 3 + $minlen2;
            $msg .= ' ' while (length($msg) < $min);
            if (-f $ff1) {
               $msg .= "ok";
            } else {
               $msg .= "MISSING?";
            }
                if ( !$ignore_headers || is_c_source($ff1) ) {
                    $numb++;
                    prt( "$numb: $msg\n" );
                }
            }
        }
        prt( "Done ouput of $numb items MATCHED ...\n" );
    }
    if (($added == 0)&&($subed == 0)) {
       return ($added + $subed);   # return CHANGE counter
    }
    if ($also_show_moved) {
      prt( "\n$file1 list of MOVED in $file2 ... $moved items ...\n" );
        $numb = 0;
       for ($i1 = 0; $i1 < $v6_tot1; $i1++) {
          $flg1 = $v6_srcs1[$i1][V6_DON]; # [4];
          if ($flg1 > 0) {
            $ff1  = $v6_srcs1[$i1][V6_FUL];
            $ff2  = $v6_srcs2[($flg1 - 1)][V6_FUL];
            $msg = "$ff1 ";
            $min = $minlen1;
            $msg .= ' ' while (length($msg) < $min);
            $msg .= "$ff2 ";
            $min += 3 + $minlen2;
            $msg .= ' ' while (length($msg) < $min);
            if (-f $ff1) {
               $msg .= "ok";
            } else {
               $msg .= "MISSING?";
            }
                if ( !$ignore_headers || is_c_source($ff1) ) {
                    $numb++;
                    prt( "$numb: $msg\n" );
                }
            }
        }
        prt( "Done ouput of $numb items MOVED ...\n" );
    }
   return ($added + $subed);   # return CHANGE counter
}
sub fg_is_same_file_name {
   my ($f1, $f2) = @_;
    my ($f1n,$f1d,$f1e) = fileparse($f1, qr/\.[^.]*/ );
    my ($f2n,$f2d,$f2e) = fileparse($f2, qr/\.[^.]*/ );
    if ( (lc($f1n) eq lc($f2n)) && (lc($f1e) eq lc($f2e))) {
        return 1;
    }
    return 0;
}
sub is_same_file {
   my ($f1, $f2) = @_;
   my $len1 = length($f1);
    my $len2 = length($f2);
   $f1 =~ s/\//\\/g;
   $f2 =~ s/\//\\/g;
   my $lcf1 = lc($f1);
   my $lcf2 = lc($f2);
    my $ch1 = '';
    my $ch2 = '';
   if ($len1 != $len2) {
        ###prt( "NOT SAME LENGTH [$f1]($len) vs [$f2]($len2)\n" );
        # but what about comparing -
        # src\AIModel\submodel.cxx
        # C:\FGCVS\FlightGear\source\src\AIModel\submodel.cxx
        my ($i1, $i2, $hadsep);
        $i1 = $len1 - 1;
        $i2 = $len2 - 1;
        $hadsep = 0;
        while ($i1 && $i2) {
            $ch1 = substr($lcf1,$i1,1);
            $ch2 = substr($lcf2,$i2,1);
          if ($ch1 ne $ch2) {
                ##prt( "FAILED at char $i1:$i2: $ch1 vs $ch2 [$f1]($len1) & [$f2]($len2)\n" );
             return 0;
          }
            $hadsep++ if ($ch1 eq "\\");
            $i1--;
            $i2--;
        }
      return 1 if ($hadsep);   # is the SAME TAIL
        return 0;
   }
   my $i = 0;
   while ($i < $len1) {
        $ch1 = substr($lcf1,$i,1);
        $ch2 = substr($lcf2,$i,1);
      if ($ch1 ne $ch2) {
            ###prt( "FAILED at char ".($i + 1)." $ch1 vs $ch2 [$f1]($len1) & [$f2]($len2)\n" );
         return 0;
      }
      $i++;
   }
   return 1;   # they ARE the SAME
}
# extracted from utils.pl
sub unix_2_dos {
   my ($f) = shift;
   $f =~ s/\//\\/g;
   return $f;
}
sub sub_common_folder {
   my ($f1, $f2) = @_;
   my $off = 0;
   my $df1 = lc(unix_2_dos($f1));
   my $df2 = lc(unix_2_dos($f2));
   while ( substr($df1,$off,1) && substr($df2,$off,1) &&
         ( substr($df1,$off,1) eq substr($df2,$off,1) ) ) {
      $off++;
   }
   return substr($f1,$off);
}
sub prtw {
    my ($tx) = shift;
    $tx =~ s/\n$//;
    prt("$tx\n");
    push(@warnings,$tx);
}
sub show_warnings {
    if (@warnings) {
        prt( "\nGot ".scalar @warnings." WARNINGS ...\n" );
        foreach my $line (@warnings) {
            prt("$line\n" );
        }
        prt("\n");
    } else {
        prt("\nNo warnings issued.\n\n");
    }
}
# eof - fgcmp2dsps.pl
# WHY THESE ???
# 1: src\GUI\SafeTexFont.cxx                 (FlightGear\src\GUI\SafeTexFont.cxx)         is ok
# appear this SHOULD be added
# 2: src\Main\fg_os_osgviewer.cxx            (FlightGear\src\Main\fg_os_osgviewer.cxx)                       ok
# AND
# FlightGear\FlightGear.dsp contains 95, NOT in tempscan.dsp ...
# 1: src\Main\fg_os.cxx                      (FlightGear\src\Main\fg_os.cxx)                                 ok
# ok, this is a problem deciding, SDL, GLUT, or OSG-viewer - from src/Main/Makefile.am
#if USE_SDL
#GFX_CODE = fg_os_sdl.cxx $(GFX_COMMON)
#else
#if USE_GLUT
#GFX_CODE = fg_os.cxx $(GFX_COMMON)
#else
#GFX_CODE = fg_os_osgviewer.cxx $(GFX_COMMON)
#endif
#endif
# 3: src\Network\jpg-httpd.cxx               (FlightGear\src\Network\jpg-httpd.cxx)                          ok
# decision to ADD, from src/Network/Makefile.am
#if ENABLE_JPEG_SERVER
#JPEG_SERVER = jpg-httpd.cxx jpg-httpd.hxx
#else
#JPEG_SERVER =
#endif
# 4: src\FDM\SP\Balloon.cxx                  (FlightGear\src\FDM\SP\Balloon.cxx)                             ok
# 5: src\FDM\SP\BalloonSim.cpp               (FlightGear\src\FDM\SP\BalloonSim.cpp)                          ok
# 6: src\FDM\SP\MagicCarpet.cxx              (FlightGear\src\FDM\SP\MagicCarpet.cxx)                         ok
# hmmm, these are in src\FDM\SP\Makefile.am
# The makefile is READ, WHY NOT ADDED??? fgamscan.pl read this makefile, and extracted the sources
# LIBRARY [libSPFDM_a] has SOURCES [src\FDM\SP\ADA.cxx src\FDM\SP\ADA.hxx src\FDM\SP\ACMS.cxx 
# src\FDM\SP\ACMS.hxx src\FDM\SP\Balloon.cxx src\FDM\SP\Balloon.h src\FDM\SP\BalloonSim.cpp 
# src\FDM\SP\BalloonSim.h src\FDM\SP\MagicCarpet.cxx src\FDM\SP\MagicCarpet.hxx]
# so OK, THEY SHOULD BE ADDED, so fgamscan.pl IS CORRECT, producing a BETTER DSP file.

index -|- top

checked by tidy  Valid HTML 4.01 Transitional