mirror of https://github.com/tongzx/nt5src
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.
964 lines
22 KiB
964 lines
22 KiB
#++
|
|
# Barbara Kess
|
|
# Copyright (c) 1998 Microsoft Corporation
|
|
#
|
|
# Module Name:
|
|
# makelist.pl
|
|
#
|
|
# Abstract:
|
|
#
|
|
#
|
|
#--
|
|
|
|
#
|
|
# Set global vars
|
|
#
|
|
|
|
#Flush output buffer for remote.exe
|
|
select(STDOUT); $|=1;
|
|
|
|
# Get the parameters
|
|
%Params = &GetArguments(@ARGV);
|
|
|
|
if ( exists $Params{"i"} ) {
|
|
@list = &IntersectLists( %Params );
|
|
}
|
|
elsif ( exists $Params{"u"} ) {
|
|
@list = &UnionLists( %Params );
|
|
}
|
|
elsif ( exists $Params{"d"} ) {
|
|
@list = &DiffLists( %Params );
|
|
}
|
|
elsif ( exists $Params{"c"} ) {
|
|
@list = &CreateListFromDirectory( %Params );
|
|
}
|
|
elsif ( exists $Params{"n"} ) {
|
|
@list = &DosnetToList(%Params);
|
|
}
|
|
elsif ( exists $Params{"m"} ) {
|
|
@list = &FileToList( %Params );
|
|
}
|
|
elsif ( exists $Params{"a"} ) {
|
|
@list = &SourceDestDiff( %Params );
|
|
}
|
|
elsif ( exists $Params{"q"} ) {
|
|
@list = &ExDosnetToList( %Params );
|
|
}
|
|
elsif ( exists $Params{"b"} ) {
|
|
@list = &MediaToList( %Params );
|
|
}
|
|
|
|
elsif ( exists $Params{"r"} ) {
|
|
@list = &DrvindexToList( %Params );
|
|
}
|
|
|
|
if ( exists $Params{"h"} ) {
|
|
@header=&GetHeader( @{$Params{"h"}}[0] );
|
|
&PrintListWithHeader(\@header,\@list, @{$Params{"o"}}[0]);
|
|
}
|
|
else {
|
|
&PrintList(\@list, @{$Params{"o"}}[0]);
|
|
}
|
|
|
|
sub IntersectLists
|
|
{
|
|
my ( %params ) = @_;
|
|
|
|
my (@file_list, @file_l, @list, %MARK);
|
|
|
|
$first = 1;
|
|
|
|
foreach $file ( @{$params{"i"}} ) {
|
|
|
|
#open file put it into an array
|
|
unless ( open( FHANDLE, $file)) {
|
|
&LogMsg('err',"Unable to open $file");
|
|
}
|
|
|
|
if ($first == 1) {
|
|
@file_list = <FHANDLE>;
|
|
close (FHANDLE);
|
|
|
|
$i=0;
|
|
foreach $item (@file_list) {
|
|
chop $file_list[$i];
|
|
$i++;
|
|
}
|
|
|
|
$first = 0;
|
|
}
|
|
else {
|
|
@list = <FHANDLE>;
|
|
close (HANDLE);
|
|
|
|
$i=0;
|
|
foreach $item (@list) {
|
|
chop $list[$i];
|
|
$i++;
|
|
}
|
|
|
|
foreach $item (@file_list) {
|
|
$MARK{lc $item} = 1;
|
|
}
|
|
foreach $item (@list) {
|
|
if ( $MARK{lc $item} == 1) {
|
|
$MARK{lc $item} = 2;
|
|
}
|
|
}
|
|
foreach $item (keys %MARK) {
|
|
if ( $MARK{$item} == 2 ) {
|
|
push @file_l, $item;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (@file_l);
|
|
}
|
|
|
|
sub UnionLists
|
|
{
|
|
my ( %params ) = @_;
|
|
|
|
my (@file_list, @file_l, @list, %MARK);
|
|
|
|
$first = 1;
|
|
|
|
foreach $file ( @{$params{"u"}} ) {
|
|
|
|
#open file put it into an array
|
|
unless ( open( FHANDLE, $file)) {
|
|
&LogMsg('err',"Unable to open $file");
|
|
}
|
|
|
|
if ($first == 1) {
|
|
@file_list = <FHANDLE>;
|
|
close (FHANDLE);
|
|
$first = 0;
|
|
|
|
$i=0;
|
|
foreach $item (@file_list) {
|
|
chop $file_list[$i];
|
|
$i++;
|
|
}
|
|
}
|
|
else {
|
|
@list = <FHANDLE>;
|
|
close (FHANDLE);
|
|
|
|
$i=0;
|
|
foreach $item (@list) {
|
|
chop $list[$i];
|
|
$i++;
|
|
}
|
|
foreach $item (@file_list) {
|
|
$MARK{lc $item} = 1;
|
|
}
|
|
foreach $item (@list) {
|
|
$MARK{lc $item} = 1;
|
|
}
|
|
foreach $item (keys %MARK) {
|
|
if ( $MARK{$item} == 1 ) {
|
|
push @file_l, $item;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (@file_l);
|
|
}
|
|
|
|
sub DiffLists
|
|
{
|
|
my ( %params ) = @_;
|
|
|
|
my (@file_list, @file_l, @list, %MARK);
|
|
|
|
$first = 1;
|
|
|
|
foreach $file ( @{$params{"d"}} ) {
|
|
|
|
#open file put it into an array
|
|
unless ( open( FHANDLE, $file)) {
|
|
&LogMsg('err',"Unable to open $file");
|
|
}
|
|
|
|
if ($first == 1) {
|
|
@file_list = <FHANDLE>;
|
|
close (FHANDLE);
|
|
|
|
$first = 0;
|
|
$i=0;
|
|
foreach $item (@file_list) {
|
|
chop $file_list[$i];
|
|
$i++;
|
|
}
|
|
}
|
|
else {
|
|
@list = <FHANDLE>;
|
|
close (FHANDLE);
|
|
|
|
$i=0;
|
|
foreach $item (@list) {
|
|
chop $list[$i];
|
|
$i++;
|
|
}
|
|
|
|
foreach $item (@file_list) {
|
|
$MARK{lc $item}=1;
|
|
}
|
|
foreach $item (@list) {
|
|
$MARK{lc $item}=0;
|
|
}
|
|
foreach $item (keys %MARK) {
|
|
if ($MARK{$item} == 1) {
|
|
push @file_l, $item;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (@file_l);
|
|
}
|
|
|
|
sub CreateListFromDirectory
|
|
{
|
|
|
|
my ( %params ) = @_;
|
|
|
|
my (@dir_list, @dir_l,$dir, %MARK);
|
|
|
|
$dir = @{$Params{"c"}}[0];
|
|
|
|
|
|
unless ( opendir(DIRECTORY, $dir) ) {
|
|
print "ERROR: Cannot open $dir\n";
|
|
}
|
|
@dir_list = readdir(DIRECTORY);
|
|
closedir(DIRECTORY);
|
|
$i=0;
|
|
foreach $item (@dir_list) {
|
|
chop $file_list[$i];
|
|
$i++;
|
|
}
|
|
|
|
foreach $item (@dir_list) {
|
|
|
|
# if this file is not a directory, put it in the list
|
|
unless (opendir (DIRECTORY, "$dir\\$item") ) {
|
|
$MARK{lc $item}++;
|
|
}
|
|
closedir(DIRECTORY);
|
|
}
|
|
@dir_l = grep($MARK{lc $_},@dir_list);
|
|
|
|
return(@dir_l);
|
|
}
|
|
|
|
sub DosnetToList
|
|
{
|
|
# $dosnet is the name of the dosnet file
|
|
# $path is a flag telling whether or not to include path
|
|
# information in the output file
|
|
# (i.e., filename=d:\binaries\filename)
|
|
# @search_paths tells where to search
|
|
# $check is a flag. If it is 1, then check the search paths,
|
|
# otherwise use the current directory as the path
|
|
|
|
my ( %params ) = @_;
|
|
|
|
$dosnet = @{$params{"n"}}[0];
|
|
|
|
my (@d_list);
|
|
|
|
@d_list = &MakeListFromDosnet($dosnet);
|
|
|
|
return (@d_list);
|
|
}
|
|
|
|
sub MediaToList
|
|
{
|
|
# $media is the name of the _media file
|
|
# $path is a flag telling whether or not to include path
|
|
# information in the output file
|
|
# (i.e., filename=d:\binaries\filename)
|
|
# @search_paths tells where to search
|
|
# $check is a flag. If it is 1, then check the search paths,
|
|
# otherwise use the current directory as the path
|
|
|
|
my ( %params ) = @_;
|
|
|
|
$media = @{$params{"b"}}[0];
|
|
|
|
my (@d_list);
|
|
|
|
|
|
@d_list = &MakeListFromMedia($media);
|
|
|
|
return (@d_list);
|
|
}
|
|
|
|
sub ExDosnetToList
|
|
{
|
|
# $exdosnet is the name of the dosnet file
|
|
# $path is a flag telling whether or not to include path
|
|
# information in the output file
|
|
# (i.e., filename=d:\binaries\filename)
|
|
# @search_paths tells where to search
|
|
# $check is a flag. If it is 1, then check the search paths,
|
|
# otherwise use the current directory as the path
|
|
|
|
my ( %params ) = @_;
|
|
|
|
$exdosnet = @{$params{"q"}}[0];
|
|
|
|
my (@d_list);
|
|
|
|
@d_list = &MakeListFromExDosnet($exdosnet);
|
|
|
|
return (@d_list);
|
|
}
|
|
|
|
sub DrvindexToList
|
|
{
|
|
# $drvindex is the name of the drvindex file
|
|
# $path is a flag telling whether or not to include path
|
|
# information in the output file
|
|
# (i.e., filename=d:\binaries\filename)
|
|
# @search_paths tells where to search
|
|
# $check is a flag. If it is 1, then check the search paths,
|
|
# otherwise use the current directory as the path
|
|
|
|
my ( %params ) = @_;
|
|
|
|
$drvindex = @{$params{"r"}}[0];
|
|
|
|
my (@d_list);
|
|
|
|
@d_list = &MakeListFromDrvindex($drvindex);
|
|
|
|
return (@d_list);
|
|
}
|
|
|
|
|
|
sub PrintList
|
|
{
|
|
my ($list,$outfile) = @_;
|
|
|
|
# Print the items in the list
|
|
open( OUTFILE, ">$outfile");
|
|
$count=0;
|
|
for ($i=0; $i<@{$list};$i++) {
|
|
$item = lc $list->[$i];
|
|
print OUTFILE "$item\n";
|
|
$count++;
|
|
}
|
|
# print "$outfile has $count items\n";
|
|
close (OUTFILE);
|
|
}
|
|
|
|
sub PrintListWithHeader
|
|
{
|
|
my ($header,$list,$outfile) = @_;
|
|
|
|
# Print the items in the list
|
|
open( OUTFILE, ">$outfile");
|
|
|
|
for ($i=0; $i<@{$header};$i++) {
|
|
print OUTFILE "$header->[$i]\n";
|
|
}
|
|
$count=0;
|
|
for ($i=0; $i<@{$list};$i++) {
|
|
$item = lc $list->[$i];
|
|
print OUTFILE "$item\n";
|
|
$count++;
|
|
}
|
|
print "$outfile has $count items\n\n";
|
|
close (OUTFILE);
|
|
}
|
|
|
|
|
|
sub SourceDestDiff
|
|
{
|
|
my ( %params ) = @_;
|
|
my ( @file_list, @diff_list );
|
|
|
|
$file_name = @{$params{"a"}}[0];
|
|
|
|
#Open file and put it into an array
|
|
unless ( open( FHANDLE, $file_name) ) {
|
|
&LogMsg('err',"Unable to open $file_name\n");
|
|
}
|
|
|
|
@file_list = <FHANDLE>;
|
|
close (FHANDLE);
|
|
$i=0;
|
|
foreach $item (@file_list) {
|
|
$item =~ /(\S+),(\S+)/;
|
|
if ($1 ne $2) {
|
|
push @diff_list, $1;
|
|
}
|
|
}
|
|
return (@diff_list);
|
|
}
|
|
|
|
|
|
sub FileToList
|
|
{
|
|
|
|
my ( %params ) = @_;
|
|
my (@file_list, $path, @final_list);
|
|
|
|
$file_name = @{$params{"m"}}[0];
|
|
|
|
#Open file and put it into an array
|
|
unless ( open( FILENAME, $file_name) ) {
|
|
&LogMsg('err',"Unable to open $file_name\n");
|
|
}
|
|
|
|
@file_list = <FILENAME>;
|
|
close (FILENAME);
|
|
$i=0;
|
|
foreach $item (@file_list) {
|
|
chop $file_list[$i];
|
|
$i++;
|
|
}
|
|
|
|
# Put the path info in
|
|
if ( $params{"p"} ) {
|
|
|
|
# Look for the file in the search path
|
|
if ( $params{"x"} ) {
|
|
foreach $item (@file_list) {
|
|
$found = 0;
|
|
foreach $search (@{$params{"s"}}) {
|
|
if ( !$found && (-e "$search\\$item") ) {
|
|
$found = 1;
|
|
push @final_list, "<HASH>$search\\$item=$search\\$item";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Use the first search path as the path
|
|
else {
|
|
$path = @{$params{"s"}}[0];
|
|
foreach $item (@file_list) {
|
|
push @final_list, "<HASH>$path\\$item=$path\\$item";
|
|
}
|
|
}
|
|
return(@final_list);
|
|
}
|
|
else {
|
|
return (@file_list);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
sub LogFileInit
|
|
#+
|
|
# Initialize the log file
|
|
#
|
|
{
|
|
$ThisScript = "makelist";
|
|
$logfile=$ENV{"TMP"}."\\$ThisScript.log";
|
|
system("del $logfile");
|
|
}
|
|
|
|
|
|
sub MakeListFromDosnet
|
|
#+
|
|
# Accepts a dosnet.inf file and returns an array
|
|
# of all the files that occur under the [Files] sections
|
|
#
|
|
#-
|
|
{
|
|
my($FileName)=@_;
|
|
my(@dosnet,@return_array);
|
|
|
|
#Open Dosnet File and put it into an array
|
|
unless ( open( DOSNET, $FileName) ) {
|
|
&LogMsg('err',"Unable to open $FileName\n");
|
|
}
|
|
|
|
@dosnet = <DOSNET>;
|
|
close (DOSNET);
|
|
|
|
$found = 0;
|
|
foreach $item (@dosnet) {
|
|
# Search for [Files]
|
|
if ( $item =~ /\[Files\]/ ) {
|
|
&LogMsg('dbg', "Found \[Files\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
# Return the non-white space characters that occur
|
|
# after "d1,"
|
|
$item =~ /d\d,(\S+)/;
|
|
if ($1) {
|
|
$file_name = $1;
|
|
}
|
|
|
|
# Check for a comma after the file name and get everything
|
|
# before the comma
|
|
$file_name =~ /(\S+),/;
|
|
if ($1) {
|
|
$file_name=$1;
|
|
}
|
|
|
|
# If a file was found, put it in the hash
|
|
if ($file_name) {
|
|
push @return_array, lc $file_name;
|
|
}
|
|
}
|
|
}
|
|
return (@return_array);
|
|
}
|
|
|
|
sub MakeListFromMedia
|
|
#+
|
|
# Accepts a _media.inx file and returns an array
|
|
# of all the files that occur under the [Files] sections
|
|
#
|
|
#-
|
|
{
|
|
my($FileName)=@_;
|
|
my(@media,@return_array);
|
|
|
|
#Open _media File and put it into an array
|
|
unless ( open( MEDIA, $FileName) ) {
|
|
&LogMsg('err',"Unable to open $FileName\n");
|
|
}
|
|
|
|
@media = <MEDIA>;
|
|
close (MEDIA);
|
|
$found = 0;
|
|
foreach $item (@media) {
|
|
# Search for [SourceDisksFiles]
|
|
if ( $item =~ /\[SourceDisksFiles\]/ ) {
|
|
&LogMsg('dbg', "Found \[SourceDisksFiles\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
$file_name = $item;
|
|
|
|
# Check for an '=' after the file name and get everything
|
|
# before the '='
|
|
$file_name =~ /(\S+ +)=/;
|
|
if ($1) {
|
|
$file_name=$1;
|
|
}
|
|
$file_name =~ s/ //;
|
|
|
|
# If a file was found, put it in the hash
|
|
if ((length($file_name)>1)&&!($file_name =~ /^;/)) {
|
|
push @return_array, lc $file_name;
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach $item (@media) {
|
|
# Search for [SourceDisksFiles.x86]
|
|
if ( $item =~ /\[SourceDisksFiles.x86\]/ ) {
|
|
&LogMsg('dbg', "Found \[SourceDisksFiles.x86\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
$file_name = $item;
|
|
|
|
# Check for an '=' after the file name and get everything
|
|
# before the '='
|
|
$file_name =~ /(\S+ +)=/;
|
|
if ($1) {
|
|
$file_name=$1;
|
|
}
|
|
$file_name =~ s/ //;
|
|
|
|
# If a file was found, put it in the hash
|
|
if ((length($file_name)>1)&&!($file_name =~ /^;/)) {
|
|
push @return_array, lc $file_name;
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach $item (@media) {
|
|
# Search for [SourceDisksFiles.amd64]
|
|
if ( $item =~ /\[SourceDisksFiles.amd64\]/ ) {
|
|
&LogMsg('dbg', "Found \[SourceDisksFiles.amd64\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
$file_name = $item;
|
|
|
|
# Check for an '=' after the file name and get everything
|
|
# before the '='
|
|
$file_name =~ /(\S+ +)=/;
|
|
if ($1) {
|
|
$file_name=$1;
|
|
}
|
|
$file_name =~ s/ //;
|
|
|
|
# If a file was found, put it in the hash
|
|
if ((length($file_name)>1)&&!($file_name =~ /^;/)) {
|
|
push @return_array, lc $file_name;
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach $item (@media) {
|
|
# Search for [SourceDisksFiles.ia64]
|
|
if ( $item =~ /\[SourceDisksFiles.ia64\]/ ) {
|
|
&LogMsg('dbg', "Found \[SourceDisksFiles.ia64\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
$file_name = $item;
|
|
|
|
# Check for an '=' after the file name and get everything
|
|
# before the '='
|
|
$file_name =~ /(\S+ +)=/;
|
|
if ($1) {
|
|
$file_name=$1;
|
|
}
|
|
$file_name =~ s/ //;
|
|
|
|
# If a file was found, put it in the hash
|
|
if ((length($file_name)>1)&&!($file_name =~ /^;/)) {
|
|
push @return_array, lc $file_name;
|
|
}
|
|
}
|
|
}
|
|
|
|
return (@return_array);
|
|
}
|
|
|
|
sub MakeListFromExDosnet
|
|
#+
|
|
# Accepts an exdosnet.inf file and returns an array
|
|
# of all the files that occur under the [Files] sections
|
|
#
|
|
#-
|
|
{
|
|
my($FileName)=@_;
|
|
my(@exdosnet,@return_array);
|
|
|
|
#Open ExDosnet File and put it into an array
|
|
unless ( open( EXDOSNET, $FileName) ) {
|
|
&LogMsg('err',"Unable to open $FileName\n");
|
|
}
|
|
|
|
@exdosnet = <EXDOSNET>;
|
|
close (EXDOSNET);
|
|
|
|
$found = 0;
|
|
foreach $item (@exdosnet) {
|
|
# Search for [Files]
|
|
if ( $item =~ /\[Files\]/ ) {
|
|
&LogMsg('dbg', "Found \[Files\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
# Return the non-white space characters that occur
|
|
# after "d1,"
|
|
# $item =~ /d\d,(\S+)/;
|
|
# if ($1) {
|
|
# $file_name = $1;
|
|
# }
|
|
$file_name = $item;
|
|
chomp $file_name;
|
|
# printf("\$item='%s' \$file_name='%s'\n", $item, $file_name);
|
|
|
|
# Check for a comma after the file name and get everything
|
|
# before the comma
|
|
# $file_name =~ /(\S+),/;
|
|
# if ($1) {
|
|
# $file_name=$1;
|
|
# }
|
|
|
|
# If a file was found, put it in the hash
|
|
if ($file_name) {
|
|
push @return_array, lc $file_name; }
|
|
}
|
|
}
|
|
return (@return_array);
|
|
}
|
|
|
|
|
|
sub MakeListFromDrvindex
|
|
#+
|
|
# Accepts a drvindex.inf file and returns an array
|
|
# of all the files that occur under the [driver] sections
|
|
#
|
|
#-
|
|
{
|
|
my($FileName)=@_;
|
|
my(@dosnet,@return_array);
|
|
|
|
#Open Dosnet File and put it into an array
|
|
unless ( open( DOSNET, $FileName) ) {
|
|
&LogMsg('err',"Unable to open $FileName\n");
|
|
}
|
|
|
|
@dosnet = <DOSNET>;
|
|
close (DOSNET);
|
|
|
|
$found = 0;
|
|
foreach $item (@dosnet) {
|
|
# Search for [driver]
|
|
if ( $item =~ /\[driver\]/ ) {
|
|
&LogMsg('dbg', "Found \[driver\]");
|
|
$found = 1;
|
|
}
|
|
|
|
# Quit adding files to the list when a new section is encountered
|
|
elsif ( $found && ($item =~ /\[/ ) ) {
|
|
$found = 0;
|
|
}
|
|
|
|
elsif ( $found) {
|
|
|
|
undef($file_name);
|
|
|
|
# Return the non-white space characters that occur
|
|
$item =~ /(\S+)/;
|
|
if ($1) {
|
|
$file_name=$1;
|
|
}
|
|
|
|
# If a file was found, put it in the hash
|
|
if ($file_name) {
|
|
push @return_array, lc $file_name;
|
|
}
|
|
}
|
|
}
|
|
return (@return_array);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
# Sub(routine)s below
|
|
#
|
|
|
|
# Parse arguments passed to bincomp into %Parameters
|
|
sub GetArguments {
|
|
my(@ArgList)=@_;
|
|
|
|
my(%params,$arg,%flag_counts_possible,%flag_counts_actual);
|
|
|
|
# The flag_counts has tells how many arguments should follow
|
|
# each flag.
|
|
%flag_counts_possible=('a',1,'b',1,'c',1,'d',3,'h',1,'i','list','m',1,'n',1,'q',1,
|
|
'o',1, 'p',0,'r',1,'s','list','x',0, 'u','list');
|
|
%flag_counts_actual=('a',0,'b',0,'c',0,'d',0,'h',0,'i',0,'m',0,'n',0,'q',0,'o',0,
|
|
'p',0,'r',0,'s',0,'x',0,'u',0);
|
|
|
|
foreach $arg (@ArgList) {
|
|
|
|
# If this is a flag, set the flag variable, so
|
|
# next time through it will parse the correct
|
|
# argument
|
|
|
|
if( substr(lc($arg),0,1) eq "-") {
|
|
$flag=substr($arg,1,1);
|
|
if ($flag eq "?") {
|
|
&PrintUsage;
|
|
}
|
|
elsif (! exists $flag_counts_possible{$flag}) {
|
|
print "ERROR: $flag is an incorrect flag or switch\n";
|
|
&PrintUsage;
|
|
}
|
|
|
|
# Set the flag equal to one
|
|
elsif ( ( $flag_counts_possible{$flag} ne "list" ) &&
|
|
( $flag_counts_possible{$flag} == 0 ) ) {
|
|
push @{$params{$flag}}, 1;
|
|
}
|
|
}
|
|
elsif ( $flag_counts_possible{$flag} eq "list" ) {
|
|
push @{$params{$flag}}, $arg;
|
|
$flag_counts_actual{$flag}++;
|
|
}
|
|
elsif ( $flag_counts_actual{$flag} < $flag_counts_possible{$flag} ) {
|
|
push @{$params{$flag}}, $arg;
|
|
$flag_counts_actual{$flag}++;
|
|
}
|
|
else {
|
|
print "ERROR: Incorrect parameters\n";
|
|
&PrintUsage;
|
|
}
|
|
}
|
|
|
|
#&PrintParameters(%params);
|
|
return %params;
|
|
}
|
|
|
|
# Create Catalog header
|
|
sub GetHeader {
|
|
my($fname)=@_;
|
|
my(@HeadA);
|
|
|
|
push @HeadA, "[CatalogHeader]";
|
|
push @HeadA, "Name=$fname";
|
|
push @HeadA, "PublicVersion=0x0000001";
|
|
push @HeadA, "EncodingType=0x00010001";
|
|
push @HeadA, "CATATTR1=0x10010001:OSAttr:2:5.X";
|
|
push @HeadA, "";
|
|
push @HeadA, "[CatalogFiles]";
|
|
|
|
return @HeadA;
|
|
}
|
|
|
|
# --------------------------------------
|
|
# Print Usage info
|
|
# --------------------------------------
|
|
sub PrintUsage {
|
|
print <<EOT;
|
|
|
|
Usage: makelist -i lists -o outfile [-h catfile]
|
|
makelist -u lists -o outfile [-h catfile]
|
|
makelist -d list1 lists -o outfile [-h catfile]
|
|
makelist -n dosnetfile -o outfile [-h catfile]
|
|
makelist -q excdosntfile -o outfile [-h catfile]
|
|
makelist -r drvindexfile -o outfile [-h catfile]
|
|
makelist -c directory -o outfile [-h catfile]
|
|
|
|
-i lists Take the intersection of one or more lists
|
|
and print it to outfile. Each list is in
|
|
a file.
|
|
|
|
-u lists Take the union of one or more lists. Each list
|
|
is in a file.
|
|
|
|
-d list1 lists
|
|
Subtract lists from list 1 and print the
|
|
remaining elements to outfile
|
|
-n dosnetfile
|
|
Create a list from a dosnet.inf file
|
|
-q excdosntfile
|
|
Create a list from a excdosnt.inf file
|
|
-r drvindexfile
|
|
Create a list from a drvindex.inf file
|
|
-b mediafile
|
|
Create a list from media.inx file
|
|
-c directory
|
|
Create a list from a directory
|
|
|
|
-o outfile
|
|
Output file
|
|
-h catfile
|
|
Make this a CDF file for catfile (catfile will be
|
|
included in the header of the output file). This
|
|
will work on 5.X OS's.
|
|
|
|
makelist -m file -s search_paths [-px] -o outfile [-h catfile]
|
|
-h catfile
|
|
|
|
-m Create a list from a file
|
|
-o Output file
|
|
-p Put path info into the list
|
|
-s Search paths
|
|
-x Check the search paths
|
|
-h Put catalog header info in the file
|
|
|
|
makelist -a source_dest -o outfile
|
|
|
|
-a List in the format source,dest
|
|
-o Outputs source name for files whose source name is
|
|
not the same as the destination
|
|
|
|
EOT
|
|
exit;
|
|
}
|
|
|
|
# Output formatting/logging
|
|
sub LogMsg {
|
|
my($type,$msg) = @_;
|
|
my($fmsg);
|
|
|
|
$fmsg = $ThisScript."[".$type."]: ".$msg;
|
|
|
|
if( $type ne "dbg" ) {
|
|
system("echo $fmsg >> $logfile");
|
|
}
|
|
if( ($type ne "dbg") || $DBG ) {
|
|
print $fmsg."\n";
|
|
}
|
|
if($type eq "err") {
|
|
exit;
|
|
}
|
|
return;
|
|
}
|
|
|
|
# Print parameters
|
|
sub PrintParameters {
|
|
|
|
my(%params)=@_;
|
|
my($ar);
|
|
|
|
print "Printing input parameters\n";
|
|
|
|
foreach $item (keys %params) {
|
|
print "Flag $item : ";
|
|
$ar = \@{$params{$item}};
|
|
|
|
for ($i=0; $i< @{$ar}; $i++) {
|
|
print " $ar->[$i] ";
|
|
}
|
|
print "\n";
|
|
}
|
|
}
|