#!/usr/bin/awk -f

function check_lang(prg, cfmt,x,y,lang,m1,m2) {
	cfmt = CONVFMT
	lang = ENVIRON["LANG"]
	CONVFMT = "%+.3e"
	x = 1.23
	y = "" x
	if("+1.230e+00"!=y) {
		# try to change language to "C" at run time
		ENVIRON["LANG"] = "C"
		x = 1.23
		y = "" x
		if("+1.230e+00"!=y) {
			m1 = ": numeric format of language '"
			m2 = "' not supported"
			print prg m1 lang m2 >> "/dev/stderr"
			m1 = ": set the environment variable LANG to C before running "
			print prg m1 prg >> "/dev/stderr"
			err = 1
			exit 1
		}
	}
	CONVFMT = cfmt
}

function print_usage(msg, col,i) {
	if(msg!="") print "printac: " msg >> "/dev/stderr"
	print "usage: printac [-h] (RUN|RFILE|-) AUTO_CONSTANT" >> "/dev/stderr"
	print "AUTO_CONSTANT is one of:" >> "/dev/stderr"
	col = 1
	for(i=1; ac_names[i]!=""; ++i) {
		printf(" %-6s", ac_names[i]) >> "/dev/stderr"
		if(++col > 5) {col = 1; print "" >> "/dev/stderr" }
	}
	if(col > 1) print "" >> "/dev/stderr"
	err = 1
	exit 1
}

function exists(fname, status) {
	status = getline < fname
	close(fname)
	return ( status != -1 )
}

function run_name(run, fname) {
	if(run == "-") return run
	
	fname = "data/r." run
	if(exists(fname)) return fname
	
	fname = run
	if(exists(fname)) return fname
	
	print "printac: run or file '" run "' does not exist" >> "/dev/stderr"
	err = 1
	exit 1
}

function print_read_error(FName,line, m1) {
	m1 = "printac: error while reading line "
	print m1 line " of file " FName >> "/dev/stderr"
	exit 1
}

function read_constants_file(FName, line) {
	line = 1
	if(1 != (getline < FName)) print_read_error(FName, line++)
	ac_vals["NDIM"] = $1
	if(1 != (getline < FName)) print_read_error(FName, line++)
	if(1 != (getline < FName)) print_read_error(FName, line++)
	ac_vals["NTST"] = $1
	ac_vals["NCOL"] = $2
	if(1 != (getline < FName)) print_read_error(FName, line++)
	ac_vals["NMX"] = $1
	ac_vals["RL0"] = $2
	ac_vals["RL1"] = $3
	ac_vals["A0"]  = $4
	ac_vals["A1"]  = $5
	if(1 != (getline < FName)) print_read_error(FName, line++)
	ac_vals["NPR"] = $1
	if(1 != (getline < FName)) print_read_error(FName, line++)
	ac_vals["EPSL"] = $1
	ac_vals["EPSU"] = $2
	ac_vals["EPSS"] = $3
	if(1 != (getline < FName)) print_read_error(FName, line++)
	ac_vals["DS"]    = $1
	ac_vals["DSMIN"] = $2
	ac_vals["DSMAX"] = $3
	close(FName)
}

BEGIN {
	check_lang("printac")
	
	ac_names[ 1]="NDIM"
	ac_names[ 2]="NTST"
	ac_names[ 3]="NCOL"
	ac_names[ 4]="NMX"
	ac_names[ 5]="NPR"
	ac_names[ 6]="RL0"
	ac_names[ 7]="RL1"
	ac_names[ 8]="A0"
	ac_names[ 9]="A1"
	ac_names[10]="EPSL"
	ac_names[11]="EPSU"
	ac_names[12]="EPSS"
	ac_names[13]="DS"
	ac_names[14]="DSMIN"
	ac_names[15]="DSMAX"
	
	if(ARGC < 2 || ARGV[1] == "-h") print_usage()
	if(ARGC < 3) print_usage("too few arguments")
	if(ARGC > 4) print_usage("too many arguments")

	CFile = run_name(ARGV[1])
	CName = ARGV[2]

	for(i in ac_names) ac_vals[ac_names[i]]
	
	if( !(CName in ac_vals) )
		print_usage("constants name " CName " not recognised")

	read_constants_file(CFile)
	print ac_vals[CName]
}
