Several additions and bug fixes.
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;