#!/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_fixup$%;
    require "$1/winapi/setup.pm";
}

use config qw(
    file_type files_filter
    file_skip files_skip
    file_normalize
    get_spec_files
    $current_dir $wine_dir $winapi_dir
);
use output qw($output);
use winapi_fixup_options qw($options);

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

use winapi_c_parser;
use c_parser;
use type;

use winapi_fixup_documentation qw(fixup_documentation);
use winapi_fixup_editor;
use winapi_fixup_statements qw(fixup_statements);

my @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(@c_files);

foreach my $file (@c_files) {
    my $editor = new winapi_fixup_editor($file);

    $progress_current++;
    $output->progress("$file (file $progress_current of $progress_max)");
    $output->prefix("$file:");

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

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

    my $parser;
    if (1) {
	$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: ";
	}

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

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

    my $found_preprocessor = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	my $preprocessor = shift;

	# $output->write("$begin_line.$begin_column: preprocessor: $preprocessor\n");

	return 1;
    };

    $parser->set_found_preprocessor_callback($found_preprocessor);

    my $found_comment = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	my $comment = shift;

	# $output->write("$begin_line.$begin_column: comment: $comment\n");

	return 1;
    };

    $parser->set_found_comment_callback($found_comment);

    my $found_line = sub {
	$line = shift;
	# local $_ = shift;

	&$update_output;

	# $output->progress("$file: line $line of ?");
    };

    $parser->set_found_line_callback($found_line);

    my $found_declaration = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	my $end_line = shift;
	my $end_column = shift;
	my $declaration = shift;

	# $output->write("$begin_line.$begin_column-$end_line.$end_column: declaration: \\\n$declaration\n");

	return 1;
    };

    $parser->set_found_declaration_callback($found_declaration);

    my $found_function = sub {
	$function = shift;

	&$update_output;

	my $name = $function->name;
	my $begin_line = $function->begin_line;
	my $begin_column = $function->begin_column;
	my $end_line = $function->end_line;
	my $end_column = $function->end_column;

	if($options->documentation) {
	    # fixup_documentation($function, $editor);
	}

	if($options->statements) {
	    fixup_statements($function, $editor);
	}

	my $statements = $function->statements;
	if(!defined($statements)) {
	    $function = undef;
	    $output->prefix("$file: ");
	} else {
	    # $output->write("$begin_line.$begin_column-$end_line.$end_column: function $name\n");
	}

	return 0;
    };

    $parser->set_found_function_callback($found_function);

    my $found_variable = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	my $linkage = shift;
	my $type = shift;
	my $name = shift;

	# $output->write("$begin_line.$begin_column: $linkage $type $name = /* ... */\n");

	return 1;
    };

    $parser->set_found_variable_callback($found_variable);

    my $found_function_call = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	my $end_line = shift;
	my $end_column = shift;
	my $name = shift;
	my $arguments = shift;

	$output->write("$begin_line.$begin_column-$end_line.$end_column: $name(" . join(", ", @$arguments) . ")\n");

	return 1;
    };

    $parser->set_found_function_call_callback($found_function_call);

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

    $output->prefix("");

    $editor->flush;
}
