- Updated API files.
[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 $module_file = shift;
21
22     $module_file =~ s/^\.\///;
23
24     if($$options->progress) {
25         $$output->progress("$module_file");
26     }
27
28     my $allowed_dir;
29     my $spec_file;
30
31     open(IN, "< $module_file");
32     local $/ = "\n";
33     while(<IN>) {
34         s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
35         s/^(.*?)\s*#.*$/$1/;  # remove comments
36         /^$/ && next;         # skip empty lines
37
38         if(/^%\s+(.*?)$/) {
39             $spec_file = $1;
40             next;
41         } else {
42             $allowed_dir = $1;
43         }
44         $$spec_files{$allowed_dir}{$spec_file}++;
45
46         if(!-d "$wine_dir/$allowed_dir") {
47             $$output->write("$module_file: $spec_file: directory ($allowed_dir) doesn't exist or is no directory\n");
48         } 
49     }
50     close(IN);
51
52     return $self;
53 }
54
55 sub spec_file_module {
56     my $self = shift;
57
58     my $modules = \%{$self->{MODULES}};
59
60     my $spec_file = shift;
61     $spec_file =~ s/^\.\///;
62
63     my $module = shift;
64   
65     $$modules{$spec_file}{$module}++;
66 }
67
68 sub is_allowed_module_in_file {
69     my $self = shift;
70
71     my $spec_files = \%{$self->{SPEC_FILES}};
72     my $modules = \%{$self->{MODULES}};
73
74     my $module = shift;
75     my $file = shift;
76     $file =~ s/^\.\///;
77
78     my $dir = $file;
79     $dir =~ s/\/[^\/]*$//;
80
81     foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
82         if($$modules{$spec_file}{$module}) {
83             return 1;
84         }
85     }
86
87     return 0;
88 }
89
90 sub allowed_modules_in_file {
91     my $self = shift;
92
93     my $spec_files = \%{$self->{SPEC_FILES}};
94     my $modules = \%{$self->{MODULES}};
95
96     my $file = shift;
97     $file =~ s/^\.\///;
98
99     my $dir = $file;
100     $dir =~ s/\/[^\/]*$//;
101
102     my %allowed_modules = ();
103     foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
104         foreach my $module (sort(keys(%{$$modules{$spec_file}}))) {
105             $allowed_modules{$module}++;
106         }
107     }
108
109     return join(" & ", sort(keys(%allowed_modules)));
110 }
111
112 sub allowed_spec_files {
113     my $self = shift;
114
115     my $options = \${$self->{OPTIONS}};
116     my $output = \${$self->{OUTPUT}};
117     my $spec_files = \%{$self->{SPEC_FILES}};
118
119     my $wine_dir = shift;
120     my $current_dir = shift;
121
122     my @dirs = map {
123         s/^\.\/(.*)$/$1/;
124         if(/^\.$/) {
125             $current_dir;
126         } else {
127             if($current_dir ne ".") {
128                 "$current_dir/$_";
129             } else {
130                 $_;
131             }
132         }
133     } split(/\n/, `find . -type d ! -name CVS`);
134
135     my %allowed_spec_files = ();
136     foreach my $dir (sort(@dirs)) {
137         foreach my $spec_file (sort(keys(%{$$spec_files{$dir}}))) {
138             $allowed_spec_files{$spec_file}++; 
139         }
140     }
141
142     return sort(keys(%allowed_spec_files));
143 }
144
145 1;
146
147