Sweden-Number/tools/winapi_check/modules.pm

248 lines
5.4 KiB
Perl
Raw Normal View History

package modules;
use strict;
2001-07-13 00:22:05 +02:00
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw();
@EXPORT_OK = qw($modules);
use vars qw($modules);
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless ($self, $class);
my $options = \${$self->{OPTIONS}};
my $output = \${$self->{OUTPUT}};
2001-07-14 02:48:41 +02:00
my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
my $spec_file2dir = \%{$self->{SPEC_FILE2DIR}};
my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
$$options = shift;
$$output = shift;
my $wine_dir = shift;
my $current_dir = shift;
my $file_type = shift;
my $module_file = shift;
$module_file =~ s/^\.\///;
my @all_spec_files = map {
s/^.\/(.*)$/$1/;
2001-06-21 00:53:21 +02:00
if(&$file_type($_) eq "winelib") {
$_;
} else {
();
}
} split(/\n/, `find $wine_dir -name \\*.spec`);
my %all_spec_files;
foreach my $file (@all_spec_files) {
$all_spec_files{$file}++ ;
}
if($$options->progress) {
$$output->progress("modules.dat");
}
my $allowed_dir;
my $spec_file;
open(IN, "< $module_file");
local $/ = "\n";
while(<IN>) {
s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
s/^(.*?)\s*#.*$/$1/; # remove comments
/^$/ && next; # skip empty lines
if(/^%\s+(.*?)$/) {
$spec_file = $1;
if(!-f "$wine_dir/$spec_file") {
$$output->write("modules.dat: $spec_file: file ($spec_file) doesn't exist or is no file\n");
}
if($wine_dir eq ".") {
$all_spec_files{$spec_file}--;
} else {
$all_spec_files{"$wine_dir/$spec_file"}--;
}
2001-07-14 02:48:41 +02:00
$$dir2spec_file{""}{$spec_file}++; # FIXME: Kludge
next;
} else {
$allowed_dir = $1;
2001-07-14 02:48:41 +02:00
$$spec_file2dir{$spec_file}{$allowed_dir}++;
}
2001-07-14 02:48:41 +02:00
$$dir2spec_file{$allowed_dir}{$spec_file}++;
if(!-d "$wine_dir/$allowed_dir") {
$$output->write("modules.dat: $spec_file: directory ($allowed_dir) doesn't exist or is no directory\n");
}
}
close(IN);
foreach my $spec_file (sort(keys(%all_spec_files))) {
if($all_spec_files{$spec_file} > 0) {
$$output->write("modules.dat: $spec_file: exists but is not specified\n");
}
}
2001-07-13 00:22:05 +02:00
$modules = $self;
return $self;
}
2001-07-14 02:48:41 +02:00
sub all_modules {
my $self = shift;
my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
return sort(keys(%$module2spec_file));
}
sub spec_file_module {
my $self = shift;
my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
my $spec_file = shift;
$spec_file =~ s/^\.\///;
my $module = shift;
2001-07-14 02:48:41 +02:00
$$spec_file2module{$spec_file} = $module;
$$module2spec_file{$module} = $spec_file;
}
sub is_allowed_module_in_file {
my $self = shift;
2001-07-14 02:48:41 +02:00
my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
my $module = shift;
my $file = shift;
$file =~ s/^\.\///;
my $dir = $file;
$dir =~ s/\/[^\/]*$//;
2001-07-14 02:48:41 +02:00
foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
if($$spec_file2module{$spec_file} eq $module) {
return 1;
}
}
return 0;
}
sub allowed_modules_in_file {
my $self = shift;
2001-07-14 02:48:41 +02:00
my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
my $file = shift;
$file =~ s/^\.\///;
my $dir = $file;
$dir =~ s/\/[^\/]*$//;
my %allowed_modules = ();
2001-07-14 02:48:41 +02:00
foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
my $module = $$spec_file2module{$spec_file};
$allowed_modules{$module}++;
}
return join(" & ", sort(keys(%allowed_modules)));
}
2001-07-14 02:48:41 +02:00
sub allowed_dirs_for_module {
my $self = shift;
my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
my $spec_file2dir = \%{$self->{SPEC_FILE2DIR}};
my $module = shift;
my $spec_file = $$module2spec_file{$module};
return sort(keys(%{$$spec_file2dir{$spec_file}}));
}
sub allowed_spec_files {
my $self = shift;
my $options = \${$self->{OPTIONS}};
my $output = \${$self->{OUTPUT}};
2001-07-14 02:48:41 +02:00
my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
my $wine_dir = shift;
my $current_dir = shift;
my @dirs = map {
s/^\.\/(.*)$/$1/;
if(/^\.$/) {
$current_dir;
} else {
if($current_dir ne ".") {
"$current_dir/$_";
} else {
$_;
}
}
} split(/\n/, `find . -type d ! -name CVS`);
my %allowed_spec_files = ();
foreach my $dir (sort(@dirs)) {
2001-07-14 02:48:41 +02:00
foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
$allowed_spec_files{$spec_file}++;
}
}
return sort(keys(%allowed_spec_files));
}
sub found_module_in_dir {
my $self = shift;
my $module = shift;
my $dir = shift;
my $used_module_dirs = \%{$self->{USED_MODULE_DIRS}};
$$used_module_dirs{$module}{$dir}++;
}
sub global_report {
my $self = shift;
my $output = \${$self->{OUTPUT}};
2001-07-14 02:48:41 +02:00
my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
my $used_module_dirs = \%{$self->{USED_MODULE_DIRS}};
my @messages;
2001-07-14 02:48:41 +02:00
foreach my $dir (sort(keys(%$dir2spec_file))) {
if($dir eq "") { next; }
2001-07-14 02:48:41 +02:00
foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
my $module = $$spec_file2module{$spec_file};
if(!$$used_module_dirs{$module}{$dir}) {
push @messages, "modules.dat: $spec_file: directory ($dir) is not used\n";
}
}
}
foreach my $message (sort(@messages)) {
$$output->write($message);
}
}
1;