#!/usr/bin/perl -w

# Copyright 2001 Patrik Stridvall
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

use strict;

BEGIN {
    $0 =~ m%^(.*?/?tools)/winapi/winapi_extract$%;
    require "$1/winapi/setup.pm";
}

use config qw(
    &file_type &files_skip &files_filter &get_spec_files
    $current_dir $wine_dir $winapi_dir $winapi_check_dir
);
use output qw($output);
use winapi_extract_options qw($options);

if($options->progress) {
    $output->enable_progress;
} else {
    $output->disable_progress;
}

use c_parser;
use function;
use type;

use winapi_c_parser;
use winapi_function;

use vars qw($win16api $win32api @winapis);
if ($options->spec_files || $options->winetest) {
    require winapi;
    import winapi qw($win16api $win32api @winapis);
}

my %module2entries;
my %module2spec_file;
if($options->spec_files || $options->winetest) {
    local $_;

    foreach my $spec_file (get_spec_files("winelib")) {
	my $entries = [];

	my $module = $spec_file;
	$module =~ s/^.*?([^\/]*)\.spec$/$1/;

	my $type = "win32";

	open(IN, "< $wine_dir/$spec_file");

	my $header = 1;
	my $lookahead = 0;
	while($lookahead || defined($_ = <IN>)) {
	    $lookahead = 0;

	    s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
	    s/^(.*?)\s*#.*$/$1/;  # remove comments
	    /^$/ && next;         # skip empty lines

	    if($header)  {
	        if(/^\d+|@/) {
		    $header = 0;
		    $lookahead = 1;
		}
		next;
	    }

	    if(/^(@|\d+)\s+stdcall\s+(\w+)\s*\(\s*([^\)]*)\s*\)/) {
		my $ordinal = $1;
		my $name = $2;
		my @args = split(/\s+/, $3);

		push @$entries, [$name, "undef", \@args];
	    }
	}
	close(IN);

	$module2spec_file{$module} = $spec_file;
	$module2entries{$module} = $entries;
    }
}

my %specifications;

sub documentation_specifications {
    my $function = shift;

    my @debug_channels = @{$function->debug_channels};
    my $documentation = $function->documentation;
    my $documentation_line = $function->documentation_line;
    my $return_type = $function->return_type;
    my $linkage = $function->linkage;
    my $internal_name = $function->internal_name;

    if($linkage eq "static") {
	return;
    }

    local $_;
    foreach (split(/\n/, $documentation)) {
	if(/^\s*\*\s*(\S+)\s*[\(\[]\s*(\w+)\s*\.\s*(\S+)\s*[\)\]]/) {
	    my $external_name = $1;
	    my $module = lc($2);
	    my $ordinal = $3;

	    if($ordinal eq "@") {
		if(1 || !exists($specifications{$module}{unfixed}{$external_name})) {
		    $specifications{$module}{unfixed}{$external_name}{ordinal} = $ordinal;
		    $specifications{$module}{unfixed}{$external_name}{external_name} = $external_name;
		    $specifications{$module}{unfixed}{$external_name}{function} = $function;
		} else {
		    $output->write("$external_name ($module.$ordinal) already exists\n");
		}
	    } elsif($ordinal =~ /^\d+$/) {
		if(1 || !exists($specifications{$module}{fixed}{$ordinal})) {
		    $specifications{$module}{fixed}{$ordinal}{ordinal} = $ordinal;
		    $specifications{$module}{fixed}{$ordinal}{external_name} = $external_name;
		    $specifications{$module}{fixed}{$ordinal}{function} = $function;
		    } else {
			$output->write("$external_name ($module.$ordinal) already exists\n");
		    }
	    } elsif($ordinal eq "init") {
		if(!exists($specifications{$module}{init})) {
		    $specifications{$module}{init}{function} = $function;
		} else {
		    $output->write("$external_name ($module.$ordinal) already exists\n");
		}
	    } else {
		if(!exists($specifications{$module}{unknown}{$external_name})) {
		    $specifications{$module}{unknown}{$external_name}{ordinal} = $ordinal;
		    $specifications{$module}{unknown}{$external_name}{external_name} = $external_name;
		    $specifications{$module}{unknown}{$external_name}{function} = $function;
		} else {
		    $output->write("$external_name ($module.$ordinal) already exists\n");
		}
	    }

	    if($options->debug) {
		$output->write("$external_name ($module.$ordinal)\n");
	    }
	}
    }
}

my %module_pseudo_stub;

sub statements_stub {
    my $function = shift;

    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}++;
	    }
	}
	if($options->win32) {
	    my $external_name32 = $function->external_name32;
	    foreach my $module32 ($function->modules32) {
		$module_pseudo_stub{$module32}{$external_name32}++;
	    }
	}
    }
}

my @h_files = ();
if($options->headers) {
    @h_files = $options->h_files;
    @h_files = files_skip(@h_files);
    @h_files = files_filter("winelib", @h_files);
}

my @c_files = ();
if(1 || $options->spec_files || $options->pseudo_stub_statistics) {
    @c_files = $options->c_files;
    @c_files = files_skip(@c_files);
    @c_files = files_filter("winelib", @c_files);
}

my $progress_output;
my $progress_current = 0;
my $progress_max = scalar(@h_files) + scalar(@c_files);

foreach my $file (@h_files, @c_files) {
    my %functions;

    $progress_current++;

    {
	open(IN, "< $file");
	local $/ = undef;
	$_ = <IN>;
	close(IN);
    }

    my $max_line = 0;
    {
      local $_ = $_;
      while(s/^.*?\n//) { $max_line++; }
      if($_) { $max_line++; }
    }

    my $parser;
    if (!$options->old) {
	$parser = new c_parser($file);
    } else {
	$parser = new winapi_c_parser($file);
    }

    my $function;
    my $line;

    my $update_output = sub {
	my $progress = "";
	my $prefix = "";

	$progress .= "$file (file $progress_current of $progress_max)";
	$prefix .= "$file:";

	if(defined($function)) {
	    my $name = $function->name;
	    my $begin_line = $function->begin_line;
	    my $begin_column = $function->begin_column;

	    $progress .= ": function $name";
	    $prefix .= "$begin_line.$begin_column: function $name: ";
	} else {
	    $prefix .= " "; 
	}

	if(defined($line)) {
	    $progress .= ": line $line of $max_line";
	}

	$output->progress($progress);
	$output->prefix($prefix);
    };

    &$update_output();

    my $found_function = sub {
	$function = shift;

	my $name = $function->name;
	$functions{$name} = $function;

	if ($function->statements) {
	    &$update_output();
	}

	my $old_function;
	if($options->stub_statistics) {
	    $old_function = 'winapi_function'->new;
	} else {
	    $old_function = 'function'->new;
	}

	$function->file($file);
	$old_function->debug_channels([]); # FIXME: Not complete

	$old_function->documentation_line(0); # FIXME: Not complete
	$old_function->documentation(""); # FIXME: Not complete

	$old_function->function_line($function->begin_line());
	$old_function->linkage($function->linkage);
	$old_function->return_type($function->return_type);
	$old_function->calling_convention($function->calling_convention);
	$old_function->internal_name($function->name);
	if (defined($function->argument_types)) {
	    $old_function->argument_types([@{$function->argument_types}]);
	}
	if (defined($function->argument_names)) {
	    $old_function->argument_names([@{$function->argument_names}]);
	}
	$old_function->argument_documentations([]); # FIXME: Not complete
	$old_function->statements_line($function->statements_line);
	$old_function->statements($function->statements);

	if($options->spec_files || $options->winetest) {
	    documentation_specifications($old_function);
	}

	if($options->stub_statistics) {
	    statements_stub($old_function);
	}

	if ($function->statements) {
	    $function = undef;
	    &$update_output();
	} else {
	    $function = undef;
	}
    };
    $parser->set_found_function_callback($found_function);

    my $found_line = sub {
	$line = shift;

	&$update_output;
    };
    $parser->set_found_line_callback($found_line);

    my $found_type = sub {
	my $type = shift;

	&$update_output();
	
	my $kind = $type->kind;
	my $_name = $type->_name;
	my $name = $type->name;
	
	foreach my $field ($type->fields) {
	    (my $field_type, my $field_name) = @$field;

	    if ($options->struct) {
		if ($name) {
		    $output->write("$name:$field_type:$field_name\n");
		} else {
		    $output->write("$kind $_name:$field_type:$field_name\n");
		}
	    }
	}

	return 1;
    };
    $parser->set_found_type_callback($found_type);

    {
	my $line = 1;
	my $column = 0;
	if(!$parser->parse_c_file(\$_, \$line, \$column)) {
	    $output->write("can't parse file\n");
	}
    }

    $output->prefix("");
}

sub output_function {
    local *OUT = shift;
    my $type = shift;
    my $ordinal = shift;
    my $external_name = shift;
    my $function = shift;

    my $internal_name = $function->internal_name;

    my $return_kind;
    my $calling_convention;
    my $refargument_kinds;
    if($type eq "win16") {
	$return_kind = $function->return_kind16 || "undef";
	$calling_convention = $function->calling_convention16 || "undef";
	$refargument_kinds = $function->argument_kinds16;
    } elsif($type eq "win32") {
	$return_kind = $function->return_kind32 || "undef";
	$calling_convention = $function->calling_convention32 || "undef";
	$refargument_kinds = $function->argument_kinds32;
    }

    if(defined($refargument_kinds)) {
	my @argument_kinds = map { $_ || "undef"; } @$refargument_kinds;
	print OUT "$ordinal $calling_convention $external_name(@argument_kinds) $internal_name\n";
    } else {
	print OUT "$ordinal $calling_convention $external_name() $internal_name # FIXME: arguments undefined\n";
    }
}

if($options->spec_files) {
    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) {
	    my $spec_file = $module2spec_file{$module};

	    if(!defined($spec_file) || !defined($type)) {
		$output->write("$module: doesn't exist\n");
		next;
	    }

	    $spec_file .= "2";

	    $output->progress("$spec_file");
	    open(OUT, "> $wine_dir/$spec_file");

	    if(exists($specifications{$module}{init})) {
		my $function = $specifications{$module}{init}{function};
		print OUT "init " . $function->internal_name . "\n";
	    }
	    print OUT "\n";

	    my %debug_channels;
	    if(exists($specifications{$module}{init})) {
		my $function = $specifications{$module}{init}{function};
		foreach my $debug_channel (@{$function->debug_channels}) {
		    $debug_channels{$debug_channel}++;
		}
	    }
	    foreach my $ordinal (sort {$a <=> $b} keys(%{$specifications{$module}{fixed}})) {
		my $function = $specifications{$module}{fixed}{$ordinal}{function};
		foreach my $debug_channel (@{$function->debug_channels}) {
		    $debug_channels{$debug_channel}++;
		}
	    }
	    foreach my $name (sort(keys(%{$specifications{$module}{unfixed}}))) {
		my $function = $specifications{$module}{unfixed}{$name}{function};
		foreach my $debug_channel (@{$function->debug_channels}) {
		    $debug_channels{$debug_channel}++;
		}
	    }
	    foreach my $name (sort(keys(%{$specifications{$module}{unknown}}))) {
		my $function = $specifications{$module}{unknown}{$name}{function};
		foreach my $debug_channel (@{$function->debug_channels}) {
		    $debug_channels{$debug_channel}++;
		}
	    }

	    my @debug_channels = sort(keys(%debug_channels));
	    if($#debug_channels >= 0) {
		print OUT "debug_channels (" .  join(" ", @debug_channels) . ")\n";
		print OUT "\n";
	    }

	    my $empty = 1;

	    if(!$empty) {
		print OUT "\n";
		$empty = 1;
	    }
	    foreach my $external_name (sort(keys(%{$specifications{$module}{unknown}}))) {
		my $entry = $specifications{$module}{unknown}{$external_name};
		my $ordinal = $entry->{ordinal};
		my $function = $entry->{function};
		print OUT "# ";
		output_function(\*OUT, $type, $ordinal, $external_name, $function);
		$empty = 0;
	    }

	    if(!$empty) {
		print OUT "\n";
		$empty = 1;
	    }
	    foreach my $ordinal (sort {$a <=> $b} keys(%{$specifications{$module}{fixed}})) {
		my $entry = $specifications{$module}{fixed}{$ordinal};
		my $external_name = $entry->{external_name};
		my $function = $entry->{function};
		output_function(\*OUT, $type, $ordinal, $external_name, $function);
		$empty = 0;
	    }

	    if(!$empty) {
		print OUT "\n";
		$empty = 1;
	    }
	    foreach my $external_name (sort(keys(%{$specifications{$module}{unfixed}}))) {
		my $entry = $specifications{$module}{unfixed}{$external_name};
		my $ordinal = $entry->{ordinal};
		my $function = $entry->{function};
		output_function(\*OUT, $type, $ordinal, $external_name, $function);
		$empty = 0;
	    }

	    close(OUT);
	}
    }
}

if($options->stub_statistics) {
    foreach my $winapi (@winapis) {
	my $type = $winapi->name;

	if($type eq "win16" && !$options->win16) { next; }
	if($type eq "win32" && !$options->win32) { next; }

 	my %module_counts;
         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 !~ /^forward|stub$/) {
		     if($module_pseudo_stub{$module}{$external_name}) {
			 $external_calling_convention = "pseudo_stub";
		     }
		 } elsif($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;
		     }

		     if($forward_external_calling_convention ne "stub" &&
			$module_pseudo_stub{$forward_module}{$forward_external_name})
		     {
			 $forward_external_calling_convention = "pseudo_stub";
		     }

		     $external_calling_convention = "forward_$forward_external_calling_convention";
		 }

		 $module_counts{$module}{$external_calling_convention}++;
	     }
	 }

	foreach my $module ($winapi->all_modules) {
 	    my $pseudo_stubs = $module_counts{$module}{pseudo_stub} || 0;
 	    my $real_stubs = $module_counts{$module}{stub} || 0;
 	    my $forward_pseudo_stubs = $module_counts{$module}{forward_pseudo_stub} || 0;
 	    my $forward_real_stubs = $module_counts{$module}{forward_stub} || 0;

 	    my $forwards = 0;
 	    my $total = 0;
	    foreach my $calling_convention (keys(%{$module_counts{$module}})) {
		my $count = $module_counts{$module}{$calling_convention};
		if($calling_convention =~ /^forward/) {
		    $forwards += $count;
		}
		$total += $count;
	    }

	    if($total > 0) {
		my $stubs = $real_stubs + $pseudo_stubs;

		$output->write("*.c: $module: ");
		$output->write("$stubs of $total functions are stubs ($real_stubs real, $pseudo_stubs pseudo) " .
			       "and $forwards are forwards\n");
	    }

	    if($forwards > 0) {
		my $forward_stubs = $forward_real_stubs + $forward_pseudo_stubs;

		$output->write("*.c: $module: ");
		$output->write("$forward_stubs of $forwards forwarded functions are stubs " .
			       "($forward_real_stubs real, $forward_pseudo_stubs pseudo)\n");
	    }
	}
    }
}

if($options->winetest) {
    foreach my $module ($win32api->all_modules) {
	my $type = "win32";

        my $package = $module;
	$package =~ s/\.dll$//;
        $package =~ s/\./_/g;

	my @entries;

	foreach my $external_name (sort(keys(%{$specifications{$module}{unknown}}))) {
	    my $entry = $specifications{$module}{unknown}{$external_name};
	    push @entries, $entry;
	}

	foreach my $ordinal (sort {$a <=> $b} keys(%{$specifications{$module}{fixed}})) {
	    my $entry = $specifications{$module}{fixed}{$ordinal};
	    push @entries, $entry;
	}

	foreach my $external_name (sort(keys(%{$specifications{$module}{unfixed}}))) {
	    my $entry = $specifications{$module}{unfixed}{$external_name};
	    push @entries, $entry;
	}

	my $n = 0;
	foreach my $entry (@entries) {
	    my $external_name = $entry->{external_name};
	    my $ordinal = $entry->{ordinal};
	    my $function = $entry->{function};

	    my $return_kind = $function->return_kind32 || "undef";
	    my $calling_convention = $function->calling_convention32 || "undef";
	    my $refargument_kinds = $function->argument_kinds32;

	    my @argument_kinds;
	    if(defined($refargument_kinds)) {
		@argument_kinds = map { $_ || "undef"; } @$refargument_kinds;
	    }

	    next if $calling_convention ne "stdcall";
	    next if $external_name eq "\@";

	    if($n == 0) {
                open(OUT, "> $wine_dir/programs/winetest/include/${package}.pm");

                print OUT "package ${package};\n";
                print OUT "\n";

                print OUT "use strict;\n";
                print OUT "\n";

                print OUT "require Exporter;\n";
                print OUT "\n";

                print OUT "use wine;\n";
                print OUT "use vars qw(\@ISA \@EXPORT \@EXPORT_OK);\n";
                print OUT "\n";

                print OUT "\@ISA = qw(Exporter);\n";
                print OUT "\@EXPORT = qw();\n";
                print OUT "\@EXPORT_OK = qw();\n";
                print OUT "\n";

                print OUT "my \$module_declarations = {\n";
	    } elsif($n > 0) {
		print OUT ",\n";
	    }

	    print OUT "    \"\Q$external_name\E\" => [\"$return_kind\",  [";
	    my $m = 0;
	    foreach my $argument_kind (@argument_kinds) {
		if($m > 0) {
		    print OUT ", ";
		}
		print OUT "\"$argument_kind\"";
		$m++;
	    }
	    print OUT "]]";
	    $n++;
	}

	if($n > 0) {
	    print OUT "\n";
	    print OUT "};\n";
	    print OUT "\n";
            print OUT "&wine::declare(\"$module\",\%\$module_declarations);\n";
            print OUT "push \@EXPORT, map { \"&\" . \$_; } sort(keys(\%\$module_declarations));\n";
	    print OUT "1;\n";
            close(OUT);
	}
    }
}
