#! /usr/local/bin/perl -w


# script pour parser les resultats de profed 
# lancer sur les differents fichier .curve


my @struct;
my @s;

while (<STDIN>)
{
	push(@struct,$_);
}


for $i (0..$#struct) 
{
	@s = affectHash(\@s,\$struct[$i]);
}

&filter(\@s);
#&printStruct(\@s);

sub affectHash
{
	local (*h,*s) = @_ ;
	my $i ;
	my @t ;
	my %el ;
	#print $s ;
	chomp $s;
	@t = split / /, $s ;
	$el{"startFS"} = $t[0] ;
	$el{"force"} = $t[1] ;
	$el{"status"} = $t[2] ;
	$el{"length"} = $t[3] ;
	$el{"label1"} = $t[4] ;
	$el{"l1begin"} = $t[5] ;
	$el{"l1end"}  = $t[6] ;
	$el{"l1frame"} = $t[7] ;
	$el{"label2"} = $t[8] ;
	$el{"l2begin"} = $t[9] ;
	$el{"l2end"}  = $t[10] ;
	$el{"l2frame"} = $t[11] ;
	
	push (@h,{%el}) ;
	return @h ;
}


sub filter
{
	local (*h) = @_;
	my $e ;
	my $f;
	my @new ;
	my %newEl ;

	for $e (@h) 
	{
	#	print "COMP:".$e->{"startFS"}." ".$e->{"force"}." ".$e->{"status"}." ".$e->{"length"}." ".$e->{"label1"}." ".$e->{"l1begin"}." ".$e->{"l1end"}." ".$e->{"l1frame"}." ".$e->{"label2"}." ".$e->{"l2begin"}." ".$e->{"l2end"}." ".$e->{"l2frame"};
		if ( $e->{"status"} ne "ONLYPCOD") 
		{
		 	if ( isPresent(\%$e,\@new) != 1 ) 
			{
				push (@new,{%$e});	
			}
			else 
			{
				\%e=correctEntrie(\%$e,\@new);
			}
		}
		else 
		{
			if ( onlypcodTest(\%$e,\@new) != 1 )
			{
				push (@new,{%$e});
			}
		}
	}
	&printStruct(\@new);
}

sub correctEntrie 
{
	local (*n,*e) = @_ ;
	my $i;
	
	for $i (@e)
	{
		if ($i->{"status"} eq $n{"status"} ) 
		{
			if  ( ($i->{"label1"} eq $n{"label1"}) && ($i->{"label2"} eq $n{"label2"}) ) 
			{
				if ($n{"length"} > $i->{"length"})
				{
					$i->{"length"} = $n{"length"};
					$i->{"force"} = $n{"force"};
				}
			}
			elsif ( ($i->{"label1"} eq $n{"label2"}) && ($i->{"label2"} eq $n{"label1"}) )
			{
				if ($n{"length"} > $i->{"length"})
				{
					$i->{"length"} = $n{"length"};
					$i->{"force"} = $n{"force"};
				}
			}
		}
	}
	return(%n);

}
sub onlypcodTest
{
	local (*e,*n) = @_ ;
	my $i ;
	for $i (@n)
	{
		if ($i->{"status"} eq  "ONLYPCOD")
		{
			if ( ($i->{"label1"} eq $e{"label1"}) && ($i->{"label2"} eq $e{"label2"}) ) 
			{
				return 1 ;
			}
		}
	}
	return 0; 
}

sub isPresent
{
	local (*e,*n) = @_ ;
	my $i ;
	for $i (@n)
	{
		if ($i->{"status"} eq $e{"status"} ) 
		{
			if  ( ($i->{"label1"} eq $e{"label1"}) && ($i->{"label2"} eq $e{"label2"}) ) 
			{
				return 1 ;
			}
			elsif ( ($i->{"label1"} eq $e{"label2"}) && ($i->{"label2"} eq $e{"label1"}) )
			{
				return 1 ;
			}
		}
	}
	return 0 ;
}

sub printStruct 
{
	local (*h) = @_ ;
	my $i;

	for $i (@h)
	{
		if ( $i->{"status"} eq "BADSTART")
		{
			print  $i->{"startFS"}." ".$i->{"force"}." ONLYPCOD ".$i->{"length"}." ".$i->{"label1"}." ".$i->{"l1begin"}." ".$i->{"l1end"}." ".$i->{"l1frame"}." ".$i->{"label2"}." ".$i->{"l2begin"}." ".$i->{"l2end"}." ".$i->{"l2frame"}."\n";

		}
		else
		{
			print  $i->{"startFS"}." ".$i->{"force"}." ".$i->{"status"}." ".$i->{"length"}." ".$i->{"label1"}." ".$i->{"l1begin"}." ".$i->{"l1end"}." ".$i->{"l1frame"}." ".$i->{"label2"}." ".$i->{"l2begin"}." ".$i->{"l2end"}." ".$i->{"l2frame"}."\n";
		}
			#print $j ."..".$i->{$j}."\n";
	}
}
