Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.4 KiB

  1. # resolve.pl - combines a .have file with a .src file
  2. my %MatchHash;
  3. &main;
  4. sub main {
  5. my (%KB, @KBKeys); # KB:path => SDPORT
  6. my (%ALIAS, %ALIAS_TEMP, %UsedAlias); # ALIAS: SDPORT => aliasname
  7. my (@OUTPUT);
  8. # Prepare the header info
  9. &readsrv(\%KB, @ARGV[1..$#ARGV]);
  10. &readsrv(\%ALIAS_TEMP, "srcsrv.ini");
  11. %ALIAS = reverse %ALIAS_TEMP;
  12. @SrvNames = map({sprintf("SRV%x",$_)} (0..scalar(keys %KB)));
  13. @ALIAS{grep {!exists $ALIAS{$_}} values %KB} = ("") x @SrvNames;
  14. &readsrc;
  15. @KBKeys = keys %KB;
  16. &RegistSub('KB', \@KBKeys);
  17. &readhave(\%KB, \%UsedAlias, \@OUTPUT, split(/\,/, $ARGV[0]));
  18. for (keys %ALIAS) {delete $ALIAS{$_} if (!exists $UsedAlias{$_});}
  19. @ALIAS{grep {$ALIAS{$_} eq ""} keys %ALIAS}=@SrvNames;
  20. %UsedAlias = reverse %ALIAS;
  21. print "SRCSRV: variables ------------------------------------------\n";
  22. map({print "$_\=$UsedAlias{$_}\n"} sort keys %UsedAlias);
  23. print "SRCSRV: source files ---------------------------------------\n";
  24. map({print "SD\: $_->[0]\*\$\{$ALIAS{$_->[1]}\}\*$_->[2]\n";} @OUTPUT);
  25. print "SRCSRV: end ------------------------------------------------\n";
  26. return;
  27. }
  28. sub readhave {
  29. my ($KBPtr, $UsedAliasPtr, $OutputPtr, @FileNames) = @_;
  30. my ($sdpath, $filename, $key, %Unsolve, %Solve, $t, $Progress, $unsolvenum);
  31. my (%ExistAlias);
  32. $Progress = $unsolvenum = 0;
  33. while(1) {
  34. my $filename = shift @FileNames;
  35. open(FILE, $filename) or return;
  36. # open(FILE, $filename) or do {
  37. # return if ($Progress eq '0');
  38. # return if ($unsolvenum eq '0');
  39. # ($KBPtr, $UsedAliasPtr, $OutputPtr, @FileNames) = @_;
  40. # $Progress = 0;
  41. # next;
  42. # };
  43. # print "Reading $filename\n";
  44. while(<FILE>) {
  45. chomp;
  46. ($sdpath, $filename) = split(/\s*-\s*/, $_, 2);
  47. # next if (exists $Solve{lc$sdpath});
  48. if (&ExistIn('SRC',$filename) ne '-1') {
  49. if (($key = &ExistIn('KB',$filename)) ne '-1') {
  50. $key = $MatchHash{'KB'}->[$key];
  51. push @$OutputPtr, [$filename, $KBPtr->{$key}, $sdpath];
  52. $UsedAliasPtr->{$KBPtr->{$key}} = 1;
  53. $Solve{lc$sdpath}=1;
  54. $Progress++;
  55. next;
  56. }
  57. # $Unsolve{lc$sdpath} = [$sdpath, $filename];
  58. # $unsolvenum++;
  59. # next;
  60. }
  61. # if (exists $Unsolve{lc$sdpath}) {
  62. # next if (($key = &ExistIn('KB',$filename)) eq '-1');
  63. # $key = $MatchHash{'KB'}->[$key];
  64. # push @$OutputPtr, [$Unsolve{lc$sdpath}[1], $KBPtr->{$key}, $Unsolve{lc$sdpath}[0]];
  65. # $UsedAliasPtr->{$KBPtr->{$key}} = 1;
  66. # $Solve{lc$t}=1;
  67. # $unsolvenum--;
  68. # $Progress++;
  69. # }
  70. }
  71. }
  72. }
  73. sub readsrv {
  74. my ($kbptr) = shift;
  75. my ($k, $v);
  76. open(FILE, shift) or return;
  77. while(<FILE>) {
  78. chomp;
  79. s/^\s*//g;
  80. s/\s*$//g;
  81. ($k, $v) = split(/\=/, $_, 2);
  82. $kbptr->{$k} = $v;
  83. }
  84. close(FILE);
  85. return;
  86. }
  87. sub readsrc {
  88. my @lst;
  89. chomp(@lst = grep {/\\/ && !/^Microsoft \(R\).*/ && !/^Copyright \(C\).*/ && !/^\*{3}/ && !/^\s*$/i} <STDIN>);
  90. return &RegistSub('SRC', \@lst);
  91. }
  92. sub RegistSub {
  93. my @lst;
  94. @lst = sort {length($b) <=> length($a)} @{$_[1]};
  95. $MatchHash{$_[0]} = \@lst;
  96. }
  97. sub ExistIn {
  98. my ($type, $value) = @_;
  99. my ($i)=(0);
  100. for (@{$MatchHash{$type}}) {
  101. return $i if ($value =~ /\Q$_\E/i);
  102. $i++;
  103. }
  104. return -1;
  105. }