Several additions and bug fixes.
diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup
index e10ba0f..3b214d8 100755
--- a/tools/winapi/winapi_fixup
+++ b/tools/winapi/winapi_fixup
@@ -117,7 +117,17 @@
$output->prefix("$file: " . $function->prefix);
- my @module_ordinal_entries = $function->get_all_module_ordinal;
+ my @module_ordinal_entries = ();
+ foreach my $entry2 ($function->get_all_module_ordinal) {
+ (my $external_name2, my $module2, my $ordinal2) = @$entry2;
+ if(($external_name2 eq "@" ||
+ ($win16api->is_module($module2) && !$win16api->is_function_stub_in_module($module2, $external_name2)) ||
+ ($win32api->is_module($module2) && !$win32api->is_function_stub_in_module($module2, $external_name2))) &&
+ $modules->is_allowed_module_in_file($module2, "$current_dir/$file"))
+ {
+ push @module_ordinal_entries, $entry2;
+ }
+ }
my $spec_modified = 0;
@@ -398,7 +408,7 @@
my $found = 0;
foreach my $entry2 (@module_ordinal_entries) {
(my $external_name2, my $module2, my $ordinal2) = @$entry2;
-
+
if($external_name eq $external_name2 &&
lc($module) eq $module2 &&
$ordinal eq $ordinal2)
diff --git a/tools/winapi_check/modules.dat b/tools/winapi_check/modules.dat
index d440e8f..fdbb405 100644
--- a/tools/winapi_check/modules.dat
+++ b/tools/winapi_check/modules.dat
@@ -98,8 +98,6 @@
% dlls/kernel/kernel.spec
dlls/kernel
-dlls/shell32
-dlls/win32s
files
loader/ne
loader
@@ -187,7 +185,6 @@
% dlls/ntdll/ntdll.spec
dlls/ntdll
-memory
misc
scheduler
@@ -303,7 +300,6 @@
% dlls/shell32/shell32.spec
dlls/shell32
-memory
% dlls/shdocvw/shdocvw.spec
@@ -377,7 +373,6 @@
% dlls/win32s/w32sys.spec
-dlls/kernel
dlls/win32s
% dlls/win32s/win32s16.spec
diff --git a/tools/winapi_check/modules.pm b/tools/winapi_check/modules.pm
index c4ae86f..25f109e 100644
--- a/tools/winapi_check/modules.pm
+++ b/tools/winapi_check/modules.pm
@@ -2,6 +2,15 @@
use strict;
+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;
@@ -81,6 +90,8 @@
}
}
+ $modules = $self;
+
return $self;
}
diff --git a/tools/winapi_check/win32/rasapi32.api b/tools/winapi_check/win32/rasapi32.api
index ef38a61..75cec6d 100644
--- a/tools/winapi_check/win32/rasapi32.api
+++ b/tools/winapi_check/win32/rasapi32.api
@@ -1,17 +1,29 @@
%long
+BOOL
DWORD
HRASCONN
%ptr
LPBOOL
+LPCSTR *
+LPCWSTR *
LPDWORD
+LPRASAUTODIALENTRYA
+LPRASAUTODIALENTRYW
LPRASCONNA
+LPRASDEVINFOA
+LPRASDEVINFOW
LPRASDIALPARAMSA
LPRASENTRYNAMEA
+LPVOID
%str
LPCSTR
+%wstr
+
+LPCWSTR
+
diff --git a/tools/winapi_check/win32/rpcrt4.api b/tools/winapi_check/win32/rpcrt4.api
index 05ae1f3..57223ad 100644
--- a/tools/winapi_check/win32/rpcrt4.api
+++ b/tools/winapi_check/win32/rpcrt4.api
@@ -2,11 +2,30 @@
HMODULE
HRESULT
+RPC_IF_HANDLE
RPC_STATUS
+UINT
+ULONG
%ptr
CLSID *
+LPSTR *
+LPVOID
+LPWSTR *
+PRPC_POLICY
+RPC_AUTH_KEY_RETRIEVAL_FN
+RPC_BINDING_HANDLE *
+RPC_IF_CALLBACK_FN *
+RPC_MGR_EPV *
UUID *
unsigned char **
-void **
\ No newline at end of file
+void **
+
+%str
+
+LPSTR
+
+%wstr
+
+LPWSTR
diff --git a/tools/winapi_check/win32/ws2_32.api b/tools/winapi_check/win32/ws2_32.api
index 1005731..8b747f5 100644
--- a/tools/winapi_check/win32/ws2_32.api
+++ b/tools/winapi_check/win32/ws2_32.api
@@ -23,6 +23,7 @@
FARPROC
INT *
LPDWORD
+LPINT
LPVOID
LPWSABUF
LPWSADATA
diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm
index 87657b0..ec47a45 100644
--- a/tools/winapi_check/winapi.pm
+++ b/tools/winapi_check/winapi.pm
@@ -226,9 +226,10 @@
for my $internal_name ($win32api->all_internal_functions) {
my $module16 = $win16api->function_internal_module($internal_name);
+ my $module32 = $win16api->function_internal_module($internal_name);
if(defined($module16) &&
- !$win16api->function_stub($internal_name) &&
- !$win32api->function_stub($internal_name))
+ !$win16api->is_function_stub_in_module($module16, $internal_name) &&
+ !$win32api->is_function_stub_in_module($module32, $internal_name))
{
$win16api->found_shared_internal_function($internal_name);
$win32api->found_shared_internal_function($internal_name);
@@ -248,7 +249,7 @@
my $win32api = shift;
my @files = map {
- s%^\./%%;
+ s%^$wine_dir/%%;
if(&$file_type($_) eq "winelib") {
$_;
} else {
@@ -403,7 +404,7 @@
$internal_name = $external_name;
}
- $$function_stub{$external_name} = 1;
+ $$function_stub{$module}{$external_name} = 1;
if(!$$function_internal_name{$external_name}) {
$$function_internal_name{$external_name} = $internal_name;
} else {
@@ -691,8 +692,22 @@
sub all_functions_stub {
my $self = shift;
my $function_stub = \%{$self->{FUNCTION_STUB}};
+ my $modules = \%{$self->{MODULES}};
- return sort(keys(%$function_stub));
+ my @stubs = ();
+ foreach my $module (keys(%$modules)) {
+ push @stubs, keys(%{$$function_stub{$module}});
+ }
+ return sort(@stubs);
+}
+
+sub all_functions_stub_in_module {
+ my $self = shift;
+ my $function_stub = \%{$self->{FUNCTION_STUB}};
+
+ my $module = shift;
+
+ return sort(keys(%{$$function_stub{$module}}));
}
sub all_internal_functions_found {
@@ -826,13 +841,31 @@
return $$function_external_module{$name};
}
-sub function_stub {
+sub is_function_stub {
+ my $self = shift;
+ my $function_stub = \%{$self->{FUNCTION_STUB}};
+ my $modules = \%{$self->{MODULES}};
+
+ my $module = shift;
+ my $name = shift;
+
+ foreach my $module (keys(%$modules)) {
+ if($$function_stub{$module}{$name}) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+sub is_function_stub_in_module {
my $self = shift;
my $function_stub = \%{$self->{FUNCTION_STUB}};
+ my $module = shift;
my $name = shift;
- return $$function_stub{$name};
+ return $$function_stub{$module}{$name};
}
sub found_internal_function {
diff --git a/tools/winapi_check/winapi_check b/tools/winapi_check/winapi_check
index 6c7f512..dfa13e2 100755
--- a/tools/winapi_check/winapi_check
+++ b/tools/winapi_check/winapi_check
@@ -276,23 +276,29 @@
{
if($options->win16 && $options->report_module($module16))
{
- if($file ne "library/port.c" &&
+ if($file ne "library/port.c" &&
!$nativeapi->is_function($internal_name) &&
- !$win16api->function_stub($internal_name) &&
!is_subset($module16, $file_module16))
{
- $output->write("is misplaced\n");
+ foreach my $module16 (split(/\s*&\s*/, $module16)) {
+ if(!$win16api->is_function_stub($module16, $internal_name)) {
+ $output->write("is misplaced ($module16)\n");
+ }
+ }
}
}
if($options->win32 && $options->report_module($module32))
{
- if($file ne "library/port.c" &&
+ if($file ne "library/port.c" &&
!$nativeapi->is_function($internal_name) &&
- !$win32api->function_stub($internal_name) &&
!is_subset($module32, $file_module32))
{
- $output->write("is misplaced\n");
+ foreach my $module32 (split(/\s*&\s*/, $module32)) {
+ if(!$win32api->is_function_stub($module32, $internal_name)) {
+ $output->write("is misplaced ($module32)\n");
+ }
+ }
}
}
}
@@ -351,7 +357,7 @@
(defined($module16) || defined($module32)) &&
$linkage ne "extern" && defined($statements))
{
- winapi_documentation::check_documentation $options, $output, $win16api, $win32api, $function;
+ winapi_documentation::check_documentation $options, $output, $win16api, $win32api, $modules, $function;
}
$output->prefix("");
}
diff --git a/tools/winapi_check/winapi_documentation.pm b/tools/winapi_check/winapi_documentation.pm
index c28560c..78abc2b 100644
--- a/tools/winapi_check/winapi_documentation.pm
+++ b/tools/winapi_check/winapi_documentation.pm
@@ -2,6 +2,8 @@
use strict;
+use config qw($current_dir $wine_dir);
+
my %comment_width;
my %comment_indent;
my %comment_spacing;
@@ -13,13 +15,17 @@
my $output = shift;
my $win16api = shift;
my $win32api = shift;
+ my $modules = shift;
my $function = shift;
- my $module16 = $function->module16;
- my $module32 = $function->module32;
+ my $file = $function->file;
my $external_name16 = $function->external_name16;
my $external_name32 = $function->external_name32;
my $internal_name = $function->internal_name;
+ my $module16 = $function->module16;
+ my $module32 = $function->module32;
+ my $ordinal16 = $function->ordinal16;
+ my $ordinal32 = $function->ordinal32;
my $documentation = $function->documentation;
my $documentation_line = $function->documentation_line;
my @argument_documentations = @{$function->argument_documentations};
@@ -33,16 +39,18 @@
my @winapis = ($win16api, $win32api);
my @modules = ($module16, $module32);
my @external_names = ($external_name16, $external_name32);
+ my @ordinals = ($ordinal16, $ordinal32);
while(
defined(my $winapi = shift @winapis) &&
defined(my $external_name = shift @external_names) &&
- defined(my $module = shift @modules))
+ defined(my $module = shift @modules) &&
+ defined(my $ordinal = shift @ordinals))
{
- if($winapi->function_stub($internal_name)) { next; }
+ if($winapi->is_function_stub_in_module($module, $internal_name)) { next; }
my @external_name = split(/\s*\&\s*/, $external_name);
my @modules = split(/\s*\&\s*/, $module);
- my @ordinals = split(/\s*\&\s*/, $winapi->function_internal_ordinal($internal_name));
+ my @ordinals = split(/\s*\&\s*/, $ordinal);
my $pedantic_failed = 0;
while(defined(my $external_name = shift @external_name) &&
@@ -98,10 +106,14 @@
my $found = 0;
foreach my $entry2 (winapi::get_all_module_internal_ordinal($internal_name)) {
(my $external_name2, my $module2, my $ordinal2) = @$entry2;
-
+
if($external_name eq $external_name2 &&
lc($module) eq $module2 &&
- $ordinal eq $ordinal2)
+ $ordinal eq $ordinal2 &&
+ ($external_name2 eq "@" ||
+ ($win16api->is_module($module2) && !$win16api->is_function_stub_in_module($module2, $external_name2)) ||
+ ($win32api->is_module($module2) && !$win32api->is_function_stub_in_module($module2, $external_name2))) &&
+ $modules->is_allowed_module_in_file($module2, "$current_dir/$file"))
{
$found = 1;
}
diff --git a/tools/winapi_check/winapi_function.pm b/tools/winapi_check/winapi_function.pm
index 37c73e8..ed334ae 100644
--- a/tools/winapi_check/winapi_function.pm
+++ b/tools/winapi_check/winapi_function.pm
@@ -3,6 +3,8 @@
use strict;
+use config qw($current_dir $wine_dir);
+use modules qw($modules);
use util qw(&normalize_set);
use winapi qw($win16api $win32api @winapis);
@@ -20,123 +22,174 @@
}
########################################################################
-# winapi
+# external_name
#
-sub external_name16 {
+sub _external_name {
my $self = shift;
+ my $winapi = shift;
+
+ my $file = $self->file;
my $internal_name = $self->internal_name;
- return $win16api->function_external_name($internal_name);
+ my $external_name = $winapi->function_external_name($internal_name);
+ my $module = $winapi->function_internal_module($internal_name);
+
+ if(!defined($external_name) && !defined($module)) {
+ return undef;
+ }
+
+ my @external_names = split(/\s*&\s*/, $external_name);
+ my @modules = split(/\s*&\s*/, $module);
+
+ my @external_names2;
+ while(defined(my $external_name = shift @external_names) &&
+ defined(my $module = shift @modules))
+ {
+ if($modules->is_allowed_module_in_file($module, "$current_dir/$file")) {
+ push @external_names2, $external_name;
+ }
+ }
+
+ return join(" & ", @external_names2);
}
-sub external_names16 {
+sub _external_names {
my $self = shift;
- my $external_name16 = $self->external_name16;
+ my $winapi = shift;
+
+ my $external_name = $self->_external_name($winapi);
- if(defined($external_name16)) {
- return split(/\s*&\s*/, $external_name16);
+ if(defined($external_name)) {
+ return split(/\s*&\s*/, $external_name);
} else {
return ();
}
}
-sub external_name32 {
+sub external_name16 { my $self = shift; return $self->_external_name($win16api, @_); }
+sub external_name32{ my $self = shift; return $self->_external_name($win32api, @_); }
+
+sub external_names16 { my $self = shift; return $self->_external_names($win16api, @_); }
+sub external_names32 { my $self = shift; return $self->_external_names($win32api, @_); }
+
+sub external_names { my $self = shift; return ($self->external_names16,$self->external_names32); }
+
+########################################################################
+# module
+#
+
+sub _module {
my $self = shift;
+ my $winapi = shift;
+
+ my $file = $self->file;
my $internal_name = $self->internal_name;
- return $win32api->function_external_name($internal_name);
-}
-
-sub external_names32 {
- my $self = shift;
- my $external_name32 = $self->external_name32;
-
- if(defined($external_name32)) {
- return split(/\s*&\s*/, $external_name32);
- } else {
- return ();
+ my $module = $winapi->function_internal_module($internal_name);
+ if(!defined($module)) {
+ return undef;
}
-}
-
-sub external_names {
- my $self = shift;
-
- my @external_names;
- push @external_names, $self->external_names16;
- push @external_names, $self->external_names32;
-
- return @external_names;
-}
-
-sub module16 {
- my $self = shift;
- my $internal_name = $self->internal_name;
-
- return $win16api->function_internal_module($internal_name);
-}
-
-sub modules16 {
- my $self = shift;
- my $module16 = $self->module16;
-
- if(defined($module16)) {
- return split(/\s*&\s*/, $module16);
- } else {
- return ();
- }
-}
-
-sub module32 {
- my $self = shift;
- my $internal_name = $self->internal_name;
-
- return $win32api->function_internal_module($internal_name);
-}
-
-sub modules32 {
- my $self = shift;
- my $module32 = $self->module32;
-
- if(defined($module32)) {
- return split(/\s*&\s*/, $module32);
- } else {
- return ();
- }
-}
-
-sub module {
- my $self = shift;
- my $module16 = $self->module16;
- my $module32 = $self->module32;
-
- my $module;
- if(defined($module16) && defined($module32)) {
- $module = "$module16 & $module32";
- } elsif(defined($module16)) {
- $module = $module16;
- } elsif(defined($module32)) {
- $module = $module32;
- } else {
- $module = "";
- }
-}
-
-sub modules {
- my $self = shift;
my @modules;
- push @modules, $self->modules16;
- push @modules, $self->modules32;
+ foreach my $module (split(/\s*&\s*/, $module)) {
+ if($modules->is_allowed_module_in_file($module, "$current_dir/$file")) {
+ push @modules, $module;
+ }
+ }
- return @modules;
+ return join(" & ", @modules);
}
+sub _modules {
+ my $self = shift;
+ my $winapi = shift;
+
+ my $module = $self->_module($winapi);
+
+ if(defined($module)) {
+ return split(/\s*&\s*/, $module);
+ } else {
+ return ();
+ }
+}
+
+sub module16 { my $self = shift; return $self->_module($win16api, @_); }
+sub module32 { my $self = shift; return $self->_module($win32api, @_); }
+
+sub module { my $self = shift; return join (" & ", $self->modules); }
+
+sub modules16 { my $self = shift; return $self->_modules($win16api, @_); }
+sub modules32 { my $self = shift; return $self->_modules($win32api, @_); }
+
+sub modules { my $self = shift; return ($self->modules16, $self->modules32); }
+
+########################################################################
+# ordinal
+#
+
+sub _ordinal {
+ my $self = shift;
+ my $winapi = shift;
+
+ my $file = $self->file;
+ my $internal_name = $self->internal_name;
+
+ my $ordinal = $winapi->function_internal_ordinal($internal_name);
+ my $module = $winapi->function_internal_module($internal_name);
+
+ if(!defined($ordinal) && !defined($module)) {
+ return undef;
+ }
+
+ my @ordinals = split(/\s*&\s*/, $ordinal);
+ my @modules = split(/\s*&\s*/, $module);
+
+ my @ordinals2;
+ while(defined(my $ordinal = shift @ordinals) &&
+ defined(my $module = shift @modules))
+ {
+ if($modules->is_allowed_module_in_file($module, "$current_dir/$file")) {
+ push @ordinals2, $ordinal;
+ }
+ }
+
+ return join(" & ", @ordinals2);
+}
+
+sub _ordinals {
+ my $self = shift;
+ my $winapi = shift;
+
+ my $ordinal = $self->_ordinal($winapi);
+
+ if(defined($ordinal)) {
+ return split(/\s*&\s*/, $ordinal);
+ } else {
+ return ();
+ }
+}
+
+sub ordinal16 { my $self = shift; return $self->_ordinal($win16api, @_); }
+sub ordinal32 { my $self = shift; return $self->_ordinal($win32api, @_); }
+
+sub ordinal { my $self = shift; return join (" & ", $self->ordinals); }
+
+sub ordinals16 { my $self = shift; return $self->_ordinals($win16api, @_); }
+sub ordinals32 { my $self = shift; return $self->_ordinals($win32api, @_); }
+
+sub ordinals { my $self = shift; return ($self->ordinals16, $self->ordinals32); }
+
+########################################################################
+# prefix
+#
+
sub prefix {
my $self = shift;
my $module16 = $self->module16;
my $module32 = $self->module32;
+ my $file = $self->file;
my $return_type = $self->return_type;
my $internal_name = $self->internal_name;
my $calling_convention = $self->calling_convention;
@@ -147,12 +200,17 @@
}
my $prefix = "";
- if(defined($module16) && !defined($module32)) {
- $prefix .= normalize_set($module16) . ": ";
- } elsif(!defined($module16) && defined($module32)) {
- $prefix .= normalize_set($module32) . ": ";
- } elsif(defined($module16) && defined($module32)) {
- $prefix .= normalize_set($module16) . " & " . normalize_set($module32) . ": ";
+
+ my @modules = ();
+ my %used;
+ foreach my $module ($self->modules) {
+ if($used{$module}) { next; }
+ push @modules, $module;
+ $used{$module}++;
+ }
+ $prefix .= "$file: ";
+ if($#modules >= 0) {
+ $prefix .= join(" & ", @modules) . ": ";
} else {
$prefix .= "<>: ";
}
@@ -163,6 +221,10 @@
return $prefix;
}
+########################################################################
+# calling_convention
+#
+
sub calling_convention16 {
my $self = shift;
my $return_kind16 = $self->return_kind16;
diff --git a/tools/winapi_check/winapi_local.pm b/tools/winapi_check/winapi_local.pm
index 224dbd7..2c73d75 100644
--- a/tools/winapi_check/winapi_local.pm
+++ b/tools/winapi_check/winapi_local.pm
@@ -17,18 +17,18 @@
my $module = $winapi->function_internal_module($internal_name);
if($winapi->name eq "win16") {
- if($winapi->function_stub($internal_name)) {
+ if($winapi->is_function_stub_in_module($module, $internal_name)) {
if($options->implemented) {
$output->write("function implemented but declared as stub in .spec file\n");
}
return;
- } elsif($winapi->function_stub($internal_name)) {
+ } elsif($winapi->is_function_stub_in_module($module, $internal_name)) {
if($options->implemented_win32) {
$output->write("32-bit variant of function implemented but declared as stub in .spec file\n");
}
return;
}
- } elsif($winapi->function_stub($internal_name)) {
+ } elsif($winapi->is_function_stub_in_module($module, $internal_name)) {
if($options->implemented) {
$output->write("function implemented but declared as stub in .spec file\n");
}
diff --git a/tools/winapi_check/winapi_parser.pm b/tools/winapi_check/winapi_parser.pm
index 75e63d8..b17e7f7 100644
--- a/tools/winapi_check/winapi_parser.pm
+++ b/tools/winapi_check/winapi_parser.pm
@@ -56,11 +56,11 @@
my $function_end = sub {
my $function = 'winapi_function'->new;
+ $function->file($file);
$function->debug_channels([@$debug_channels]);
$function->documentation($documentation);
$function->documentation_line($documentation_line);
$function->linkage($linkage);
- $function->file($file);
$function->return_type($return_type);
$function->calling_convention($calling_convention);
$function->internal_name($internal_name);