#!/usr/bin/perl

# Copyright (c) 2010 Uli Martens <uli@youam.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


use strict;
use warnings;

my $maxcol = -1;
my $minsep = 1;

my @csize;
my @direction;

while (scalar @ARGV) {
	my $cmd=shift @ARGV;
	if ( $cmd eq "-d" ) {
		@direction = split //, shift @ARGV;
		next;
	}
	if ( $cmd eq "-s" ) {
		@csize = split /,/, shift @ARGV;
		next;
	}
	if ( $cmd eq "-m" ) {
		$maxcol = shift @ARGV;
		next;
	}
	print STDERR "$0: unknown argument '$cmd'\n";
	exit 1;
}

while (<>) {
	chomp;
	my @line = split /\s+/, $_, $maxcol ;
	for ( 0 .. scalar @line -1 ) {
		if ( not defined $csize[$_] ) {
			$csize[$_] = length($line[$_]);
		}
		if ( $csize[$_] <= length($line[$_]) ) {
			$csize[$_] = length($line[$_]);
		}
		my $dir = -1;
		$dir = 1 if defined $direction[$_] and $direction[$_] eq "r";
		printf "%*s", $dir*$csize[$_], $line[$_];
		print " " x $minsep;
	}
	print "\n";
}
