From b59a9c7622e21bce723e67a59c0b0aad3809dd82 Mon Sep 17 00:00:00 2001 From: Patrik Stridvall <ps@leissner.se> Date: Thu, 12 Jul 2001 22:22:05 +0000 Subject: [PATCH] Several additions and bug fixes. --- tools/winapi/winapi_fixup | 14 +- tools/winapi_check/modules.dat | 5 - tools/winapi_check/modules.pm | 11 ++ tools/winapi_check/win32/rasapi32.api | 12 ++ tools/winapi_check/win32/rpcrt4.api | 21 ++- tools/winapi_check/win32/ws2_32.api | 1 + tools/winapi_check/winapi.pm | 47 ++++- tools/winapi_check/winapi_check | 20 ++- tools/winapi_check/winapi_documentation.pm | 26 ++- tools/winapi_check/winapi_function.pm | 198 ++++++++++++++------- tools/winapi_check/winapi_local.pm | 6 +- tools/winapi_check/winapi_parser.pm | 2 +- 12 files changed, 262 insertions(+), 101 deletions(-) diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup index e10ba0f617c..3b214d8eec7 100755 --- a/tools/winapi/winapi_fixup +++ b/tools/winapi/winapi_fixup @@ -117,7 +117,17 @@ foreach my $file (@c_files) { $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 @@ foreach my $file (@c_files) { 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 d440e8f7ff1..fdbb4058208 100644 --- a/tools/winapi_check/modules.dat +++ b/tools/winapi_check/modules.dat @@ -98,8 +98,6 @@ dlls/imm32 % dlls/kernel/kernel.spec dlls/kernel -dlls/shell32 -dlls/win32s files loader/ne loader @@ -187,7 +185,6 @@ dlls/msvideo % dlls/ntdll/ntdll.spec dlls/ntdll -memory misc scheduler @@ -303,7 +300,6 @@ misc % dlls/shell32/shell32.spec dlls/shell32 -memory % dlls/shdocvw/shdocvw.spec @@ -377,7 +373,6 @@ dlls/win32s % 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 c4ae86f54e9..25f109e5f95 100644 --- a/tools/winapi_check/modules.pm +++ b/tools/winapi_check/modules.pm @@ -2,6 +2,15 @@ package modules; 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 @@ sub new { } } + $modules = $self; + return $self; } diff --git a/tools/winapi_check/win32/rasapi32.api b/tools/winapi_check/win32/rasapi32.api index ef38a616870..75cec6d3e13 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 05ae1f3f0a2..57223adb7b8 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 1005731cbaf..8b747f55bf3 100644 --- a/tools/winapi_check/win32/ws2_32.api +++ b/tools/winapi_check/win32/ws2_32.api @@ -23,6 +23,7 @@ SOCKET16 FARPROC INT * LPDWORD +LPINT LPVOID LPWSABUF LPWSADATA diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm index 87657b04969..ec47a45e7a7 100644 --- a/tools/winapi_check/winapi.pm +++ b/tools/winapi_check/winapi.pm @@ -226,9 +226,10 @@ sub read_spec_files { 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 @@ sub read_all_spec_files { my $win32api = shift; my @files = map { - s%^\./%%; + s%^$wine_dir/%%; if(&$file_type($_) eq "winelib") { $_; } else { @@ -403,7 +404,7 @@ sub parse_spec_file { $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_internal_functions_in_module { sub all_functions_stub { my $self = shift; my $function_stub = \%{$self->{FUNCTION_STUB}}; + my $modules = \%{$self->{MODULES}}; + + 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)); + return sort(keys(%{$$function_stub{$module}})); } sub all_internal_functions_found { @@ -826,13 +841,31 @@ sub function_external_module { 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 6c7f5123cbe..dfa13e21d36 100755 --- a/tools/winapi_check/winapi_check +++ b/tools/winapi_check/winapi_check @@ -276,23 +276,29 @@ foreach my $file (@c_files) { { 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 @@ foreach my $file (@c_files) { (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 c28560ce2ef..78abc2b3d2b 100644 --- a/tools/winapi_check/winapi_documentation.pm +++ b/tools/winapi_check/winapi_documentation.pm @@ -2,6 +2,8 @@ package winapi_documentation; use strict; +use config qw($current_dir $wine_dir); + my %comment_width; my %comment_indent; my %comment_spacing; @@ -13,13 +15,17 @@ sub check_documentation { 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 @@ sub check_documentation { 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 @@ sub check_documentation { 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 37c73e89047..ed334aee2a5 100644 --- a/tools/winapi_check/winapi_function.pm +++ b/tools/winapi_check/winapi_function.pm @@ -3,6 +3,8 @@ use base qw(function); 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 @@ sub new { } ######################################################################## -# 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); -sub external_names16 { - my $self = shift; - my $external_name16 = $self->external_name16; - - if(defined($external_name16)) { - return split(/\s*&\s*/, $external_name16); - } else { - return (); + if(!defined($external_name) && !defined($module)) { + return undef; } -} -sub external_name32 { - my $self = shift; - my $internal_name = $self->internal_name; + 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 $win32api->function_external_name($internal_name); + return join(" & ", @external_names2); } -sub external_names32 { +sub _external_names { my $self = shift; - my $external_name32 = $self->external_name32; + my $winapi = shift; + + my $external_name = $self->_external_name($winapi); - if(defined($external_name32)) { - return split(/\s*&\s*/, $external_name32); + if(defined($external_name)) { + return split(/\s*&\s*/, $external_name); } else { return (); } } -sub external_names { - my $self = shift; +sub external_name16 { my $self = shift; return $self->_external_name($win16api, @_); } +sub external_name32{ my $self = shift; return $self->_external_name($win32api, @_); } - my @external_names; - push @external_names, $self->external_names16; - push @external_names, $self->external_names32; +sub external_names16 { my $self = shift; return $self->_external_names($win16api, @_); } +sub external_names32 { my $self = shift; return $self->_external_names($win32api, @_); } - return @external_names; -} +sub external_names { my $self = shift; return ($self->external_names16,$self->external_names32); } -sub module16 { +######################################################################## +# module +# + +sub _module { my $self = shift; + my $winapi = shift; + + my $file = $self->file; my $internal_name = $self->internal_name; - return $win16api->function_internal_module($internal_name); + my $module = $winapi->function_internal_module($internal_name); + if(!defined($module)) { + return undef; + } + + my @modules; + foreach my $module (split(/\s*&\s*/, $module)) { + if($modules->is_allowed_module_in_file($module, "$current_dir/$file")) { + push @modules, $module; + } + } + + return join(" & ", @modules); } -sub modules16 { +sub _modules { my $self = shift; - my $module16 = $self->module16; + my $winapi = shift; + + my $module = $self->_module($winapi); - if(defined($module16)) { - return split(/\s*&\s*/, $module16); + if(defined($module)) { + return split(/\s*&\s*/, $module); } else { return (); } } -sub module32 { +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; - return $win32api->function_internal_module($internal_name); -} + my $ordinal = $winapi->function_internal_ordinal($internal_name); + my $module = $winapi->function_internal_module($internal_name); -sub modules32 { - my $self = shift; - my $module32 = $self->module32; + if(!defined($ordinal) && !defined($module)) { + return undef; + } + + my @ordinals = split(/\s*&\s*/, $ordinal); + my @modules = split(/\s*&\s*/, $module); - if(defined($module32)) { - return split(/\s*&\s*/, $module32); - } else { - return (); + 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 module { +sub _ordinals { my $self = shift; - my $module16 = $self->module16; - my $module32 = $self->module32; + my $winapi = shift; - my $module; - if(defined($module16) && defined($module32)) { - $module = "$module16 & $module32"; - } elsif(defined($module16)) { - $module = $module16; - } elsif(defined($module32)) { - $module = $module32; + my $ordinal = $self->_ordinal($winapi); + + if(defined($ordinal)) { + return split(/\s*&\s*/, $ordinal); } else { - $module = ""; + return (); } } -sub modules { - my $self = shift; +sub ordinal16 { my $self = shift; return $self->_ordinal($win16api, @_); } +sub ordinal32 { my $self = shift; return $self->_ordinal($win32api, @_); } - my @modules; - push @modules, $self->modules16; - push @modules, $self->modules32; +sub ordinal { my $self = shift; return join (" & ", $self->ordinals); } - return @modules; -} +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 @@ sub prefix { } 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 @@ sub prefix { 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 224dbd7cae9..2c73d75af8c 100644 --- a/tools/winapi_check/winapi_local.pm +++ b/tools/winapi_check/winapi_local.pm @@ -17,18 +17,18 @@ sub check_function { 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 75e63d8982d..b17e7f7518a 100644 --- a/tools/winapi_check/winapi_parser.pm +++ b/tools/winapi_check/winapi_parser.pm @@ -56,11 +56,11 @@ sub parse_c_file { 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); -- GitLab