#!/usr/local/bin/perl

# Given a set of file names that have experimental data, prints out the
# relevant times for all the experiments that are present in the files
# Filename format must be page, eviction, bigslots, tname, temp


sub usage_assert { # Parameter Boolean, string
    local($val, $str) = @_;
    if ($val) {return;}
    usage ($str);
}

sub usage { # Paramaters: Error string
    local($err) = @_;
    print "ERROR: $err\n";
    $usage = join(' ', "extract_nums [-s datastring] files\n");
    print "$usage\n\n";
    exit;
}

sub parse_traversal{ # Parameter string of the form,e.g. file#M,T,small,6,C,,
    # effects: Returns a string that descibes the traversal

    local($trav) = @_;

    @key = split("#", $trav);

    @data = split(",", $key[1]);
    if ($data[1] eq "T") {
	$type = "Normal";
    } else {
	$type = "Shift";
    }
    $max_i = -1;
    for ($i = 0; $i <= $#data; $i++) {
	if ($data[$i] =~ /^\s*$/) {
	    $max_i = $max_i == -1 ? $i: $max_i;
	} else {
	    $max_i = -1;
	}
    }

    if ($max_i != -1) {
	$#data = $max_i - 1;
    }

    # Parse the filename
    ($page, $eviction, $bigslots, $tname, $temp) = split("_", $key[0]);
    $bigslots = substr($bigslots, 1);
    $page = substr($page, 1);
    $eviction = substr($eviction, 1);

    $res = "Eviction: $eviction, Bigslots: $bigslots, $temp, $type,";
    $res = "$res @data[2..$#data]";
    return $res;
}


$datastring = "Time for traversal";
$start_arg = 0;
for ($i = 0; $i <= $#ARGV; $i += 2) {
    $option = $ARGV[$i];
    $val = $ARGV[$i+1];
    if ($option eq "-s") {
	$datastring = $val;
	$start_arg = $i + 2;
    } elsif ($option =~ /-.*/) {
	usage "Bad option: $option $val";
    }
}

# Maintain information for each execution number
# We maintain the "datastring" information, Final command information

$expnum = -1;
for ($i = $start_arg;  $i <= $#ARGV; $i++) {
    $filename = $ARGV[$i]; 
    open(FILE, $filename);
    while (<FILE>) {
	if (/EXECUTION NUM = (\d+).* STARTED/) { # Execution started
	    $expnum = $1;
	}

	if (/EXECUTION NUM = (\d+).* DONE/) {
	    # Execution done. Update execution's info
	    $key = "$filename#$final_comm";
	    $travinfo = $trav_hash{$key};
	    if ($travinfo && $key ne $$travinfo{POINT}) {
		print "Final command differs for two iterations: $key\n";
	    }
	    $diff = 0;
	    if ($$travinfo{DATA}) {
		# Assumes 2 points only XXX
		$diff = $data - $$travinfo{DATA};
	    }
	    $rec = { POINT => $key, DATA => $$travinfo{DATA} + $data,
		     NUM => $$travinfo{NUM} + 1, DIFF => $diff};
	    $trav_hash{$key} = $rec;
	    $expnum = $1;
	}
	if (/Final command = (.*)/) {
	    $final_comm = $1;
	}
	if (/$datastring\s*(=|:)\s*(.*)/) {
	    $data = $2;
	}
    }
    close(FILE);
}

foreach $trav (sort keys %trav_hash) {
    $travinfo = $trav_hash{"$trav"};
    $trav_name = parse_traversal($trav);
    if (!$$travinfo{POINT}) {
	$$travinfo{POINT} = 1;
	print "Traversal $trav_name has no data\n";
    }
    $avg = $$travinfo{DATA}/$$travinfo{NUM};
    if (!$avg) { $avg = -1;}
    $diffperc = $$travinfo{DIFF} * 100/$avg;

    print "Trav = $trav_name\n";
    printf("Avg $datastring = $avg (%4.2f\%, $$travinfo{NUM})\n", $diffperc);
}
