diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup index bef5c24f592..1a31842f274 100755 --- a/tools/winapi/winapi_fixup +++ b/tools/winapi/winapi_fixup @@ -38,9 +38,9 @@ my %options_long = ( "local" => { default => 1, description => "local fixup" }, "documentation" => { default => 1, parent => "local", description => "documentation fixup" }, - "documentation-ordinal" => { default => 1, parent => "documentation", description => "documentation ordinal fixup" }, + "documentation-ordinal" => { default => 0, parent => "documentation", description => "documentation ordinal fixup" }, "documentation-missing" => { default => 0, parent => "documentation", description => "documentation missing fixup" }, - "documentation-name" => { default => 0, parent => "documentation", description => "documentation name fixup" }, + "documentation-name" => { default => 1, parent => "documentation", description => "documentation name fixup" }, "stub" => { default => 0, parent => "local", description => "stub fixup" }, "global" => { default => 1, description => "global fixup" }, @@ -104,6 +104,12 @@ sub get_all_module_external_ordinal { my @entries = (); foreach my $winapi (@winapis) { + my @name = (); { + my $name = $winapi->function_external_name($external_name); + if(defined($name)) { + @name = split(/ & /, $name); + } + } my @module = (); { my $module = $winapi->function_external_module($external_name); if(defined($module)) { @@ -117,16 +123,35 @@ sub get_all_module_external_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]; } } return @entries; } +sub normalize_set { + local $_ = shift; + + if(!defined($_)) { + return undef; + } + + my %hash = (); + foreach my $key (split(/\s*&\s*/)) { + $hash{$key}++; + } + + return join(" & ", sort(keys(%hash))); +} + my @c_files = options->c_files; @c_files = files_skip(@c_files); @c_files = files_filter("winelib", @c_files); @@ -173,11 +198,11 @@ foreach my $file (@c_files) { my $prefix = ""; $prefix .= "$file: "; if(defined($module16) && !defined($module32)) { - $prefix .= "$module16: "; + $prefix .= normalize_set($module16) . ": "; } elsif(!defined($module16) && defined($module32)) { - $prefix .= "$module32: "; + $prefix .= normalize_set($module32) . ": "; } elsif(defined($module16) && defined($module32)) { - $prefix .= "$module16 & $module32: "; + $prefix .= normalize_set($module16) . " & " . normalize_set($module32) . ": "; } else { $prefix .= "<>: "; } @@ -189,10 +214,18 @@ 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); + } + } + if(options->documentation_ordinal && $documentation) { local $_; foreach (split(/\n/, $documentation)) { - if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S+\s*)?[\)\]])+)(.*?)$/m) { + if(/^(\s*\*\s*(\w+)\s*)(\s*(?:[\(\[]\s*\w+(?:\s*\.\s*\S*\s*)?[\)\]])+)(.*?)$/m) { my $part1 = $1; my $external_name = $2; my $part3 = $3; @@ -201,7 +234,7 @@ foreach my $file (@c_files) { $part4 =~ s/\s*$//; my @entries = (); - while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*(\S+)\s*)?[\)\]])//) { + while($part3 =~ s/^\s*([\(\[]\s*(\w+)(?:\s*\.\s*(\S*)\s*)?[\)\]])//) { push @entries, [$1, lc($2), $3]; } @@ -210,7 +243,7 @@ foreach my $file (@c_files) { foreach my $entry (@entries) { (my $part, my $module, my $ordinal) = @$entry; foreach my $entry2 (get_all_module_external_ordinal($external_name)) { - (my $module2, my $ordinal2) = @$entry2; + (my $external_name2, my $module2, my $ordinal2) = @$entry2; if(defined($module2) && $module eq $module2 && (!defined($ordinal) || (defined($ordinal2) && $ordinal ne $ordinal2))) @@ -239,8 +272,9 @@ foreach my $file (@c_files) { my $external_name = $2; if($internal_name eq $external_name) { foreach my $entry (get_all_module_external_ordinal($external_name)) { - (my $module, my $ordinal) = @$entry; + (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)"; } @@ -251,25 +285,107 @@ foreach my $file (@c_files) { 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_name = $2; + my $external_name2 = $2; my $part3 = $3; my $part4 = $4; $part4 =~ s/\s*$//; - my $external_name2; - foreach my $winapi (@winapis) { - $external_name2 = ($winapi->function_external_name($internal_name) || $external_name2); - } + 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(defined($external_name2) && $external_name ne $external_name2) { - output->write("$external_name != $external_name2\n"); + 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(.*?)$/) { + 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\$"; + + # 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_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($replace) { + $replace .= "\n$part1$part3$part4"; + $substitute_line{$_}{replace} = $replace; + last; + } + } + + } + + } + } else { + output->write("$external_name missing\n"); + } + } } if(options->documentation_missing && !$documentation) { diff --git a/tools/winapi_check/modules.dat b/tools/winapi_check/modules.dat index f2391aa3d17..7c273eeb069 100644 --- a/tools/winapi_check/modules.dat +++ b/tools/winapi_check/modules.dat @@ -322,7 +322,7 @@ dlls/urlmon % dlls/user/ddeml.spec -dlls/user +dlls/user/dde % dlls/user/display.spec @@ -350,6 +350,7 @@ windows controls dlls/user +dlls/user/dde loader windows diff --git a/tools/winapi_check/win32/user32.api b/tools/winapi_check/win32/user32.api index a7b4f1a6112..56fe1789a5d 100644 --- a/tools/winapi_check/win32/user32.api +++ b/tools/winapi_check/win32/user32.api @@ -92,6 +92,7 @@ LPDISPLAY_DEVICEW LPDRAWTEXTPARAMS LPDWORD LPINT +LPINPUT LPMENUINFO LPMENUITEMINFOA LPMENUITEMINFOW diff --git a/tools/winapi_check/win32/x11drv.api b/tools/winapi_check/win32/x11drv.api index 3b900224651..67a6c9cb51f 100644 --- a/tools/winapi_check/win32/x11drv.api +++ b/tools/winapi_check/win32/x11drv.api @@ -30,6 +30,7 @@ LPBYTE LPDIDEVICEOBJECTDATA LPDWORD LPMOUSE_EVENT_PROC +LPPOINT LPRECT LPVOID RECT * diff --git a/tools/winapi_check/winapi.pm b/tools/winapi_check/winapi.pm index f462941389b..968a72104aa 100644 --- a/tools/winapi_check/winapi.pm +++ b/tools/winapi_check/winapi.pm @@ -286,8 +286,16 @@ sub parse_spec_file { $ordinal = $1; # FIXME: Internal name existing more than once not handled properly - $$function_internal_name{$external_name} = $internal_name; - $$function_external_name{$internal_name} = $external_name; + if(!$$function_internal_name{$external_name}) { + $$function_internal_name{$external_name} = $internal_name; + } else { + $$function_internal_name{$external_name} .= " & $internal_name"; + } + if(!$$function_external_name{$internal_name}) { + $$function_external_name{$internal_name} = $external_name; + } else { + $$function_external_name{$internal_name} .= " & $external_name"; + } $$function_internal_arguments{$internal_name} = $arguments; $$function_external_arguments{$external_name} = $arguments; if(!$$function_internal_ordinal{$internal_name}) { @@ -304,12 +312,12 @@ sub parse_spec_file { $$function_external_calling_convention{$external_name} = $calling_convention; if(!$$function_internal_module{$internal_name}) { $$function_internal_module{$internal_name} = "$module"; - } else { # if($$function_internal_module{$internal_name} !~ /$module/) { + } else { $$function_internal_module{$internal_name} .= " & $module"; } if(!$$function_external_module{$external_name}) { $$function_external_module{$external_name} = "$module"; - } else { # if($$function_external_module{$external_name} !~ /$module/) { + } else { $$function_external_module{$external_name} .= " & $module"; } diff --git a/tools/winapi_check/winapi_check b/tools/winapi_check/winapi_check index 0a936540883..1222819878f 100755 --- a/tools/winapi_check/winapi_check +++ b/tools/winapi_check/winapi_check @@ -265,7 +265,13 @@ if($options->headers) { my $module = $winapi->function_internal_module($internal_name); if(!defined($module)) { next } + # FIXME: Not correct my $external_name = $winapi->function_external_name($internal_name); + + if(defined($external_name)) { + $external_name = (split(/\s*&\s*/, $external_name))[0]; + } + # FIXME: Kludge because of the THUNK variants if(!defined($external_name)) { next; @@ -411,6 +417,16 @@ foreach my $file (@c_files) { $prefix .= "$internal_name(" . join(",", @argument_types) . "): "; $output->prefix($prefix); + # FIXME: Not correct + if(defined($external_name16)) { + $external_name16 = (split(/\s*&\s*/, $external_name16))[0]; + } + + # FIXME: Not correct + if(defined($external_name32)) { + $external_name32 = (split(/\s*&\s*/, $external_name32))[0]; + } + if($options->local && $options->misplaced && $linkage ne "extern" && $statements) { diff --git a/tools/winapi_check/winapi_documentation.pm b/tools/winapi_check/winapi_documentation.pm index a413a00a8eb..eadcaa90e26 100644 --- a/tools/winapi_check/winapi_documentation.pm +++ b/tools/winapi_check/winapi_documentation.pm @@ -21,6 +21,16 @@ sub check_documentation { my $documentation = $function->documentation; my @argument_documentations = @{$function->argument_documentations}; + # FIXME: Not correct + if(defined($external_name16)) { + $external_name16 = (split(/\s*&\s*/, $external_name16))[0]; + } + + # FIXME: Not correct + if(defined($external_name32)) { + $external_name32 = (split(/\s*&\s*/, $external_name32))[0]; + } + my $external_name; my $name1; my $name2; diff --git a/tools/winapi_check/winapi_local.pm b/tools/winapi_check/winapi_local.pm index 86f704263ce..ff58b2380a2 100644 --- a/tools/winapi_check/winapi_local.pm +++ b/tools/winapi_check/winapi_local.pm @@ -257,16 +257,20 @@ sub check_statements { $format =~ s/^\'(.*?)\'$/$1/; $format =~ s/^\\\"(.*?)\\\"$/$1/; - if($argument !~ /$name/) { - $output->write("$called_name: argument $n is wrong ($name != '$argument')\n"); - } elsif(!$winapi->is_allowed_type_format($module, $type, $format)) { - $output->write("$called_name: argument $n ($type $name) has illegal format ($format)\n"); + if($options->debug_messages) { + if($argument !~ /$name/) { + $output->write("$called_name: argument $n is wrong ($name != '$argument')\n"); + } elsif(!$winapi->is_allowed_type_format($module, $type, $format)) { + $output->write("$called_name: argument $n ($type $name) has illegal format ($format)\n"); + } } } - my $count = $#{$function->argument_types} + 1; - if($n != $count) { - $output->write("$called_name: argument count mismatch ($n != $count)\n"); + if($options->debug_messages) { + my $count = $#{$function->argument_types} + 1; + if($n != $count) { + $output->write("$called_name: argument count mismatch ($n != $count)\n"); + } } } }