#!/usr/bin/perl -w

# ----------------------------------------------------------------
# John Kerl
# kerl.john.r@gmail.com
# 2004/07/01
#
# This script aligns tabular ASCII data nicely.
# Sample input:
#
#   O 0,0 5,3 5,8 7,3 7,8 8,5 8,6 9,1 9,10 10,3 10,8
#   0,0 O 9,10 9,1 8,6 8,5 7,8 7,3 5,8 5,3 10,8 10,3
#   5,3 9,10 5,8 O 10,8 8,6 7,3 10,3 0,0 9,1 7,8 8,5
#   5,8 9,1 O 5,3 8,5 10,3 10,8 7,8 9,10 0,0 8,6 7,3
#   7,3 8,6 10,8 8,5 9,10 O 0,0 5,3 7,8 10,3 5,8 9,1
#   7,8 8,5 8,6 10,3 O 9,1 5,8 0,0 10,8 7,3 9,10 5,3
#   8,5 7,8 7,3 10,8 0,0 5,8 9,1 O 10,3 8,6 5,3 9,10
#   8,6 7,3 10,3 7,8 5,3 0,0 O 9,10 8,5 10,8 9,1 5,8
#   9,1 5,8 0,0 9,10 7,8 10,8 10,3 8,5 5,3 O 7,3 8,6
#   9,10 5,3 9,1 0,0 10,3 7,3 8,6 10,8 O 5,8 8,5 7,8
#   10,3 10,8 7,8 8,6 5,8 9,10 5,3 9,1 7,3 8,5 0,0 O
#   10,8 10,3 8,5 7,3 9,1 5,3 9,10 5,8 8,6 7,8 O 0,0
#
# Corresponding output:
#
#   O     0,0  5,3  5,8  7,3  7,8  8,5  8,6  9,1 9,10 10,3 10,8
#   0,0     O 9,10  9,1  8,6  8,5  7,8  7,3  5,8  5,3 10,8 10,3
#   5,3  9,10  5,8    O 10,8  8,6  7,3 10,3  0,0  9,1  7,8  8,5
#   5,8   9,1    O  5,3  8,5 10,3 10,8  7,8 9,10  0,0  8,6  7,3
#   7,3   8,6 10,8  8,5 9,10    O  0,0  5,3  7,8 10,3  5,8  9,1
#   7,8   8,5  8,6 10,3    O  9,1  5,8  0,0 10,8  7,3 9,10  5,3
#   8,5   7,8  7,3 10,8  0,0  5,8  9,1    O 10,3  8,6  5,3 9,10
#   8,6   7,3 10,3  7,8  5,3  0,0    O 9,10  8,5 10,8  9,1  5,8
#   9,1   5,8  0,0 9,10  7,8 10,8 10,3  8,5  5,3    O  7,3  8,6
#   9,10  5,3  9,1  0,0 10,3  7,3  8,6 10,8    O  5,8  8,5  7,8
#   10,3 10,8  7,8  8,6  5,8 9,10  5,3  9,1  7,3  8,5  0,0    O
#   10,8 10,3  8,5  7,3  9,1  5,3 9,10  5,8  8,6  7,8    O  0,0
#
# Options:
# -l for left  alignment
# -r for right alignment
# -lr for left alignment on first column, right for the rest.
# ----------------------------------------------------------------

$maxcols = 0;
$extra = 0;
$first_left = 1;
$left = 1;

while ((@ARGV >= 1) && ($ARGV[0] =~ m/^-/)) {
	if ($ARGV[0] eq "-2") {
		$extra = 2;
	}
	elsif ($ARGV[0] eq "-3") {
		$extra = 3;
	}
	elsif ($ARGV[0] eq "-l") {
		$first_left = 1;
		$left = 1;
	}
	elsif ($ARGV[0] eq "-r") {
		$first_left = 0;
		$left = 0;
	}
	elsif ($ARGV[0] eq "-lr") {
		$first_left = 1;
		$left = 0;
	}
	else {
		die "$0:  Unrecognized option \"$ARGV[0]\".\n";
	}
	shift @ARGV;
}

@lines=<>;

for my $line (@lines) {
	chomp $line;
	$line =~ s/^\s+//;
	my @fields = split /\s+/, $line;
	$maxcols = @fields if (@fields > $maxcols);
}

for ($i = 0; $i < $maxcols; $i++) {
	$widths[$i] = 0;
}

for my $line (@lines) {
	chomp $line;
	$line =~ s/^\s+//;
	my @fields = split /\s+/, $line;
	$i = 0;
	for my $field (@fields) {
		$len = length($field);
		$widths[$i] = $len if $len > $widths[$i];
		$i++;
	}
}

for my $line (@lines) {
	chomp $line;
	$line =~ s/^\s+//;
	my @fields = split /\s+/, $line;
	$i = 0;
	for my $field (@fields) {
		if ($i > 0) {
			print " ";
			if ($extra) {
				print " " if (($i % $extra) == 0);
			}
		}
		if ($i == 0) {
			$this_left = $first_left;
		}
		else {
			$this_left = $left;
		}
		if ($this_left) {
			if ($i == (@fields - 1)) {
				# Avoid trailing spaces
				print $field;
			}
			else {
				printf "%-*s", $widths[$i], $field;
			}
		}
		else {
			printf "%*s", $widths[$i], $field;
		}
		$i++;
	}
	print "\n";
}
