#!/usr/bin/perl -w

use strict;

use Getopt::Std;
use vars qw/$opt_f $opt_T $opt_D/;
getopts("fTD");

@ARGV == 1 or die "usage: $0 [-h | -m] [-F] [-T] [-D] log < comparison\n";

my $log = shift;
open LOG, $log;

my $line;
my ($type, $file, $revision, $dead);
my $file_from_to;
FILE: while (defined ($file_from_to = <STDIN>)) {
	chomp $file_from_to;
	my ($_file, $from, $to) = split /\t/, $file_from_to;
	$from = [split /\./, $from];
	$to = [split /\./, $to];
	while (($file||'') ne $_file) {
		defined ($line = <LOG>)
			or die "EOF on log, expecting file `$_file'\n";
		($type, $file, $revision, $dead) = (split /\t/, $line)[0,1,2,5];
		$dead = $type == 3 && $dead eq "dead";
		$revision = [split /\./, $revision];
	}
	do {
		my $cmp_from = revision_cmp($from, $revision);
		my $cmp_to = revision_cmp($revision, $to);
		if (defined $cmp_from && defined $cmp_to and
			$cmp_from < 0 || $cmp_from == 0 && $opt_f and
			$cmp_to < 0 || $cmp_to == 0 && !$opt_T)
		{
			if (!$opt_D && $dead) {
				print $line if $opt_f;
				next FILE;
			}
			print $line;
		}
		
		defined ($line = <LOG>)
			or last;
		($type, $file, $revision, $dead) = (split /\t/, $line)[0,1,2,5];
		$dead = $type == 3 && $dead eq "dead";
		$revision = [split /\./, $revision];
	} while $file eq $_file;
}

sub revision_cmp {
	my ($ra, $rb) = @_;
	my @ra = @$ra; my @rb = @$rb;

	@ra == 0 and @rb == 0 and return 0;
	@ra == 0 and return -1;
	@rb == 0 and return 1;

	if (@ra > @rb) {
		$#ra = $#rb;
		my $ret = revision_cmp(\@ra, \@rb);
		$ret == -1 and return undef;
		defined $ret and return 1;
	} elsif (@rb > @ra) {
		$#rb = $#ra;
		my $ret = revision_cmp(\@ra, \@rb);
		$ret == 1 and return undef;
		defined $ret and return -1;
	}

	my $a = pop @ra;
	my $b = pop @rb;

	join('.', @ra) ne (join '.', @rb) and
		return undef;

	return $a <=> $b;
}
