Merged msacm and msacm32 dlls.
[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            
56             if(!-f "$wine_dir/$spec_file") {
57                 $$output->write("$module_file: $spec_file: file ($spec_file) doesn't exist or is no file\n");
58             } 
59
60             if($wine_dir eq ".") {
61                 $all_spec_files{$spec_file}--;
62             } else {
63                 $all_spec_files{"$wine_dir/$spec_file"}--;
64             }
65             $$spec_files{""}{$spec_file}++; # FIXME: Kludge
66             next;
67         } else {
68             $allowed_dir = $1;
69         }
70         $$spec_files{$allowed_dir}{$spec_file}++;
71
72         if(!-d "$wine_dir/$allowed_dir") {
73             $$output->write("$module_file: $spec_file: directory ($allowed_dir) doesn't exist or is no directory\n");
74         } 
75     }
76     close(IN);
77
78     foreach my $spec_file (sort(keys(%all_spec_files))) {
79         if($all_spec_files{$spec_file} > 0) {
80             $$output->write("$module_file: $spec_file: exists but is not specified\n");
81         }
82     }
83
84     return $self;
85 }
86
87 sub spec_file_module {
88     my $self = shift;
89
90     my $modules = \%{$self->{MODULES}};
91
92     my $spec_file = shift;
93     $spec_file =~ s/^\.\///;
94
95     my $module = shift;
96   
97     $$modules{$spec_file}{$module}++;
98 }
99
100 sub is_allowed_module_in_file {
101     my $self = shift;
102
103     my $spec_files = \%{$self->{SPEC_FILES}};
104     my $modules = \%{$self->{MODULES}};
105
106     my $module = shift;
107     my $file = shift;
108     $file =~ s/^\.\///;
109
110     my $dir = $file;
111     $dir =~ s/\/[^\/]*$//;
112
113     foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
114         if($$modules{$spec_file}{$module}) {
115             return 1;
116         }
117     }
118
119     return 0;
120 }
121
122 sub allowed_modules_in_file {
123     my $self = shift;
124
125     my $spec_files = \%{$self->{SPEC_FILES}};
126     my $modules = \%{$self->{MODULES}};
127
128     my $file = shift;
129     $file =~ s/^\.\///;
130
131     my $dir = $file;
132     $dir =~ s/\/[^\/]*$//;
133
134     my %allowed_modules = ();
135     foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
136         foreach my $module (sort(keys(%{$$modules{$spec_file}}))) {
137             $allowed_modules{$module}++;
138         }
139     }
140
141     return join(" & ", sort(keys(%allowed_modules)));
142 }
143
144 sub allowed_spec_files {
145     my $self = shift;
146
147     my $options = \${$self->{OPTIONS}};
148     my $output = \${$self->{OUTPUT}};
149     my $spec_files = \%{$self->{SPEC_FILES}};
150
151     my $wine_dir = shift;
152     my $current_dir = shift;
153
154     my @dirs = map {
155         s/^\.\/(.*)$/$1/;
156         if(/^\.$/) {
157             $current_dir;
158         } else {
159             if($current_dir ne ".") {
160                 "$current_dir/$_";
161             } else {
162                 $_;
163             }
164         }
165     } split(/\n/, `find . -type d ! -name CVS`);
166
167     my %allowed_spec_files = ();
168     foreach my $dir (sort(@dirs)) {
169         foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
170             $allowed_spec_files{$spec_file}++; 
171         }
172     }
173
174     return sort(keys(%allowed_spec_files));
175 }
176
177 1;
178
179