#! /usr/bin/perl -w
#
# Copyright 1999, 2000, 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/make_filter$%;
    require "$1/winapi/setup.pm";
}

use config qw(
    &file_absolutize &file_normalize
    $current_dir $wine_dir
);
use output qw($output);
use make_filter_options qw($options);

use make_parser qw($directory $tool $file $line $message);

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

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

my $command = $options->make . " " . join(" ", $options->arguments);
open(IN, "($command) 2>&1 |");

while(<IN>) {
    chomp;

    if(!&make_parser::line($_)) {
	next;
    }

    if($message) {
	if($file && $line) {
	    if($directory && $directory ne "." && $file !~ m%^/%) {
		$output->write(&file_normalize("$directory/$file") . ":$line: $message\n");
	    } else {
		$output->write("$file:$line: $message\n");
	    }
	} elsif($file) {
	    if($directory && $directory ne "." && $file !~ m%^/%) {
		$output->write(&file_normalize("$directory/$file") . ": $message\n");
	    } else {
		$output->write("$file: $message\n");
	    }
	} else {
	    if($directory && $directory ne ".") {
		$output->write("$directory: $tool: $message\n");
	    } elsif($tool) {
		$output->write("$tool: $message\n");
	    } else {
		$output->write("$message\n");
	    }
	}
    } elsif($tool eq "make") {
	if($directory && $directory ne ".") {
	    $output->progress("$directory: make");
	}
    }
}

close(IN);

$output->hide_progress();
