#!/usr/bin/env perl

# DO NOT EDIT the /cluster/bin/scripts copy of this file -- 
# edit ~/kent/src/hg/utils/automation/blastz-normalizeLav instead.

# $Id: blastz-normalizeLav,v 1.1 2006/10/09 20:44:33 angie Exp $

my $from0 = 0;
my $from1 = 0;
my $to0 = 0;
my $to1 = 0;
my $len0 = 1;
my $len1 = 1;
my $isrc = 0;

my @line = ();
sub get { return ($#line < 0) ? scalar(<>) : pop @line; }
sub unget { my $a = shift; push(@line,$a) if $a; }

sub max { $_[0] > $_[1] ? $_[0] : $_[1]; }

sub get_next
{
    my $s;
    while (($s = get) && ($s =~ /^\s*$/)) { }
    return $s;
}

sub do_copy 
{
    my $s = shift;
    print $s if $s;
    while (($s = get) && ($s !~ /^\}/)) { print "$s"; }
    print $s if $s;
}

sub do_finish
{
    my $s = shift;
    print $s if $s;
    return if $s =~ /^}/;
    do_copy "";
}

sub do_s
{
    my $s = shift;
    my $n;

    print $s;

    my $s1 = get_next;
    $s1 =~ /^\s*("[^"]*")\s+(\d+)\s+(\d+)(.*)$/ or die;
    $from0 = $2;
    $to0 = $3;
    $n = max($3, $len0);
    print "  $1 1 $n $4\n";

    my $s2 = get_next;
    $s2 =~ /^\s*("[^"]*")\s+(\d+)\s+(\d+)(.*)$/ or die;
    $from1 = $2;
    $to1 = $3;
    $n = max($3, $len1);
    print "  $1 1 $n $4\n";

    $isrc = scalar($1 =~ /-"$/);
    do_finish "";
}

#
# abs: 1....from....to....len1
# rel: .....1.......n.........
#
# n == (to-from+1)
# rev(x) == n-x+1
# abs(x) == from+x-1
#
# abs(rev(x)) == from+(to-from+1-x+1)-1 == to-x+1
# Rev(abs(rev(x))) == len1-(to-x+1)+1 == len1-to+x
#

sub S0 { $_[0] + $from0 - 1; }
sub S1 { $_[0] + $from1 - 1; }
sub R1 { ($to1-$from1+1) - $_[0] + 1; }
sub M1 { my $x = $_[0]; 
	if ($len1 == 0) {return $x;}
	else {return $isrc ? $len1-$to1+$x : $from1+$x-1;}
}

sub do_a
{
    my $s = shift;
    print $s;

    $s = get_next;
    print $s;

    $s = get_next;
    $s =~ /^\s*b\s+(\d+)\s+(\d+)/ or die;
    printf "  b %d %d\n", S0($1), M1($2);

    $s = get_next;
    $s =~ /^\s*e\s+(\d+)\s+(\d+)/ or die;
    printf "  e %d %d\n", S0($1), M1($2);

    while ($s = get_next) {
	last unless $s =~ /^\s*l\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/;
	printf "  l %d %d %d %d %g\n",
	    S0($1), M1($2), S0($3), M1($4), $5;
    }
    do_finish $s;
}

sub do_m
{
    my $s = shift;
    print $s;

    while ($s = get_next) {
	if ($s =~ /^\s*n/) {
	    print $s;
	} elsif ($s =~ /^\s*x\s+(\d+)\s+(\d+)/) {
	    printf "  x %d %d\n", $1+$from0-1, $2+$from0-1;
	} else {
	    last;
	}
    }
    do_finish $s;
}

# main
$len0 = shift or die;
$len1 = shift;
my $s = <>;
die "not lav" unless $s eq "#:lav\n";
print $s;
print "d {\n";
print "  normalize-lav $len0 $len1\n";
print "}\n";

while ($s = get_next) {
    if    ($s =~ /^\s*#/) { print $s; }
    elsif ($s =~ /^s/) { do_s $s; }
    elsif ($s =~ /^a/) { do_a $s; }
    elsif ($s =~ /^m/) { do_m $s; }
    else  { do_copy $s; }
}

