#!/usr/local/bin/perl
#

use Getopt::Long;
#use strict;
use FileHandle;

use vars qw($progname $mflag $iflag $print_all $rc @toprint %optctl $verbose);
use vars qw($tflag);

$progname = "mt2asc";

sub usage {
	print STDERR "usage: $progname [options] .mt0-file
 - convert HSPICE .measure file into tabular form
Options:
    -D P    Include parameter P in summary output
    -m      print min/max values
    -i      omit index
    -t      Omit headers
";
}

Getopt::Long::config('no_auto_abbrev',
                     'no_ignore_case','no_ignore_case_always');

$mflag = 0;
$iflag = 0;
$print_all = 1;
$rc = 0;
@toprint = ();

%optctl = ("D|display=s@"     => \@toprint,
           "m|minmax!"     => \$mflag,
           "i|noidex!"     => \$iflag,
           "t|notitles!"     => \$tflag,
           "v|verbose!"     => \$verbose
);

if(!GetOptions(%optctl)) {
	&usage();
        exit 1;
}

if($#toprint >= 0) {
	$print_all = 0;
}

if($#ARGV == -1) {
	&process_file( STDIN );
} else {
	my($fname, $fp);
	foreach $fname (@ARGV) {
		$fp = new FileHandle $fname, "r";
		if(!defined($fp)) {
			print STDERR "$fname: $@\n";
			exit 1;
		}
		$rc = process_file($fp);
		$fp->close();

		if($rc != 0) {
			last;
		}
			
	}
}

exit $rc;

#############################################################################

use vars qw(@gbl_titles);

sub process_file($)
{
	my($fp) = @_;

	my(@titles, %didx, $nvals, $t, $sweepno, $print_titles);

	# get header and first line of column titles
	hline: while($_ = <$fp>) {
		$_ =~ s/^\s*//;

		next hline if($_ =~ m/DATA1/);
		next hline if($_ =~ m/.TITLE/);

		#	if($_ !~ m/^index/) {
		#		die "index expected";
		#	}
		@titles = split(/\s+/, $_);
		last hline;
	}

	if(!defined(@gbl_titles)) {
		@gbl_titles = @titles;
		$print_titles = !$tflag;
	} else {
		my($i, $notsame);
		$notsame = 0;
		if($#titles != $#gbl_titles) {
			$notsame = 1;
		} else {
			t: for($i = 0; $i < $#titles; $i++) {
				if($titles[$i] ne $gbl_titles[$i]) {
					$notsame = 1;
					last t;
				}
			}
			if($notsame) {
				print STDERR "warning: column titles not same in all files\n";
				$print_titles = 1;
			}
		}
	}

	if ($titles[$#titles] ne 'alter#' ) {
		# get rest of column titles
		tline: while($_ = <$fp>) {
			my(@f);
			$_ =~ s/^\s*//;
			@f = split(/\s+/, $_);
			push(@titles, @f);
		
			last tline if ($_ =~ m/alter\#/);
		}
	}

	#print "titles=", join(',', @titles), "\n";
	$nvals = $#titles;
	# printf "%d values\n", $nvals+1;

	my($i);
	for ($i = 0; $i <= $nvals; $i++) {
		$didx{$titles[$i]} = $i;
		if ($print_all) {
			if ($titles[$i] ne 'index') {
				push(@toprint, $titles[$i]);
			}
		}
	}

	if (defined($didx{'index'}) && !$iflag) {
		if($toprint[0] ne 'index') {
			unshift(@toprint, 'index');
		}
	}

	# check that everything we're supposed to print really exists.
	foreach $t (@toprint) {
		if (!defined($didx{$t})) {
			print STDERR "$progname: no parameter $t found in input.\n";
			$rc = 1;
		}
	}
	if ($rc) {
		return $rc;
	}

	$sweepno = 0;


	# titles on output
	if ($print_titles) {
		foreach $t (@toprint) {
			printf " %11s", $t;
		}
		print "\n";
	}

	use vars qw(@minval @maxval);

	# initialize statistics
	for ($i = 0; $i <= $nvals; $i++) {
		$maxval[$i] = -1e12;
		$minval[$i] = 1e12;
	}

	# process each sweep
	sweep: while(!eof) {
		my($nd, @data, @d, $v, $t, $i);
		$nd = 0;
		@data = ();

		dline: while($_ = <$fp>) {
			chomp($_);
			$_ =~ s/^\s*//;
			#print "sweep=$sweepno line=\"$_\"\n";

			@d = split(/\s+/, $_);
			push(@data, @d);
			$nd = $#data;
			last dline if($nd >= $nvals);
			if (eof) {
				last dline;
			}
		}

		foreach $t (@toprint) {
			$v = $data[$didx{$t}];
			if (int($v) == $v) {
				printf "%9d ", $v;
			} elsif (abs($v) < 0.01) {
				printf "%12.3e ", $v;
			} else {
				printf "%12.3f ", $v;
			}
		}
		print "\n";

		for ($i = 0; $i <= $nvals; $i++) {
			if ($minval[$i] > $data[$i]) {
				$minval[$i] = $data[$i];
			}
			if ($maxval[$i] < $data[$i]) {
				$maxval[$i] = $data[$i];
			}
		}
		$sweepno++;
	}


	if ($mflag) {
		my($v);
		print "MIN:      ";
		foreach $t (@toprint) {
			if ($t ne 'index') {
				$v = $minval[$didx{$t}];
				if (int($v) == $v) {
					printf "%9d ", $v;
				} elsif (abs($v) < 0.01) {
					printf "%9.3e ", $v;
				} else {
					printf "%9.3f ", $v;
				}
			}
		}
		print "\n";

		print "MAX:      ";
		foreach $t (@toprint) {
			if ($t ne 'index') {
				$v = $maxval[$didx{$t}];
				if (int($v) == $v) {
					printf "%9d ", $v;
				} elsif (abs($v) < 0.01) {
					printf "%12.3e ", $v;
				} else {
					printf "%12.3f ", $v;
				}
			}
		}
		print "\n";

		print "MAX-MIN:  ";
		foreach $t (@toprint) {
			if ($t ne 'index') {
				$v = $maxval[$didx{$t}] - $minval[$didx{$t}];
				if (int($v) == $v) {
					printf "%9d ", $v;
				} elsif (abs($v) < 0.01) {
					printf "%12.3e ", $v;
				} else {
					printf "%12.3f ", $v;
				}
			}
		}
		print "\n";
	}

	return 0;
}

