#! /usr/bin/perl # # Create the copywowlist file given the result of wowlist filtering. # To be called from copywow64.cmd. # # sergueik - 03/07/01 # # Perl CopyWowlist.pl # # my $self = $0; $self =~ s/^.*\\([^\\]*)$/$1/g; my $pos = -1; my %mapping = (); my $section; if ( $ENV{ "_BuildArch" } =~ /amd64/i ) { $section = q(\[SourceDisksNames\.amd64\]); } else { $section = q(\[SourceDisksNames\.ia64\]); } my $DEBUG = 0; &usage and exit 0 if grep /[\/\-][\h?]/, @ARGV; my $status = &VerifyCommandLine( {"argv"=>\@ARGV, "argc"=>3, 0 => "-e \"FILE\"", 1 => "-e \"FILE\""}); $status and die "$self: wrong call"; my $Input_DirectoryMappingFile = $ARGV[0]; my $Input_Filelist = $ARGV[1]; my $Output_Copywowlist = $ARGV[2]; open (HINT, $Input_DirectoryMappingFile) or die "cannot read Input_DirectoryMappingFile $Input_DirectoryMappingFile: $!"; { my $mapping = 0; my @mapping = (); my @mappingpart = (); # Put in the @mapping array all entries from the [SourceDisksNames] section. while (){ chomp; do{ $mapping = 1; @mappingpart = (); }if /^$section/; do{ push @mapping, @mappingpart; $mapping = 0; }if $mapping && scalar (@mappingpart) && $_!~/\S/; push @mappingpart, $_ if $mapping && /=/; } # The keys in the %mapping hash are the directory numbers # and the relative path is the value. %mapping = map {split /\s*=\s*/, $_} @mapping; foreach (keys (%mapping)){ my $data = $mapping{$_}; $mapping{$_}=[split(/\s*,\s*/,$data)]; } foreach (keys (%mapping)){ my $data = $mapping{$_}->[$pos]; $data =~ s/^\\[^\\]+(\\)?//; $mapping{$_}->[$pos]=$data; } map { $mapping{$_} = $mapping{$_}->[$pos]} keys (%mapping); print STDERR join( "\n", map {"\"".$_."\"\t=>\t\"".$mapping{$_}."\""} keys (%mapping)), "\n" if $DEBUG; } close(HINT); my @data=(); my $pos2 = 0; # Read the filenames and their directories from the second argument. open (UNFIXED, $Input_Filelist) or die "cannot read Input_Filelist $Input_Filelist : $!"; do {push @data, $_ unless ($_!~/\S/); }while(); close(UNFIXED); print STDERR "$#data\n" if $DEBUG; foreach $row (0..$#data){ my $line = $data[$row]; chomp $line; my ($file, $rest) = split(/\s*=\s*/, $line); my @rest = split (/,/, $rest); my $index = $rest[$pos2]; my $path = $mapping{$index}; $file = join ("\\", $path, $file) if $path; $data[$row] = $file; } # Write the output open (FIXED, ">".$Output_Copywowlist) or die "canot write to Output_Copywowlist $Output_Copywowlist: $!"; select FIXED; $|=1; map {print "$_\n"} @data; select STDOUT; close(FIXED); sub VerifyCommandLine{ my $messages = {"-e \"FILE\"" => "file \"FILE\" does not exist\n", "!-e \"FILE\"" => "cannot clobber existing file: \"FILE\"\n" }; my $named = shift; my %named = %$named; my $argv = $named->{"argv"}; my $argc = $named->{"argc"}; my $result = 0; $result = 1 if scalar(@$argv) != $argc; if ($result ){ print STDERR "$self: wrong number of args\n"; } else{ foreach $one (keys(%named)){ if ($one !~ /\D/){ $test = $named->{$one}; $test =~ s/FILE/$argv->[$one]/g; $test =~ s/\\/\//g; do { my $message = $messages->{$named->{$one}}; $message =~ s/FILE/$argv->[$one]/g; print STDERR "$self: $message"; $result = 1; last;} if (!eval($test)); } } } $result; } sub usage{ print < Create the copywowlist file given the result of wowlist filtering. To be called from copywow64.cmd. USAGE }