#!/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) {
	if(msg!="") print "bd2gd: " msg >> "/dev/stderr"
	print "usage: bd2gd [-h|-a] (RUN|PFILE|-) OFILE" >> "/dev/stderr"
	err = 1
	exit 1
}

function printb(msg1,nal,msg2,file, bdfmt) {
	bdfmt = (msg1=="") ? "%s%s%s\n" : "%s% .5e  %s\n"
	if(append) {
		printf bdfmt, msg1,nal,msg2 >> file
	} else {
		if(lines[file]++ == 0) {
			printf bdfmt, msg1,nal,msg2  > file
		} else {
			printf bdfmt, msg1,nal,msg2 >> file
		}
	}
}

function printa(msg1,nal,msg2,file, i) {
	if(msg1 == "") {
		if(!was_blank[file])
			for(i=0; i<blank_lines; ++i) {
				printb(msg1,nal,msg2,file)
			}
		was_blank[file] = 1
	} else {
		printb(msg1,nal,msg2,file)
		was_blank[file] = 0
	}
}

function save_gd( SS,ii,msg1,nal,msg2) {
	SS = (bdrows>1) ? bdrows-1 : 1.0
	for(ii=0; ii<bdrows; ++ii) {
		msg1 = substr(bdlines[ii],1,16)
		NAL  = ii/SS
		msg2 = substr(bdlines[ii],17)
		printa(msg1,NAL,msg2,gd_out)
	}
	printa("","","",gd_out)
	for(ii in bdlines) delete bdline[ii]
	bdrows=0
}

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

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

BEGIN {
	check_lang("bd2gd")
	
	if(ARGC < 3 || ARGV[1] == "-h") print_usage()

	append      = 0
	blank_lines = 1
	curr_arg    = 1
	
	if(ARGC > curr_arg && ARGV[curr_arg]=="-a") {
		if(ARGC < 4) print_usage("too few arguments")
		append = 1
	}
	curr_arg += append

	#if(ARGC > curr_arg && ARGV[curr_arg]=="-bl") {
	#	if(ARGC < 4+append) print_usage("too few arguments")
	#	blank_lines = ARGV[curr_arg+1]
	#	curr_arg += 2
	#}

	ARGV[1] = run_name(ARGV[curr_arg++])
	gd_out  = ARGV[curr_arg++]

	lines[gd_out]     = 0
	was_blank[gd_out] = 1
	
	bdrows = 0
	ARGC   = 2
}

# BR  PT  TY  LAB  PAR  L2-NORM  ...
#  1   2   3   4    5      6
              
$0 == "" { save_gd(); next }

$1 != 0 {
	bdlines[bdrows] = substr($0,5)
	bdrows++
}

END {
	if(err == "") {
		save_gd()
	}
}
