#!/usr/bin/perl

sub usage
{
	print STDERR "usage: $0 [-s [-n samples] [-i interval]] [log_file]\n";
	exit(1);
}


while ($ARGV[0] =~ /^-/) {
	$opt = shift @ARGV;
	if ($opt eq "-s") {
		$sim = 1;
	} elsif ($opt eq "-n") {
		$sim_n = shift @ARGV;
		&usage unless defined $sim_n;
	} elsif ($opt eq "-i") {
		$sim_t = shift @ARGV;
		&usage unless defined $sim_t;
	} else {
		&usage;
	}
}

unless ($sim && defined $sim_n && defined $sim_t) {
	$n = 1;
	while (<>) {
		next unless /^=== (\d+) ===/;
		while ($1 != $n) {
			push(@f, $n);
			$n++;
		}
		$n++;
	}

	$n--;
	$t = int($n/@f+0.5);

	$last = 0;
	for (@f) {
		push(@d, $_-$last);
		$last = $_;
	}
}

if ($sim) {
	# y = 1-exp(-x/T)
	# 1-y = exp(-x/T)
	# ln(1-y) = -x/T
	# -T*ln(1-y) = x

	$type = " (SIMULATED)";
	$sim_n = @f unless defined $sim_n;
	$sim_t = $t unless defined $sim_t;
	@d = ();
	for ($i = 0; $i != $sim_n; $i++) {
		push(@d, -$sim_t*log(1-rand));
	}
}

for (@d) {
	$max = $_ if $_ > $max;
}

$cmd = "|gnuplot -e '".
    'set term postscript color eps enhanced solid lw 2 20;'.
    'set output "out.eps";'.
    'set xrange [0:'.$max*1.05.'];'.
    'set yrange [0:'.$max*1.05.'];'.
    'set title "Correlation of time to adjacent corruptions'.$type.'";'.
    'set xlabel "Cycles since previous event";'.
    'set ylabel "Cycles until next event";'.
    'plot "-" with points pt 7 notitle'.
    "'";

open(PIPE, $cmd) || die "open: $!";
undef $last;
for (@d) {
	print PIPE "$last $_\n" if defined $last;
	$last = $_;
}
close(PIPE) || die "close: $!";

system("cat out.eps | ".
    "gs -sDEVICE=ppmraw -r100 -sOutputFile=- ".
    "-dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sPAPERSIZE=a4 -q - | ".
    "convert -trim - out.png");
unlink("out.eps");
