#! /usr/bin/perl -w

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

use config qw($current_dir $wine_dir file_absolutize file_directory);
use output qw($output);
use winapi_cleanup_options qw($options);

use nativeapi qw($nativeapi);
use util qw(edit_file);

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

########################################################################
# cleanup_file

sub cleanup_file {
    local *IN = shift;
    local *OUT = shift;

    my $file = shift;
    my $dir = do {
	my $file2 = file_absolutize($file);
	my $dir = file_directory($file2);
	"$wine_dir/$dir";
    };

    my $indent;
    my @comments = ();
    my $format_comments = sub {
	local $_ = "";
	if ($#comments == 0) {
	    my $comment = $comments[0];
	    
	    $_ = "$indent/*$comment */";	   
	} elsif ($#comments > 0) {
	    $_ = "$indent/*\n";
	    foreach my $comment (@comments) {
		$_ .= "$indent *$comment\n";
	    }
	    $_ .= "$indent */";
	}
	$indent = "";
	@comments = ();

	return $_;
    };

    my $in_comment = 0;
    my $modified = 0;
    while (<IN>) {
	chomp;

	if ($options->trailing_whitespace) {
	    s/(.*?)\s+$/$1/ && do { $modified = 1; };
	} else {
	    s/(.*?)\r$/$1/ && do { $modified = 1; };
	}

	if ($options->cpp_comments) {
	    if ($in_comment) {
		if(/^.*?\*\//) {
		    $in_comment = 0;
		}
	    } elsif (/^([^\"\/]*?(?:\"[^\"]*?\"[^\"]*?)*?)\/\*(.*?)$/) {
		my $indent2 = $1;
		my $comment = $2;
		if($comment !~ /^.*?\*\//) {
		    $in_comment = 1;
		}
	    } elsif (/^([^\"\/]*?(?:\"[^\"]*?\"[^\"]*?)*?)\/\/(.*?)\s*$/) {
		my $indent2 = $1;
		my $comment = $2;
		
		if ($indent2 =~ /^\s*$/) {
		    if (!$indent || $indent eq $indent2) {
			$indent = $indent2;
			push @comments, $comment;
			next;
		    } else {
			$_ .= "$indent2/*$comment */";
		    }
		} else {
		    my $comments = &$format_comments();
		    if ($comments) {
			$_  = "$comments\n$indent2/*$comment */";
		    } else {
			$_  = "$indent2/*$comment */";
		    }

		    $modified = 1;
		}
	    } else {
		my $comments = &$format_comments();
		if ($comments) {
		    $_  = "$comments\n$_";
		    $modified = 1;
		}
	    }
	}

	if ($options->include_quotes) {
	    my $module = "";
	    if ($dir =~ m%^$wine_dir/(?:windows)$%) {
		$module = "user";
	    } elsif ($dir =~ m%^$wine_dir/dlls/(.*?)/.*?$%) {
		$module = $1;
	    }

	    if (/^(\s*\#\s*include\s+)(?:<(.*?)>|\"(.*?)\")(.*?)\s*$/) {
		my $prefix = $1;
		my $header = $2 || $3;
		my $local = !defined($2) && defined($3);
		my $suffix = $4;

		my $exists_system = 0; {
		    my @system_paths = qw(/usr/include /usr/local/include /usr/X11R6/include);
		    foreach my $path (@system_paths) {
			$exists_system ||= (-e "$path/$header" || 0);
		    }
		    $exists_system ||= $nativeapi->is_conditional_header($header);
		}

		my $exists_windows = 0; {
		    if ($header !~ m%^wine/% && $header ne "config.h") {
			$exists_windows ||= (-e "$wine_dir/include/$header" || 0);
		    }
		}

		my $exists_wine = 0; {
		    $exists_wine ||= ($header eq "config.h");

		    if ($header =~ m%^wine/%) {
			$exists_wine ||= (-e "$wine_dir/include/$header" || 0);
		    }
		}

		my $exists_local = 0; {
		    $exists_local ||= ($header eq "y.tab.h");

		    my @local_paths = ();
		    push @local_paths, "$dir" if $dir !~ m%^$wine_dir/include%;
		    push @local_paths, "$wine_dir/dlls/$module" if $module;
		    foreach my $path (@local_paths) {
			$exists_local ||= (-e "$path/$header" || 0);
		    }
		}

		if (!$exists_system && !$exists_windows && !$exists_wine && !$exists_local) {
		    $output->write("warning: header '$header': doesn't exist\n");
		} elsif (($exists_system + $exists_windows + $exists_wine + $exists_local) > 1) {
		    if ($header !~ /^(?:async\.h|comcat\.h|sql(?:ext|types)?\.h|thread\.h|user\.h)$/) {
			$output->write("warning: header '$header': more than one possibillity\n");
		    }
		}

		if (!$local && $exists_local) {
		    $_ = "$prefix\"$header\"$suffix";
		    $modified = 1;
		} elsif ($local && !$exists_local && ($exists_system || $exists_windows || $exists_wine)) {
		    $_ = "$prefix<$header>$suffix";
		    $modified = 1;
		}
	    }
	}

	print OUT "$_\n";
    }

    my $comments = &$format_comments();
    if ($comments) {
	print OUT "$comments\n";
	$modified = 1;
    }

    return $modified;
}

########################################################################
# main

my @h_files = $options->h_files;
my @c_files = $options->c_files;

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

foreach my $file (@h_files) {
    $progress_current++;
    $output->progress("$file (file $progress_current of $progress_max)");
    $output->prefix("$file: ");

    if (edit_file($file, \&cleanup_file, @_, $file)) {
	$output->write("$file: modified\n");
    }
}

foreach my $file (@c_files) {
    $progress_current++;
    $output->progress("$file (file $progress_current of $progress_max)");
    $output->prefix("$file: ");

    if (edit_file($file, \&cleanup_file, $file)) {
	$output->write("$file: modified\n");
    }
}
