#! /usr/local/bin/perl5

$default_succweight=200;
$default_codeweight=20;
$default_ideaweight=10;
$minyear=3000;
$maxyear=0;
$linkcnt=0;
while (<>) {
    if (/^#/) { next; }
    if (/^(\S+)/) { $node=$1; next; }
    if (/\tName: (.*)/) { $Name{$node}=$1; next; }

    if (/\tSuccessor to (\S+)\s+(\d+)/) {
	$From[$linkcnt]=$1; $To[$linkcnt]=$node; $Link[$linkcnt]="succ";
	$Weight[$linkcnt]=$2;
	$linkcnt++; next;
    }
    if (/\tCode taken from (\S+)\s+(\d+)/) {
	$From[$linkcnt]=$1; $To[$linkcnt]=$node; $Link[$linkcnt]="code";
	$Weight[$linkcnt]=$2;
	$linkcnt++; next;
    }
    if (/\tInfluenced by (\S+)\s+(\d+)/) {
	$From[$linkcnt]=$1; $To[$linkcnt]=$node; $Link[$linkcnt]="idea";
	$Weight[$linkcnt]=$2;
	$linkcnt++; next;
    }
    if (/\tSuccessor to (\S+)/) {
	$From[$linkcnt]=$1; $To[$linkcnt]=$node; $Link[$linkcnt]="succ";
	$Weight[$linkcnt]=$default_succweight;
	$linkcnt++; next;
    }
    if (/\tCode taken from (\S+)/) {
	$From[$linkcnt]=$1; $To[$linkcnt]=$node; $Link[$linkcnt]="code";
	$Weight[$linkcnt]=$default_codeweight;
	$linkcnt++; next;
    }
    if (/\tInfluenced by (\S+)/) {
	$From[$linkcnt]=$1; $To[$linkcnt]=$node; $Link[$linkcnt]="idea";
	$Weight[$linkcnt]=$default_ideaweight;
	$linkcnt++; next;
    }

    if (/\tDate:.*(\d\d\d\d)-(\d\d)-(\d\d)/) {
				# Convert to year-mon
	$yr=$1; $mon=$2; goto dodate;
    }
    if (/\tDate:.*(\d\d\d\d)-(\d\d)/) {
	$yr=$1; $mon=$2; goto dodate;
    }
    if (/\tDate:.*(\d\d\d\d)/) {
	$yr=$1; $mon="00";
dodate:
	$d="$yr.$mon"; $Date{$d}{$node}=$node;
	$Date{$d}{$d}=$d; $Name{$d}=$d;
	if ($yr > $maxyear) { $maxyear=$yr; }
	if ($yr < $minyear) { $minyear=$yr; }
	next;
    }
}

print("digraph unixhist {\nratio=auto; page=\"8.25,11.65\";\n");
print("node [shape=plaintext,fontsize=30];\n");
print("ranksep=0.1; nodesep=0.1; center=true;\n");

# Draw the visible years
print("{ edge [style=bold];\n");
print("  node [shape=plaintext,fontsize=36,fontname=\"Times-Bold\"];\n");
for ($i=$minyear; $i<=$maxyear; $i++) {
    $d= "$i.00"; $Date{$d}{$d}=$d; $Name{$d}=$d;
    $Date{$d}{$i}=$i; $Name{$i}=$i;
    print("  $i ->\n");
}
print("  future;\n}\n");
print("{ rank=max; future }\n");

foreach $i (sort(keys(%Date))) {
    print("{ rank=same; ");
    foreach $j (keys(%{ $Date{$i} })) {
        print("\"$Name{$j}\"; ");
    }
    print("}\n");
}


# Do the invisible years
for ($i=$minyear; $i<=$maxyear; $i++) { 
    print("{ edge [style=invis];\n");
    for ($j=0; $j<=12; $j++) {
	$d= sprintf("%d.%02d", $i,$j);
	if (!defined($Date{$d}{$d})) { next; }
	print("    $d [style=invis,height=0.1,width=0.1,fontsize=2];\n");
    }
    for ($j=0; $j<=12; $j++) {
	$d= sprintf("%d.%02d", $i,$j);
	if (!defined($Date{$d}{$d})) { next; }
	print("    $d ->\n");
    }
    printf("    %d.00;\n}\n",$i+1);
}
$j=$maxyear+1; $j .= ".00";
print("{ $j [style=invis,height=0.1,width=0.1,fontsize=2]; }\n");

for ($i=0; $i<$linkcnt; $i++) {
    if (!defined($Name{$From[$i]})) {
	print(STDERR "Warning: node $From[$i] doesn't exist\n"); next;
    }
    print("\"$Name{$From[$i]}\" -> \"$Name{$To[$i]}\" ");
    if ($Link[$i] eq "succ") { print("[weight=$Weight[$i],style=bold]"); }
    if ($Link[$i] eq "code") { print("[weight=$Weight[$i],style=dashed]"); }
    if ($Link[$i] eq "idea") { print("[weight=$Weight[$i],style=dotted]"); }
    print(";\n");
}
print("}\n");
