Fixed GetDeviceState and GetDeviceData to use only exported APIs.
[wine] / tools / winapi_check / nativeapi.pm
1 package nativeapi;
2
3 use strict;
4
5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6 require Exporter;
7
8 @ISA = qw(Exporter);
9 @EXPORT = qw();
10 @EXPORT_OK = qw($nativeapi);
11
12 use vars qw($nativeapi);
13
14 use config qw(&file_type $current_dir $wine_dir $winapi_check_dir);
15 use options qw($options);
16 use output qw($output);
17
18 $nativeapi = 'nativeapi'->new;
19
20 sub new {
21     my $proto = shift;
22     my $class = ref($proto) || $proto;
23     my $self  = {};
24     bless ($self, $class);
25
26     my $functions = \%{$self->{FUNCTIONS}};
27     my $conditionals = \%{$self->{CONDITIONALS}};
28     my $conditional_headers = \%{$self->{CONDITIONAL_HEADERS}};
29     my $conditional_functions = \%{$self->{CONDITIONAL_FUNCTIONS}};
30
31     my $api_file = "$winapi_check_dir/nativeapi.dat";
32     my $configure_in_file = "$wine_dir/configure.in";
33     my $config_h_in_file = "$wine_dir/include/config.h.in";
34
35     $api_file =~ s/^\.\///;
36     $configure_in_file =~ s/^\.\///;
37     $config_h_in_file =~ s/^\.\///;
38
39     $output->progress("$api_file");
40
41     open(IN, "< $api_file");
42     local $/ = "\n";
43     while(<IN>) {
44         s/^\s*(.*?)\s*$/$1/; # remove whitespace at begin and end of line
45         s/^(.*?)\s*#.*$/$1/; # remove comments
46         /^$/ && next;        # skip empty lines   
47
48         $$functions{$_}++;
49     }
50     close(IN);
51
52     $output->progress("$configure_in_file");
53
54     my $again = 0;
55     open(IN, "< $configure_in_file");   
56     local $/ = "\n";
57     while($again || (defined($_ = <IN>))) {
58         $again = 0;
59         chomp;
60         if(/^(.*?)\\$/) {
61             my $current = $1;
62             my $next = <IN>;
63             if(defined($next)) {
64                 # remove trailing whitespace
65                 $current =~ s/\s+$//;
66
67                 # remove leading whitespace
68                 $next =~ s/^\s+//;
69
70                 $_ = $current . " " . $next;
71
72                 $again = 1;
73                 next;
74             }
75         }
76
77         # remove leading and trailing whitespace
78         s/^\s*(.*?)\s*$/$1/;
79
80         # skip emty lines
81         if(/^$/) { next; }
82
83         # skip comments
84         if(/^dnl/) { next; }
85
86         if(/^AC_CHECK_HEADERS\(\s*([^,\)]*)(?:,|\))?/) {
87             foreach my $name (split(/\s+/, $1)) {
88                 $$conditional_headers{$name}++;
89             }
90         } elsif(/^AC_CHECK_FUNCS\(\s*([^,\)]*)(?:,|\))?/) {
91             foreach my $name (split(/\s+/, $1)) {
92                 $$conditional_functions{$name}++;
93             }
94         } elsif(/^AC_FUNC_ALLOCA/) {
95             $$conditional_headers{"alloca.h"}++;
96         }
97
98     }
99     close(IN);
100
101     $output->progress("$config_h_in_file");
102
103     open(IN, "< $config_h_in_file");
104     local $/ = "\n";
105     while(<IN>) {
106         # remove leading and trailing whitespace
107         s/^\s*(.*?)\s*$/$1/;
108
109         # skip emty lines
110         if(/^$/) { next; }
111
112         if(/^\#undef\s+(\S+)$/) {
113             $$conditionals{$1}++;
114         }
115     }
116     close(IN);
117
118     $nativeapi = $self;
119
120     return $self;
121 }
122
123 sub is_function {
124     my $self = shift;
125     my $functions = \%{$self->{FUNCTIONS}};
126
127     my $name = shift;
128
129     return $$functions{$name};
130 }
131
132 sub is_conditional {
133     my $self = shift;
134     my $conditionals = \%{$self->{CONDITIONALS}};
135
136     my $name = shift;
137
138     return $$conditionals{$name};
139 }
140
141 sub found_conditional {
142     my $self = shift;
143     my $conditional_found = \%{$self->{CONDITIONAL_FOUND}};
144
145     my $name = shift;
146
147     $$conditional_found{$name}++;
148 }
149
150 sub is_conditional_header {
151     my $self = shift;
152     my $conditional_headers = \%{$self->{CONDITIONAL_HEADERS}};
153
154     my $name = shift;
155
156     return $$conditional_headers{$name};
157 }
158
159 sub is_conditional_function {
160     my $self = shift;
161     my $conditional_functions = \%{$self->{CONDITIONAL_FUNCTIONS}};
162
163     my $name = shift;
164
165     return $$conditional_functions{$name};
166 }
167
168 sub global_report {
169     my $self = shift;
170
171     my $output = \${$self->{OUTPUT}};
172     my $conditional_found = \%{$self->{CONDITIONAL_FOUND}};
173     my $conditionals = \%{$self->{CONDITIONALS}};
174
175     my @messages;
176     foreach my $name (sort(keys(%$conditionals))) {
177         if($name =~ /^const|inline|size_t$/) { next; }
178
179         if(0 && !$$conditional_found{$name}) {
180             push @messages, "config.h.in: conditional $name not used\n";
181         }
182     }
183
184     foreach my $message (sort(@messages)) {
185         $output->write($message);
186     }
187 }
188
189 1;