#!/usr/bin/perl -w
# (C) 2003-2007 Willem Jan Hengeveld <itsme@xs4all.nl>
# Web: http://www.xs4all.nl/~itsme/
#      http://wiki.xda-developers.com/
#
# $Id$
#

use strict;
use POSIX;
#use Time::localtime;
use File::stat;
#use Date::Manip;
use Getopt::Long;

my $now= time();

#Date_Init("TZ=CET", "Internal=1");

my $timetype= "mtime";

GetOptions(
    "tc"=> sub { $timetype= "ctime"; },
    "ta"=> sub { $timetype= "atime"; },
    "tm"=> sub { $timetype= "mtime"; },
);

my @t;
for (@ARGV) {
    if (-e $_) {
        push @t, ParseDate(timetodatemanip(stat($_)->$timetype));
    }
    else {
        push @t, ParseDate($_);
    }
}
sub timetodatemanip {
    my $t= localtime shift;
    return $t;
}
for my $row (0..$#t) {
    for my $col (0..$row-1) {
        print("\t") if ($col);
        print DateCalc($t[$col], $t[$row]);
    }
    print("\n");
}
sub currenttime {
    my @t= localtime $now;
    return ($t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);
}
sub month {
    return 1 if $_[0] =~ /jan/i;
    return 2 if $_[0] =~ /feb|fev/i;
    return 3 if $_[0] =~ /mrt|mar/i;
    return 4 if $_[0] =~ /apr|avr/i;
    return 5 if $_[0] =~ /mei|may|mai/i;
    return 6 if $_[0] =~ /jun/i;
    return 7 if $_[0] =~ /jul/i;
    return 8 if $_[0] =~ /aug/i;
    return 9 if $_[0] =~ /sep|spt/i;
    return 10 if $_[0] =~ /o[kc]t/i;
    return 11 if $_[0] =~ /nov/i;
    return 12 if $_[0] =~ /dec/i;
    die "unrecognized month $_[0]\n";
}
sub ParseDate {
    my $ts=shift;
    my ($y,$m,$d,$H,$M,$S)= currenttime();
    if ($ts =~ /\S*:\S*/) {
        ($H,$M,$S)=map { $_+0 } split(/:/,$&);
    }
    if ($ts =~ /\S*[a-z][a-z][a-z]\S*/i) {
        for my $f (split(/\W+/, $&)) {
            if ($f =~ /[a-z]/i) {
                $m= month($f);
            }
            elsif ($f=~ /\d{4}/) {
                $y= $f;
            }
            else {
                $d= $f;
            }
        }
    }
    elsif ($ts =~ /\S*[-\/]\S*/) {
        ($y,$m,$d)=split(/\W+/, $&);
    }
    return POSIX::mktime($S,$M,$H,$d,$m-1,$y-1900);
}
sub DateCalc {
    return $_[1]-$_[0];
}
