#!/usr/local/bin/perl

if ($#ARGV > -1) {
    @dirs = ($ARGV[0]);
}
else {
    system "/bin/mv -f timings timings.old";
   @dirs = ('Bigloo','Clisp','CMUCL','CSL','GCL','MITScheme','Oak','Scheme48','Talk','Vscheme','Youtoo');
}

if ($#ARGV > 0) {
    @progs = ($ARGV[1]);
}
else {
#    @progs = ('arith0','div','rec','tak','takl','takr','vec');
#    @progs = ('div','rec','tak','takl','takr','vec');
    @progs = ('nfib');
}

if ($#ARGV > 1) {
    $verbose = 1;
}

print "*** Dirs: @dirs\n";
print "*** Progs: @progs\n";
$cwd='/net/dominica/denton_export/Ju2/dev/EuLysses/Bench';

$cl_settings="(proclaim (quote (optimize (safety 2) (speed 3) (space 0) (debug 0))))";

foreach $prog (@progs) {
    foreach $dir (@dirs) {
	### ---------------------------------------------
	### ALLEGRO
	if ($dir eq 'ACL') {
	    system "cd $dir; cat $cwd/$prog.lisp > $prog.cl";
	    $cmd0= "(progn $cl_settings (compile-file \"$prog.cl\"))";
	    $cmd1 = "$cl_settings (load \"$prog\") (run)";
	    $cmd2 = "$cl_settings (load \"$prog\")";
	    $impl = 'acl -qq -batch';
	    compute_times('acl', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### BIGLOO (interpretation)
	if ($dir eq 'Bigloo') {
	    system "cd $dir; cat $cwd/$prog.sch > $prog.sch";
	    $cmd0= "(exit 1)";
	    $cmd1 = "(begin (load \"$prog.sch\") (run))";
	    $cmd2 = "(load \"$prog.sch\")";
	    $impl = 'bigloo -s';
	    compute_times('bigloo1', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### BIGLOO (compilation)
	if ($dir eq 'Bigloo') {
	    $prog1 = "$prog" . "1.sch";
	    $prog2 = "$prog" . "2.sch";
	    system "cd $dir; echo \"(module $prog)\" > $prog1";
	    system "cd $dir; cat $cwd/$prog.sch >> $prog1";
	    system "cd $dir; echo \"\" >> $prog1";
	    system "cd $dir; echo \"(run)\" >> $prog1";
	    system "cd $dir; echo \"(module $prog)\" > $prog2";
	    system "cd $dir; cat $cwd/$prog.sch >> $prog2";
	    system "cd $dir; echo >> $prog2";
	    $impl = 'bigloo';
	    compute_times('bigloo2', 'c', $dir, $cmd0, $prog1, $prog2, $impl, $verbose);
	}
	### ---------------------------------------------
	### CLISP
	if ($dir eq 'Clisp') {
	    system "cd $dir; cat $cwd/$prog.lisp > $prog.lisp";
	    $cmd0= "(progn $cl_settings (compile-file \"$prog.lisp\"))";
	    $cmd1 = "(progn $cl_settings (load \"$prog\") (run))";
	    $cmd2 = "(progn $cl_settings (load \"$prog\"))";
	    $impl = 'clisp';
	    compute_times('clisp', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### CMU COMMON LISP
	if ($dir eq 'CMUCL') {
	    system "cd $dir; cat $cwd/$prog.lisp > $prog.lisp";
	    $cmd0= "(progn $cl_settings (compile-file \"$prog.lisp\") (unix:unix-exit))";
	    $cmd1 = "(progn $cl_settings (load \"$prog\") (run) (unix:unix-exit))";
	    $cmd2 = "(progn $cl_settings (load \"$prog\") (unix:unix-exit))";
	    $impl = 'cmucl';
	    compute_times('cmu', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### CSL
	if ($dir eq 'CSL') {
	    system "cd $dir; cat $cwd/$prog.csl > $prog.csl";
	    $cmd1 = "(progn (rdf (quote $prog!.csl)) (run))";
	    $cmd2 = "(rdf (quote $prog!.csl))";
	    $impl = 'csl';
	    compute_times('csl', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### EUSCHEME
	if ($dir eq 'Euscheme') {
	    system "cd $dir; cat $cwd/$prog.em > $prog.em";
	    $cmd0= "()";
	    $cmd1 = "(!> $prog) (run)";
	    $cmd2 = "(!> $prog)";
	    $impl = 'euscheme';
	    compute_times('euscheme', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### GCL
	if ($dir eq 'GCL') {
	    system "cd $dir; cat $cwd/$prog.lisp > $prog.lisp";
	    $cmd0= "(progn $cl_settings (compile-file \"$prog.lisp\"))";
	    $cmd1 = "(progn $cl_settings (load \"$prog.o\") (run))";
	    $cmd2 = "(progn $cl_settings (load \"$prog\"))";
	    $impl = 'gcl';
	    compute_times('gcl', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### MIT SCHEME
	if ($dir eq 'MITScheme') {
	    system "cd $dir; cat $cwd/$prog.sch > $prog.sch";
	    $cmd1 = "(begin (load \"$prog.sch\") (run))";
	    $cmd2 = "(load \"$prog.sch\")";
	    $impl = 'MITScheme';
	    compute_times('mit', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### OAKLISP
	if ($dir eq 'Oak') {
	    system "cd $dir; cat $cwd/$prog.oak > $prog.oak";
	    $cmd1 = "(let () (load \"$prog.oak\") (run) (exit))";
	    $cmd2 = "(let () (load \"$prog.oak\") (exit))";
	    $impl = 'oaklisp';
	    compute_times('oaklisp', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### SCHEME 48
	if ($dir eq 'Scheme48') {
	    system "cd $dir; cat $cwd/$prog.sch > $prog.sch";
	    $cmd0= ",exit";
	    $cmd1 = "(begin (load \"$prog.sch\") (run)) ,exit";
	    $cmd2 = "(load \"$prog.sch\") ,exit";
	    $impl = 'scheme48';
	    compute_times('s48', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### TALK
	if ($dir eq 'Talk') {
	    system "cd $dir; cat $cwd/$prog.t > $prog.t";
	    $cmd0= "(analyze-program-unit (quote $prog) buildp: t)";
	    $cmd1 = "(progn (load-program-unit (quote $prog)) (run))";
	    $cmd2 = "(progn (load-program-unit (quote $prog)))";
	    $impl = 'italk';
	    compute_times('talk', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### VSCHEME
	if ($dir eq 'Vscheme') {
	    system "cd $dir; cat $cwd/$prog.sch > $prog.sch";
	    $cmd0= "42";
	    $cmd1 = "(begin (load \"$prog.sch\") (run))";
	    $cmd2 = "(load \"$prog.sch\")";
	    $impl = 'vscheme';
	    compute_times('vscheme', 'i', $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose);
	}
	### ---------------------------------------------
	### YOUTOO
	if ($dir eq 'Youtoo' || $dir eq 'Youtoo.i386') {
	    $cmd0= "-help";
	    $prog1 = "$prog" . "1";
	    $prog2 = "$prog" . "2";
	    system "cd $dir; cat $cwd/$prog1.em > $prog1.em";
	    system "cd $dir; cat $cwd/$prog2.em > $prog2.em";
#	    system "unset LD_LIBRARY_PATH";
#	    system "source $dir/makeso.Path";
	    $impl = 'youtoo1 -o a.out -l level1 -l math -no_recompile';
	    compute_times('youtoo1', 'c', $dir, $cmd0, $prog1, $prog2, $impl, $verbose);
#	    system "unset LD_LIBRARY_PATH";
#	    system "source $dir/makeso.Path";
#	    $impl = 'youtoo2 -o a.out -l level1 -l math -no_recompile';
#	    compute_times('youtoo2', 'c', $dir, $cmd0, $prog1, $prog2, $impl, $verbose);
	}
    }
}

sub compute_times {
    local($key, $interp, $dir, $cmd0, $cmd1, $cmd2, $impl, $verbose) = @_;
    print "\n";
    print " *** Dir: $dir\n";
    print " *** Prog: $prog\n";
    print " *** Type: $interp\n";
    if ($verbose == 1) {
	print " *** Cmd1: $cmd1\n";
	print " *** Cmd2: $cmd2\n";
	print " *** Impl: $impl\n";
	print " =================== start process ================\n";
    }
    ($user1, $sys1, $total1) = &get_times($interp, $dir, $cmd0, $cmd1, $impl, $verbose);
    ($user2, $sys2, $total2) = &get_times($interp, $dir, $cmd0, $cmd2, $impl, $verbose);
    $user = $user1 - $user2;
    $sys = $sys1 - $sys2;
    $total = $total1 - $total2;
    open(OUT,'>>timings') || die "Cannot open timings";
    print(OUT "$key\t$prog\t$total\t$user\t$sys\n");
    close(OUT);
    print " *** User $user\n";
    print " *** System $sys\n";
    print " *** Total $total\n";
    if ($verbose == 1) {
	print " =================== stop process =================\n";
    }
}

sub get_times {
    local($interp, $dir, $cmd0, $cmd, $impl, $verbose) = @_;

    if ($interp eq 'i') {
        ### INTERPRETATION
	print " *** cd $dir; echo '$cmd0' | $impl 2>&1; echo '$cmd' | $cwd/Time $impl 2>&1 |\n";
	open(foo, "cd $dir; echo '$cmd0' | $impl 2>&1; echo '$cmd' | $cwd/Time $impl 2>&1 |");
    }
    else {
	### COMPILIATION
	print " *** cd $dir; ./makeso.Path; $impl $cmd; $cwd/Time ./a.out 2>&1 |\n";
	open(foo, "cd $dir; source ./makeso.Path; $impl $cmd; $cwd/Time ./a.out 2>&1 |");
    }
    while (<foo>) {
	if ($verbose == 1) {
	    print " *** $_";
	}
	### ---------------------------------------------
	### Get the user time
	if (/^user\s*(\d+):(\d+\.?\d*|.\d+)$/) {
	    print "*** Minutes: $1 Seconds: $2\n";
	    $user = ($1 * 60) + $2;
	}
	if (/^user\s*(\d+\.?\d*|.\d+)$/) {
	    $user = $1;
	}
	### ---------------------------------------------
	### Get the system time
	if (/^sys\s*(\d+):(\d+\.?\d*|.\d+)$/) {
	    print "*** Minutes: $1 Seconds: $2\n";
	    $sys = ($1 * 60) + $2;
	}
	if (/^sys\s*(\d+\.?\d*|.\d+)$/) {
	    $sys = $1;
	    if ($sys < 0) {
		$sys = 0;
	    }
	}
    }
    close foo;
    $total = $user + $sys;
    @res = ($user, $sys, $total);
    @res;
}

