diff --git a/tools/winapi/winapi_extract b/tools/winapi/winapi_extract index 1fb61901eb4..e6e6b3195b7 100755 --- a/tools/winapi/winapi_extract +++ b/tools/winapi/winapi_extract @@ -118,7 +118,7 @@ foreach my $file (@files) { 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 1a31842f274..3eb4c438d44 100755 --- a/tools/winapi/winapi_fixup +++ b/tools/winapi/winapi_fixup @@ -38,7 +38,7 @@ my %options_long = ( "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 @@ sub get_all_module_internal_ordinal { 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 @@ sub get_all_module_internal_ordinal { } } + 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 @@ sub get_all_module_external_ordinal { 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 @@ sub get_all_module_external_ordinal { 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 @@ foreach my $file (@c_files) { 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 @@ foreach my $file (@c_files) { 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 @@ foreach my $file (@c_files) { $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 @@ foreach my $file (@c_files) { } } - 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 @@ foreach my $file (@c_files) { 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 7c273eeb069..9dfce9f6cb9 100644 --- a/tools/winapi_check/modules.dat +++ b/tools/winapi_check/modules.dat @@ -195,7 +195,6 @@ dlls/odbc32 % dlls/ole32/compobj.spec dlls/ole32 -files % dlls/ole32/ole2.spec @@ -210,7 +209,6 @@ dlls/ole32 % 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 023523a57ae..5c5c338b2fe 100644 --- a/tools/winapi_check/nativeapi.pm +++ b/tools/winapi_check/nativeapi.pm @@ -76,14 +76,12 @@ sub new { # 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 842ff1d3356..63e5a08b19f 100644 --- a/tools/winapi_check/win16/compobj.api +++ b/tools/winapi_check/win16/compobj.api @@ -19,7 +19,6 @@ HTASK16 * IMalloc16 * LPCLSID LPDWORD -LPFILETIME LPMALLOC16 * LPMESSAGEFILTER LPMESSAGEFILTER * diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm index 968a72104aa..f94fddaec16 100644 --- a/tools/winapi_check/winapi.pm +++ b/tools/winapi_check/winapi.pm @@ -694,6 +694,15 @@ sub function_external_calling_convention { 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 e848ad35f3c..b484407b583 100644 --- a/tools/winapi_check/winapi_parser.pm +++ b/tools/winapi_check/winapi_parser.pm @@ -46,7 +46,7 @@ sub parse_c_file { } } - $statements = ""; + $statements = undef; }; my $function_end = sub { &$function_found_callback($line_number,$debug_channels,$documentation,$linkage,$return_type, @@ -55,6 +55,7 @@ sub parse_c_file { $function = ""; }; my %regs_entrypoints; + my @comment_lines = (); my @comments = (); my $level = 0; my $extern_c = 0; @@ -72,11 +73,11 @@ sub parse_c_file { 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 @@ sub parse_c_file { } # 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 @@ sub parse_c_file { next; } + my $documentation_line; my $documentation; my @argument_documentations = (); { @@ -137,7 +144,11 @@ sub parse_c_file { } 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 @@ sub parse_c_file { } } + if(!defined($statements)) { + $statements = ""; + } + if($line !~ /^\s*$/) { $statements .= "$line\n"; } @@ -223,10 +238,14 @@ sub parse_c_file { ((__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++; }