#!/usr/bin/perl -w

# Copyright 2001 Patrik Stridvall

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 $winapi_check_dir
);
use output qw($output);
use winapi_fixup_options qw($options);

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

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 = new 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;
}

