Several bug fixes and additions.
diff --git a/tools/winapi/winapi_extract b/tools/winapi/winapi_extract
index 1fb6190..e6e6b31 100755
--- a/tools/winapi/winapi_extract
+++ b/tools/winapi/winapi_extract
@@ -118,7 +118,7 @@
local $_;
foreach (split(/\n/, $documentation)) {
- if(/^ \*\s*(\w+)\s*[\(\[]\s*(\w+)\.\s*(\@|\d+)\s*[\)\]]/m) {
+ if(/^\s*\*\s*(\w+|\@)\s*[\(\[]\s*(\w+)\s*\.\s*(\@|\d+)\s*[\)\]]/) {
my $external_name = $1;
my $module = lc($2);
my $ordinal = $3;
diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup
index 1a31842..3eb4c43 100755
--- a/tools/winapi/winapi_fixup
+++ b/tools/winapi/winapi_fixup
@@ -38,7 +38,7 @@
"local" => { default => 1, description => "local fixup" },
"documentation" => { default => 1, parent => "local", description => "documentation fixup" },
- "documentation-ordinal" => { default => 0, parent => "documentation", description => "documentation ordinal fixup" },
+ "documentation-ordinal" => { default => 1, parent => "documentation", description => "documentation ordinal fixup" },
"documentation-missing" => { default => 0, parent => "documentation", description => "documentation missing fixup" },
"documentation-name" => { default => 1, parent => "documentation", description => "documentation name fixup" },
"stub" => { default => 0, parent => "local", description => "stub fixup" },
@@ -76,6 +76,12 @@
my @entries = ();
foreach my $winapi (@winapis) {
+ my @name = (); {
+ my $name = $winapi->function_external_name($internal_name);
+ if(defined($name)) {
+ @name = split(/ & /, $name);
+ }
+ }
my @module = (); {
my $module = $winapi->function_internal_module($internal_name);
if(defined($module)) {
@@ -89,10 +95,14 @@
}
}
+ my $name;
my $module;
my $ordinal;
- while(defined($module = shift @module) && defined($ordinal = shift @ordinal)) {
- push @entries, [$module, $ordinal];
+ while(defined($name = shift @name) &&
+ defined($module = shift @module) &&
+ defined($ordinal = shift @ordinal))
+ {
+ push @entries, [$name, $module, $ordinal];
}
}
@@ -105,7 +115,7 @@
my @entries = ();
foreach my $winapi (@winapis) {
my @name = (); {
- my $name = $winapi->function_external_name($external_name);
+ my $name = $winapi->function_internal_name($external_name);
if(defined($name)) {
@name = split(/ & /, $name);
}
@@ -126,7 +136,7 @@
my $name;
my $module;
my $ordinal;
- while(# defined($name = shift @name) &&
+ while(defined($name = shift @name) &&
defined($module = shift @module) &&
defined($ordinal = shift @ordinal))
{
@@ -188,7 +198,19 @@
my @argument_documentations = @$refargument_documentations;
my $statements = shift;
- if($linkage eq "static" || $linkage eq "extern") {
+ if($linkage eq "static" || $linkage eq "extern" || !defined($statements)) {
+ return;
+ }
+
+ my @external_names = ();
+ foreach my $winapi (@winapis) {
+ my $external_names = $winapi->function_external_name($internal_name);
+ if(defined($external_names)) {
+ push @external_names, split(/\s*&\s*/, $external_names);
+ }
+ }
+
+ if($#external_names < 0) {
return;
}
@@ -214,18 +236,28 @@
my $calling_convention16 = translate_calling_convention16($calling_convention);
my $calling_convention32 = translate_calling_convention32($calling_convention);
- my @external_names = ();
- foreach my $winapi (@winapis) {
- my $external_names = $winapi->function_external_name($internal_name);
- if(defined($external_names)) {
- push @external_names, split(/\s*&\s*/, $external_names);
- }
- }
+ my $documention_modified = 0;
- if(options->documentation_ordinal && $documentation) {
+ if(($documentation && !$documention_modified) &&
+ (options->documentation_name || options->documentation_ordinal))
+ {
local $_;
+
+ my %found_external_names;
+
+ foreach my $external_name (@external_names) {
+ $found_external_names{$external_name} = 0;
+ }
+
+ my $line3;
+ my $search;
+ my $replace;
+
+ my $count = 0;
+ my $line2 = $line - 1;
foreach (split(/\n/, $documentation)) {
- if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S*\s*)?[\)\]])+)(.*?)$/m) {
+ $line2++;
+ if(/^(\s*\*\s*(\w+|\@)\s*)((?:\s*[\(\[]\s*\w+(?:\s*\.\s*[^\s\)\]]*\s*)?[\)\]])+)(.*?)$/) {
my $part1 = $1;
my $external_name = $2;
my $part3 = $3;
@@ -234,161 +266,100 @@
$part4 =~ s/\s*$//;
my @entries = ();
- while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*(\S*)\s*)?[\)\]])//) {
- push @entries, [$1, lc($2), $3];
+ while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*([^\s\)\]]*)\s*)?[\)\]])//) {
+ push @entries, [$1, $2, $3];
}
- my $replaced = 0;
- my $replace = "";
- foreach my $entry (@entries) {
- (my $part, my $module, my $ordinal) = @$entry;
- foreach my $entry2 (get_all_module_external_ordinal($external_name)) {
- (my $external_name2, my $module2, my $ordinal2) = @$entry2;
-
- if(defined($module2) && $module eq $module2 &&
- (!defined($ordinal) || (defined($ordinal2) && $ordinal ne $ordinal2)))
- {
- if(defined($ordinal)) {
- if($part =~ s/\U$module\E\s*.\s*\Q$ordinal\E/\U$module2\E.$ordinal2/) {
- $replaced++;
- }
- } else {
- if($part =~ s/\U$module\E/\U$module2\E.$ordinal2/) {
- $replaced++;
- }
- }
- }
- }
- if($replace) { $replace .= "\n"; }
- $replace .= "$part1$part$part4";
- }
-
- if($replaced > 0) {
- $substitute_line{$_}{search} = "^\Q$_\E\$";
- $substitute_line{$_}{replace} = "$replace";
- }
- } elsif(/^(\s*\*\s*)(\w+)\s*$/m) {
- my $part1 = $1;
- my $external_name = $2;
- if($internal_name eq $external_name) {
- foreach my $entry (get_all_module_external_ordinal($external_name)) {
- (my $external_name2, my $module, my $ordinal) = @$entry;
-
- # FIXME: Not correct
- $substitute_line{$_}{search} = "^\Q$_\E\$";
- $substitute_line{$_}{replace} = "$part1$external_name (\U$module\E.$ordinal)";
- }
- }
- }
- }
- }
-
- if(options->documentation_name && $documentation) {
- local $_;
-
- my @entries = ();
- foreach (split(/\n/, $documentation)) {
- if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S+\s*)?[\)\]])+)(.*?)$/m) {
- my $part1 = $1;
- my $external_name2 = $2;
- my $part3 = $3;
- my $part4 = $4;
-
- $part4 =~ s/\s*$//;
-
- push @entries, [$part1, $external_name2, $part3, $part4];
- }
- }
-
- my @missing_external_names = ();
- foreach my $external_name (@external_names) {
- my $found = 0;
- foreach my $entry (@entries) {
- my $part1 = $entry->[0];
- my $external_name2 = $entry->[1];
- my $part3 = $entry->[2];
- my $part4 = $entry->[3];
-
- if($external_name eq $external_name2) {
- $found = 1;
- }
- }
- if(!$found) {
- push @missing_external_names, $external_name;
- }
- }
-
- foreach my $external_name (@missing_external_names) {
- my $internal_name2 = $internal_name;
- my $external_name2 = $external_name;
-
- if($internal_name =~ /^(.*?)$external_name(.*?)$/) {
- my $prefix = $1;
- my $suffix = $2;
-
- my $part1;
- my $part3;
- my $external_name2;
- my $part4;
-
- foreach my $entry (@entries) {
- $part1 = $entry->[0];
- $external_name2 = $entry->[1];
- $part3 = $entry->[2];
- $part4 = $entry->[3];
-
- if($internal_name =~ /^(.*?)$external_name(.*?)$/) {
+ my $found = 0;
+ foreach my $external_name2 (@external_names) {
+ if($external_name eq $external_name2) {
+ $found_external_names{$external_name2} = 1;
+ $found = 1;
last;
}
}
- foreach (split(/\n/, $documentation)) {
- if(/\Q$external_name\E/) {
- if($suffix =~ /^16$/) {
- $substitute_line{$_}{search} = "\Q$internal_name\E";
- $substitute_line{$_}{replace} = "$external_name";
- last;
- } elsif($suffix =~ /^[AW]$/) {
- $substitute_line{$_}{search} = "^\Q$_\E\$";
+ my $replaced = 0;
+ my $replace2 = "";
+ foreach my $entry (@entries) {
+ my $part12 = $part1;
+ (my $part32, my $module, my $ordinal) = @$entry;
- # FIXME: Not correct
- my $replace = "";
-
- $part3 =~ /^\s*[\(\[]\s*(\w+)(?:\s*\.\s*(\S*)\s*)?[\)\]]/;
- my $module = lc($1);
- my $ordinal = $2;
+ foreach my $entry2 (get_all_module_internal_ordinal($internal_name)) {
+ (my $external_name2, my $module2, my $ordinal2) = @$entry2;
- foreach my $entry2 (get_all_module_external_ordinal($external_name)) {
- (my $external_name2, my $module2, my $ordinal2) = @$entry2;
-
- my $part12 = $part1;
- $part12 =~ s/[AW](\s*)$/ $1/;
-
- my $part32 = $part3;
-
- if($module ne $module2 || $ordinal ne $ordinal2) {
- $part32 =~ s/\U$module\E\s*.\s*\Q$ordinal\E/\U$module2\E.$ordinal2/;
- $replace = "$part12$part32$part4";
- }
+ if(options->documentation_name && lc($module) eq $module2 &&
+ $external_name ne $external_name2)
+ {
+ if(!$found && $part12 =~ s/\b\Q$external_name\E\b/$external_name2/) {
+ $external_name = $external_name2;
+ $replaced++;
}
+ }
- if($replace) {
- $replace .= "\n$part1$part3$part4";
- $substitute_line{$_}{replace} = $replace;
- last;
+ if(options->documentation_ordinal &&
+ $external_name eq $external_name2 &&
+ lc($module) eq $module2 &&
+ ($#entries > 0 || !defined($ordinal) || ($ordinal ne $ordinal2)))
+ {
+ if(defined($ordinal)) {
+ if($part32 =~ s/\Q$module\E\s*.\s*\Q$ordinal\E/\U$module2\E.$ordinal2/ || $#entries > 0) {
+ $replaced++;
+ }
+ } else {
+ if($part32 =~ s/\Q$module\E/\U$module2\E.$ordinal2/ || $#entries > 0) {
+ $replaced++;
+ }
}
}
}
-
+ if($replace2) { $replace2 .= "\n"; }
+ $replace2 .= "$part12$part32$part4";
}
- } else {
- output->write("$external_name missing\n");
+
+ if($replaced > 0) {
+ $line3 = $line2;
+ $search = "^\Q$_\E\$";
+ $replace = $replace2;
+ }
+ $count++;
+ } elsif(/^(\s*\*\s*)(\w+|\@)\s*$/) {
+ my $part1 = $1;
+ my $external_name = $2;
+ if($internal_name eq $external_name) {
+ foreach my $entry (get_all_module_internal_ordinal($internal_name)) {
+ (my $external_name2, my $module, my $ordinal) = @$entry;
+
+ $line3 = $line2;
+ $search = "^\Q$_\E\$";
+ $replace = "$part1$external_name2 (\U$module\E.$ordinal)";
+ }
+ }
+ $count++;
}
}
+
+ if(defined($line3) && defined($search) && defined($replace)) {
+ if($count > 1 || $#external_names >= 1) {
+ output->write("multiple entries (fixup not supported)\n");
+ # output->write("s/$search/$replace/\n");
+ } else {
+ $substitute_line{$line3}{search} = $search;
+ $substitute_line{$line3}{replace} = $replace;
+ }
+ }
+
+ if(options->documentation_missing) {
+ foreach my $external_name (keys(%found_external_names)) {
+ if(!$found_external_names{$external_name}) {
+ output->write("$external_name missing (fixup not supported)\n");
+ }
+ }
+ }
}
- if(options->documentation_missing && !$documentation) {
+ if(0 && !$documentation) {
# FIXME: Not correct
my $external_name;
@@ -495,22 +466,22 @@
}
}
- my $search = $substitute_line{$_}{search};
- my $replace = $substitute_line{$_}{replace};
+ my $search = $substitute_line{$.}{search};
+ my $replace = $substitute_line{$.}{replace};
if(defined($search) && defined($replace)) {
my $modified2 = 0;
- if(options->modify) {
- if(s/$search/$replace/) {
+ if(s/$search/$replace/) {
+ if(options->modify) {
$modified = 1;
- $modified2 = 1;
}
+ $modified2 = 1;
}
if(!options->modify || !$modified2) {
my $search2;
my $replace2;
- if(options->modify && !$modified2) {
+ if(!$modified2) {
$search2 = "unmatched search";
$replace2 = "unmatched replace";
} else {
@@ -569,7 +540,7 @@
if(s/$search/$replace/) {
if(options->modify) {
$modified = 1;
- } else {
+ } else {
output->write("$file: search : '$search'\n");
output->write("$file: replace: '$replace'\n");
}
diff --git a/tools/winapi_check/modules.dat b/tools/winapi_check/modules.dat
index 7c273ee..9dfce9f 100644
--- a/tools/winapi_check/modules.dat
+++ b/tools/winapi_check/modules.dat
@@ -195,7 +195,6 @@
% dlls/ole32/compobj.spec
dlls/ole32
-files
% dlls/ole32/ole2.spec
@@ -210,7 +209,6 @@
% dlls/ole32/ole2nls.spec
dlls/ole32
-ole
% dlls/ole32/ole2prox.spec
diff --git a/tools/winapi_check/nativeapi.pm b/tools/winapi_check/nativeapi.pm
index 023523a..5c5c338 100644
--- a/tools/winapi_check/nativeapi.pm
+++ b/tools/winapi_check/nativeapi.pm
@@ -76,14 +76,12 @@
# skip comments
if(/^dnl/) { next; }
- if(/^AC_CHECK_HEADERS\(\s*(.*?)\)\s*$/) {
- my @arguments = split(/,/,$1);
- foreach my $name (split(/\s+/, $arguments[0])) {
+ if(/^AC_CHECK_HEADERS\(\s*([^,\)]*)(?:,|\))?/) {
+ foreach my $name (split(/\s+/, $1)) {
$$conditional_headers{$name}++;
}
- } elsif(/^AC_CHECK_FUNCS\(\s*(.*?)\)\s*$/) {
- my @arguments = split(/,/,$1);
- foreach my $name (split(/\s+/, $arguments[0])) {
+ } elsif(/^AC_CHECK_FUNCS\(\s*([^,\)]*)(?:,|\))?/) {
+ foreach my $name (split(/\s+/, $1)) {
$$conditional_functions{$name}++;
}
} elsif(/^AC_FUNC_ALLOCA/) {
diff --git a/tools/winapi_check/win16/compobj.api b/tools/winapi_check/win16/compobj.api
index 842ff1d..63e5a08 100644
--- a/tools/winapi_check/win16/compobj.api
+++ b/tools/winapi_check/win16/compobj.api
@@ -19,7 +19,6 @@
IMalloc16 *
LPCLSID
LPDWORD
-LPFILETIME
LPMALLOC16 *
LPMESSAGEFILTER
LPMESSAGEFILTER *
diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm
index 968a721..f94fdda 100644
--- a/tools/winapi_check/winapi.pm
+++ b/tools/winapi_check/winapi.pm
@@ -694,6 +694,15 @@
return $$function_external_calling_convention{$name};
}
+sub function_internal_name {
+ my $self = shift;
+ my $function_internal_name = \%{$self->{FUNCTION_INTERNAL_NAME}};
+
+ my $name = shift;
+
+ return $$function_internal_name{$name};
+}
+
sub function_external_name {
my $self = shift;
my $function_external_name = \%{$self->{FUNCTION_EXTERNAL_NAME}};
diff --git a/tools/winapi_check/winapi_parser.pm b/tools/winapi_check/winapi_parser.pm
index e848ad3..b484407 100644
--- a/tools/winapi_check/winapi_parser.pm
+++ b/tools/winapi_check/winapi_parser.pm
@@ -46,7 +46,7 @@
}
}
- $statements = "";
+ $statements = undef;
};
my $function_end = sub {
&$function_found_callback($line_number,$debug_channels,$documentation,$linkage,$return_type,
@@ -55,6 +55,7 @@
$function = "";
};
my %regs_entrypoints;
+ my @comment_lines = ();
my @comments = ();
my $level = 0;
my $extern_c = 0;
@@ -72,11 +73,11 @@
if($lookahead) {
$lookahead = 0;
$_ .= "\n" . $line;
+ $lookahead_count++;
} else {
$_ = $line;
$lookahead_count = 0;
}
- $lookahead_count++;
print " $level($lookahead_count): $line\n" if $options->debug >= 2;
print "*** $_\n" if $options->debug >= 3;
} else {
@@ -91,7 +92,12 @@
}
# remove C comments
- if(s/^(.*?)(\/\*.*?\*\/)(.*)$/$1 $3/s) { push @comments, $2; $again = 1; next }
+ if(s/^(.*?)(\/\*.*?\*\/)(.*)$/$1 $3/s) {
+ push @comment_lines, $.;
+ push @comments, $2;
+ $again = 1;
+ next;
+ }
if(/^(.*?)\/\*/s) {
$lookahead = 1;
next;
@@ -126,6 +132,7 @@
next;
}
+ my $documentation_line;
my $documentation;
my @argument_documentations = ();
{
@@ -137,7 +144,11 @@
}
if(defined($comments[$n]) && $n >= 0) {
+ my @lines = split(/\n/, $comments[$n]);
+
+ $documentation_line = $comment_lines[$n] - scalar(@lines) + 1;
$documentation = $comments[$n];
+
for(my $m=$n+1; $m <= $#comments; $m++) {
if($comments[$m] =~ /^\/\*\*+\/$/ ||
$comments[$m] =~ /^\/\*\s*(?:\!)?defined/) # FIXME: Kludge
@@ -211,6 +222,10 @@
}
}
+ if(!defined($statements)) {
+ $statements = "";
+ }
+
if($line !~ /^\s*$/) {
$statements .= "$line\n";
}
@@ -223,10 +238,14 @@
((__cdecl|__stdcall|CDECL|VFWAPIV|VFWAPI|WINAPIV|WINAPI|CALLBACK)\s+)?
(\w+(\(\w+\))?)\s*\(([^\)]*)\)\s*(\{|\;)/sx)
{
- $line_number = $. - $lookahead_count;
+ my @lines = split(/\n/, $&);
+ my $function_line = $. - scalar(@lines) + 1;
+
+ # FIXME: Should be separate for documentation and function
+ $line_number = $documentation_line;
$_ = $'; $again = 1;
-
+
if($11 eq "{") {
$level++;
}