#!/usr/bin/perl -w

# Copyright 2001 Patrik Stridvall

use strict;

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

use config qw(
    &file_type &file_skip &files_skip &get_spec_files
    $current_dir $wine_dir $winapi_dir $winapi_check_dir
);
use output;
use options;
use winapi;
use winapi_parser;

my $output = output->new;

my %options_long = (
    "debug" => { default => 0, description => "debug mode" },
    "help" => { default => 0, description => "help mode" },
    "verbose" => { default => 0, description => "verbose mode" },

    "progress" => { default => 1, description => "show progress" },

    "win16" => { default => 1, description => "Win16 extraction" },
    "win32" => { default => 1, description => "Win32 extraction" },

    "local" =>  { default => 1, description => "local extraction" },
    "global" => { default => 1, description => "global extraction" },

    "spec-files" => { default => 1, parent => "global", description => "spec files extraction" },
);

my %options_short = (
    "d" => "debug",
    "?" => "help",
    "v" => "verbose"
);

my $options_usage = "usage: winapi_extract [--help] [<files>]\n";

my $options = options->new(\%options_long, \%options_short, $options_usage);

my %module2spec_file;
my %module2type;
{
    local $_;

    foreach my $spec_file (get_spec_files) {
	my $module;
	my $type;

	open(IN, "< $wine_dir/$spec_file");
	while(<IN>) {
	    s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
	    s/^(.*?)\s*#.*$/$1/;  # remove comments
	    /^$/ && next;         # skip empty lines

	    if(/^name\s+(.*?)$/) {
		$module = $1;
		$module2spec_file{$module} = $spec_file;
	    } elsif(/^type\s+(.*?)$/) {
		$type = $1;
		$module2type{$module} = $type;
	    }
	}
	close(IN);
    }
}

my $win16api = winapi->new($options, $output, "win16", "$winapi_check_dir/win16");
my $win32api = winapi->new($options, $output, "win32", "$winapi_check_dir/win32");
my @winapis = ($win16api, $win32api);

my %specifications;

my @files = files_skip($options->c_files);

my $progress_output;
my $progress_current = 0;
my $progress_max = scalar(@files);

foreach my $file (@files) {
    my $functions = 0;

    $progress_current++;
    if($options->progress) {
	output->progress("$file: file $progress_current of $progress_max");
    }

    my $found_function = sub {
	my $line = shift;
	my $refdebug_channels = shift;
	my @debug_channels = @$refdebug_channels;
	my $documentation = shift;
	my $linkage = shift;
	my $return_type = shift;
	my $calling_convention = shift;
	my $internal_name = shift;
	my $refargument_types = shift;
	my @argument_types = @$refargument_types;
	my $refargument_names = shift;
	my @argument_names = @$refargument_names;
	my $refargument_documentations = shift;
	my @argument_documentations = @$refargument_documentations;
	my $statements = shift;

	$functions++;

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

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

		if($ordinal eq "@") {
		    $specifications{$module}{unfixed}{$external_name}{debug_channels} = [@debug_channels];
		    $specifications{$module}{unfixed}{$external_name}{internal_name} = $internal_name;
		    $specifications{$module}{unfixed}{$external_name}{external_name} = $external_name;
		    $specifications{$module}{unfixed}{$external_name}{ordinal} = $ordinal;
		    $specifications{$module}{unfixed}{$external_name}{arguments} = [@argument_types];
		} else {
		    $specifications{$module}{fixed}{$ordinal}{debug_channels} = [@debug_channels];
		    $specifications{$module}{fixed}{$ordinal}{ordinal} = $ordinal;
		    $specifications{$module}{fixed}{$ordinal}{internal_name} = $internal_name;
		    $specifications{$module}{fixed}{$ordinal}{external_name} = $external_name;
		    $specifications{$module}{fixed}{$ordinal}{arguments} = [@argument_types];
		}

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


    my $found_preprocessor = sub {
	my $directive = shift;
	my $argument = shift;
    };

    winapi_parser::parse_c_file $options, $output, $file, $found_function, $found_preprocessor;

    if($functions == 0) {
	output->write("$file: doesn't contain any functions\n");
    }
}

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

    my $internal_name = $function->{internal_name};
    my $external_name = $function->{external_name};
    my $ordinal = $function->{ordinal};
    my @arguments = @{$function->{arguments}};
    
    my @arguments2;
    foreach my $argument (@arguments) {
	my $argument2;
	if($type eq "win16") {
	    $argument2 = $win16api->translate_argument($argument);
	} else {
	    $argument2 = $win32api->translate_argument($argument);
	}
	if(!defined($argument2)) {
	    $argument2 = "undef";
	}

	if($argument2 eq "longlong") {
	    push @arguments2, ("long", "long");
	} else {
	    push @arguments2, $argument2;
	}
    }

    if($type eq "win16") {
	print OUT "$ordinal pascal $external_name(@arguments2) $internal_name\n";
    } else {
	print OUT "$ordinal stdcall $external_name(@arguments2) $internal_name\n";
    }
}

if($options->spec_files) {
    foreach my $module (keys(%specifications)) {
	my $spec_file = $module2spec_file{$module};
	my $type = $module2type{$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");
	
	print OUT "name $module\n";
	print OUT "type $type\n";
	print OUT "\n";
	
	my %debug_channels;
	foreach my $ordinal (sort {$a <=> $b} keys(%{$specifications{$module}{fixed}})) {
	    my $function = $specifications{$module}{fixed}{$ordinal};
	    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}; 
	    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;
	foreach my $ordinal (sort {$a <=> $b} keys(%{$specifications{$module}{fixed}})) {       
	    my $function = $specifications{$module}{fixed}{$ordinal};
	    output_function(\*OUT, $type, $function);
	    $empty = 0;
	}

	foreach my $name (sort(keys(%{$specifications{$module}{unfixed}}))) {
	    if(!$empty) {
		print OUT "\n";
		$empty = 1;
	    }
	    my $function = $specifications{$module}{unfixed}{$name}; 
	    output_function(\*OUT, $type, $function);
	}
	close(OUT);
    }
}
output->hide_progress;
