- Check for missing modules in modules.dat.
[wine] / tools / winapi_check / modules.pm
1 package modules;
2
3 use strict;
4
5 sub new {
6     my $proto = shift;
7     my $class = ref($proto) || $proto;
8     my $self  = {};
9     bless ($self, $class);
10
11     my $options = \${$self->{OPTIONS}};
12     my $output = \${$self->{OUTPUT}};
13     my $spec_files = \%{$self->{SPEC_FILES}};
14     my $modules = \%{$self->{MODULES}};
15
16     $$options = shift;
17     $$output = shift;
18     my $wine_dir = shift;
19     my $current_dir = shift;
20     my $file_type = shift;
21     my $module_file = shift;
22
23     $module_file =~ s/^\.\///;
24
25     my @all_spec_files = map {
26         s/^.\/(.*)$/$1/;
27         if(&$file_type($_) eq "library") {
28             $_;
29         } else {
30             ();
31         }
32     } split(/\n/, `find $wine_dir -name \\*.spec`);
33
34     my %all_spec_files;
35     foreach my $file (@all_spec_files) {
36         $all_spec_files{$file}++ ;
37     }
38
39     if($$options->progress) {
40         $$output->progress("$module_file");
41     }
42
43     my $allowed_dir;
44     my $spec_file;
45
46     open(IN, "< $module_file");
47     local $/ = "\n";
48     while(<IN>) {
49         s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
50         s/^(.*?)\s*#.*$/$1/;  # remove comments
51         /^$/ && next;         # skip empty lines
52
53         if(/^%\s+(.*?)$/) {
54             $spec_file = $1;
55             if($wine_dir eq ".") {
56                 $all_spec_files{$spec_file}--;
57             } else {
58                 $all_spec_files{"$wine_dir/$spec_file"}--;
59             }
60             $$spec_files{""}{$spec_file}++; # FIXME: Kludge
61             next;
62         } else {
63             $allowed_dir = $1;
64         }
65         $$spec_files{$allowed_dir}{$spec_file}++;
66
67         if(!-d "$wine_dir/$allowed_dir") {
68             $$output->write("$module_file: $spec_file: directory ($allowed_dir) doesn't exist or is no directory\n");
69         } 
70     }
71     close(IN);
72
73     foreach my $spec_file (sort(keys(%all_spec_files))) {
74         if($all_spec_files{$spec_file} > 0) {
75             $$output->write("$module_file: $spec_file: exists but is not specified\n");
76         }
77     }
78
79     return $self;
80 }
81
82 sub spec_file_module {
83     my $self = shift;
84
85     my $modules = \%{$self->{MODULES}};
86
87     my $spec_file = shift;
88     $spec_file =~ s/^\.\///;
89
90     my $module = shift;
91   
92     $$modules{$spec_file}{$module}++;
93 }
94
95 sub is_allowed_module_in_file {
96     my $self = shift;
97
98     my $spec_files = \%{$self->{SPEC_FILES}};
99     my $modules = \%{$self->{MODULES}};
100
101     my $module = shift;
102     my $file = shift;
103     $file =~ s/^\.\///;
104
105     my $dir = $file;
106     $dir =~ s/\/[^\/]*$//;
107
108     foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
109         if($$modules{$spec_file}{$module}) {
110             return 1;
111         }
112     }
113
114     return 0;
115 }
116
117 sub allowed_modules_in_file {
118     my $self = shift;
119
120     my $spec_files = \%{$self->{SPEC_FILES}};
121     my $modules = \%{$self->{MODULES}};
122
123     my $file = shift;
124     $file =~ s/^\.\///;
125
126     my $dir = $file;
127     $dir =~ s/\/[^\/]*$//;
128
129     my %allowed_modules = ();
130     foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
131         foreach my $module (sort(keys(%{$$modules{$spec_file}}))) {
132             $allowed_modules{$module}++;
133         }
134     }
135
136     return join(" & ", sort(keys(%allowed_modules)));
137 }
138
139 sub allowed_spec_files {
140     my $self = shift;
141
142     my $options = \${$self->{OPTIONS}};
143     my $output = \${$self->{OUTPUT}};
144     my $spec_files = \%{$self->{SPEC_FILES}};
145
146     my $wine_dir = shift;
147     my $current_dir = shift;
148
149     my @dirs = map {
150         s/^\.\/(.*)$/$1/;
151         if(/^\.$/) {
152             $current_dir;
153         } else {
154             if($current_dir ne ".") {
155                 "$current_dir/$_";
156             } else {
157                 $_;
158             }
159         }
160     } split(/\n/, `find . -type d ! -name CVS`);
161
162     my %allowed_spec_files = ();
163     foreach my $dir (sort(@dirs)) {
164         foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
165             $allowed_spec_files{$spec_file}++; 
166         }
167     }
168
169     return sort(keys(%allowed_spec_files));
170 }
171
172 1;
173
174