Windows2003-3790/sdktools/debuggers/sds/resolve2.pl
2020-09-30 16:53:55 +02:00

130 lines
3.4 KiB
Perl

# resolve.pl - combines a .have file with a .src file
my %MatchHash;
&main;
sub main {
my (%KB, @KBKeys); # KB:path => SDPORT
my (%ALIAS, %ALIAS_TEMP, %UsedAlias); # ALIAS: SDPORT => aliasname
my (@OUTPUT);
# Prepare the header info
&readsrv(\%KB, @ARGV[1..$#ARGV]);
&readsrv(\%ALIAS_TEMP, "srcsrv.ini");
%ALIAS = reverse %ALIAS_TEMP;
@SrvNames = map({sprintf("SRV%x",$_)} (0..scalar(keys %KB)));
@ALIAS{grep {!exists $ALIAS{$_}} values %KB} = ("") x @SrvNames;
&readsrc;
@KBKeys = keys %KB;
&RegistSub('KB', \@KBKeys);
&readhave(\%KB, \%UsedAlias, \@OUTPUT, split(/\,/, $ARGV[0]));
for (keys %ALIAS) {delete $ALIAS{$_} if (!exists $UsedAlias{$_});}
@ALIAS{grep {$ALIAS{$_} eq ""} keys %ALIAS}=@SrvNames;
%UsedAlias = reverse %ALIAS;
print "SRCSRV: variables ------------------------------------------\n";
map({print "$_\=$UsedAlias{$_}\n"} sort keys %UsedAlias);
print "SRCSRV: source files ---------------------------------------\n";
map({print "SD\: $_->[0]\*\$\{$ALIAS{$_->[1]}\}\*$_->[2]\n";} @OUTPUT);
print "SRCSRV: end ------------------------------------------------\n";
return;
}
sub readhave {
my ($KBPtr, $UsedAliasPtr, $OutputPtr, @FileNames) = @_;
my ($sdpath, $filename, $key, %Unsolve, %Solve, $t, $Progress, $unsolvenum);
my (%ExistAlias);
$Progress = $unsolvenum = 0;
while(1) {
my $filename = shift @FileNames;
open(FILE, $filename) or return;
# open(FILE, $filename) or do {
# return if ($Progress eq '0');
# return if ($unsolvenum eq '0');
# ($KBPtr, $UsedAliasPtr, $OutputPtr, @FileNames) = @_;
# $Progress = 0;
# next;
# };
# print "Reading $filename\n";
while(<FILE>) {
chomp;
($sdpath, $filename) = split(/\s*-\s*/, $_, 2);
# next if (exists $Solve{lc$sdpath});
if (&ExistIn('SRC',$filename) ne '-1') {
if (($key = &ExistIn('KB',$filename)) ne '-1') {
$key = $MatchHash{'KB'}->[$key];
push @$OutputPtr, [$filename, $KBPtr->{$key}, $sdpath];
$UsedAliasPtr->{$KBPtr->{$key}} = 1;
$Solve{lc$sdpath}=1;
$Progress++;
next;
}
# $Unsolve{lc$sdpath} = [$sdpath, $filename];
# $unsolvenum++;
# next;
}
# if (exists $Unsolve{lc$sdpath}) {
# next if (($key = &ExistIn('KB',$filename)) eq '-1');
# $key = $MatchHash{'KB'}->[$key];
# push @$OutputPtr, [$Unsolve{lc$sdpath}[1], $KBPtr->{$key}, $Unsolve{lc$sdpath}[0]];
# $UsedAliasPtr->{$KBPtr->{$key}} = 1;
# $Solve{lc$t}=1;
# $unsolvenum--;
# $Progress++;
# }
}
}
}
sub readsrv {
my ($kbptr) = shift;
my ($k, $v);
open(FILE, shift) or return;
while(<FILE>) {
chomp;
s/^\s*//g;
s/\s*$//g;
($k, $v) = split(/\=/, $_, 2);
$kbptr->{$k} = $v;
}
close(FILE);
return;
}
sub readsrc {
my @lst;
chomp(@lst = grep {/\\/ && !/^Microsoft \(R\).*/ && !/^Copyright \(C\).*/ && !/^\*{3}/ && !/^\s*$/i} <STDIN>);
return &RegistSub('SRC', \@lst);
}
sub RegistSub {
my @lst;
@lst = sort {length($b) <=> length($a)} @{$_[1]};
$MatchHash{$_[0]} = \@lst;
}
sub ExistIn {
my ($type, $value) = @_;
my ($i)=(0);
for (@{$MatchHash{$type}}) {
return $i if ($value =~ /\Q$_\E/i);
$i++;
}
return -1;
}