- Fixed broken winapi_extract options --{pseudo-,}stub-statistics.

- Added new winapi_extract options --{pseudo-,}implemented.
This commit is contained in:
Patrik Stridvall 2002-10-15 02:15:35 +00:00 committed by Alexandre Julliard
parent 0bc4b56595
commit cff905837f
4 changed files with 87 additions and 12 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/perl -w
# Copyright 2001 Patrik Stridvall
# Copyright 2002 Patrik Stridvall
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@ -45,7 +45,7 @@ use winapi_c_parser;
use winapi_function;
use vars qw($win16api $win32api @winapis);
if ($options->spec_files || $options->winetest) {
if ($options->spec_files || $options->implemented || $options->stub_statistics || $options->winetest) {
require winapi;
import winapi qw($win16api $win32api @winapis);
}
@ -161,24 +161,29 @@ sub documentation_specifications {
my %module_pseudo_stub;
sub statements_stub {
sub statements_pseudo_stub {
my $function = shift;
my $pseudo_stub = 0;
my $statements = $function->statements;
if(defined($statements) && $statements =~ /FIXME[^;]*stub/s) {
if($options->win16) {
my $external_name16 = $function->external_name16;
foreach my $module16 ($function->modules16) {
$module_pseudo_stub{$module16}{$external_name16}++;
$pseudo_stub = 1;
}
}
if($options->win32) {
my $external_name32 = $function->external_name32;
foreach my $module32 ($function->modules32) {
$module_pseudo_stub{$module32}{$external_name32}++;
$pseudo_stub = 1;
}
}
}
return $pseudo_stub;
}
my @h_files = ();
@ -189,7 +194,7 @@ if($options->headers) {
}
my @c_files = ();
if(1 || $options->spec_files || $options->pseudo_stub_statistics) {
if($options->spec_files || $options->pseudo_implemented || $options->pseudo_stub_statistics) {
@c_files = $options->c_files;
@c_files = files_skip(@c_files);
@c_files = files_filter("winelib", @c_files);
@ -267,13 +272,13 @@ foreach my $file (@h_files, @c_files) {
}
my $old_function;
if($options->stub_statistics) {
if($options->implemented || $options->stub_statistics) {
$old_function = 'winapi_function'->new;
} else {
$old_function = 'function'->new;
}
$function->file($file);
$old_function->file($function->file);
$old_function->debug_channels([]); # FIXME: Not complete
$old_function->documentation_line(0); # FIXME: Not complete
@ -298,16 +303,36 @@ foreach my $file (@h_files, @c_files) {
documentation_specifications($old_function);
}
if($options->stub_statistics) {
statements_stub($old_function);
}
if ($function->statements) {
$function = undef;
&$update_output();
} else {
$function = undef;
}
my $pseudo_stub = 0;
if ($options->pseudo_implemented || $options->pseudo_stub_statistics) {
$pseudo_stub = statements_pseudo_stub($old_function);
}
my $module = $old_function->module;
my $external_name = $old_function->external_name;
my $statements = $old_function->statements;
if ($options->pseudo_implemented && $module && $external_name && $statements) {
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 ($pseudo_stub) {
$output->write("$module.$external_name: pseudo implemented\n");
} else {
$output->write("$module.$external_name: implemented\n");
}
}
}
};
$parser->set_found_function_callback($found_function);
@ -355,6 +380,41 @@ foreach my $file (@h_files, @c_files) {
$output->prefix("");
}
if($options->implemented && !$options->pseudo_implemented) {
foreach my $winapi (@winapis) {
my $type = $winapi->name;
if($type eq "win16" && !$options->win16) { next; }
if($type eq "win32" && !$options->win32) { next; }
foreach my $module ($winapi->all_modules) {
foreach my $external_name ($winapi->all_functions_in_module($module)) {
my $external_calling_convention =
$winapi->function_external_calling_convention_in_module($module, $external_name);
if($external_calling_convention eq "forward") {
(my $forward_module, my $forward_external_name) =
$winapi->function_forward_final_destination($module, $external_name);
my $forward_external_calling_convention =
$winapi->function_external_calling_convention_in_module($forward_module, $forward_external_name);
if(!defined($forward_external_calling_convention)) {
next;
}
$external_calling_convention = $forward_external_calling_convention;
}
if ($external_calling_convention ne "stub") {
$output->write("*.spec: $module.$external_name: implemented\n");
}
}
}
}
}
sub output_function {
local *OUT = shift;
my $type = shift;

View File

@ -43,6 +43,8 @@ my %options_long = (
"old" => { default => 0, description => "use the old parser" },
"headers" => { default => 0, description => "parse the .h files as well" },
"implemented" => { default => 0, parent => "old", description => "implemented functions extraction" },
"pseudo-implemented" => { default => 0, parent => "implemented", description => "pseudo implemented functions extraction" },
"struct" => { default => 0, parent => "headers", description => "struct extraction" },
"spec-files" => { default => 0, parent => "old", description => "spec files extraction" },
"stub-statistics" => { default => 0, parent => "old", description => "stub statistics" },

View File

@ -159,9 +159,9 @@ dlls/msimg32
dlls/msisys
% dlls/msrle32/msrle32.spec
% dlls/msvideo/msrle32/msrle32.spec
dlls/msrle32
dlls/msvideo/msrle32
% dlls/msvcrt/msvcrt.spec

View File

@ -208,6 +208,8 @@ sub parse_c_file {
my $old_function = shift;
my $function = new c_function;
$function->file($old_function->file);
$function->begin_line($old_function->function_line);
$function->begin_column(0);
@ -219,6 +221,17 @@ sub parse_c_file {
$function->calling_convention($old_function->calling_convention);
$function->name($old_function->internal_name);
if(defined($old_function->argument_types)) {
$function->argument_types([@{$old_function->argument_types}]);
}
if(defined($old_function->argument_names)) {
$function->argument_names([@{$old_function->argument_names}]);
}
$function->statements_line($old_function->statements_line);
$function->statements_column(0);
$function->statements($old_function->statements);
&$$found_function($function);
};