#// * Thu Dec 04 21:26:42 JST 2014 Naoyuki Sawa
#// - 1st リリース。
#//   MkLotSym.batとMkLotSym.awkはまだ、有効に使えるかの検証中である。
#//   本日の時点では、まだMakefileのテンプレートには組み入れていない。

#//抽選表の中の、特定のセル文字列を、シンボルに変換するスクリプトです。
#//MkLotTbl.batの、前段の処理として、使用します。
#//USAGE:
#//	gawk.exe -f MkLotSym.awk 入力ファイル > 出力ファイル
#//暗黙の入力ファイル:
#//	LotSym.txt
#//暗黙の出力ファイル:
#//	LotSym.h

#//*****************************************************************************
#//エラーメッセージを表示して終了します。
function die(s) {
	print "### " s > "/dev/stderr"
	exit (_die_exit = 1)
}

#*******************************************************************************
#//開始時の処理を行います。
BEGIN {
	#//フィールドセパレータをタブに設定します。(CSV入力)(CSV出力)
	FS = OFS = "\t"
	#//「セル文字列⇒シンボル」変換表を読み込みます。
	#// - 「セル文字列⇒シンボル」変換表のファイル名は、"LotSym.txt"に固定です。
	#//   あらかじめ、LotSym.xlsを変換して、LotSym.txtを生成しておいてください。
	#// - 異なるセル文字列が、共通のシンボルに変換されても、構いません。
	#//   <例>"左中右"⇒"Lc","①②③"⇒"Lc"
	#// - セル文字列を、数値に変換しても構いません。その場合、"LotSym_"は付与されません。
	#//   <例>"1ﾎﾟｲﾝﾄ獲得"⇒"1","100ﾎﾟｲﾝﾄ獲得"⇒"100"
	fp = "LotSym.txt"
	while((getline < fp) > 0) {
		if(NF == 2) {
			#//aLotSym[]には、"LotSym.txt"から読み込んだ全ての組合せを登録します。
			#//実際に出現したシンボルは、この後の処理でaSymbol[]に登録して行きます。
			if($1 in aLotSym) {
				die(fp "(" FNR ")" "セル文字列「" $1 "」が重複しています。")	#//異なるセル文字列が共通のシンボルに変換されても構わないが、同じセル文字列が複数回出現することは不可である。
			}
			#//aDesc[]に、このシンボルに対応するセル文字列を、全て記憶しておきます。
			#//"LotSym.h"を出力する時に、コメントとして出力するためです。
			if($2 in aDesc) { aDesc[$2] = aDesc[$2] "," }
			aDesc[$2] = aDesc[$2] $1
		}
		aLotSym[$1] = $2
	}
	close(fp)
}

#//*****************************************************************************
#//毎行の処理を行います。
{
	#//抽選列のid行,又は,データ行ならば…
	if(NF >= 2) {
		for(i = 1; i <= NF; i++) {
			#//抽選列のid行ならば、二列目以降の全てのセルを処理します。
			if(($1 == "id") && (i == 1)) { continue }
			#//データ行ならば、一列目のセルだけを処理します。
			if(($1 != "id") && (i != 1)) { continue }
			#//セル文字列が、「セル文字列⇒シンボル」変換表に登録されていたら、変換します。
			if($i in aLotSym) {
				$i = aLotSym[$i]
				#//変換結果が数値以外ならば、シンボルと見なします。
				if($i !~ /^(|0|[1-9][0-9]*)$/) {
					#//実際に出現したシンボルを、aSymbol[]に登録します。
					aSymbol[$i]++
					#//抽選表の中のシンボルに、"LotSym_"を付与します。
					$i = "LotSym_" $i
				}
			}
		}
	}
	#//出力します。
	print
}

#//*****************************************************************************
#//終了時の処理を行います。
END {
	#//シンボルを名前順にソートします。
	#//同時に、一番長い名前の長さを求めます。
	maxLen = 0
	for(s in aSymbol) {
		a[length(a) + 1] = s
		len = length(s)
		if(len > maxLen) { maxLen = len }
	}
	n = asort(a)
	#//数値の桁数を求めます。
	if(n < 10) {
		numLen = 1		#//0～9
	} else if(n < 100) {
		numLen = 2		#//10～99
	} else if(n < 1000) {
		numLen = 3		#//100～999
	} else if(n < 10000) {
		numLen = 4		#//1000～9999
	} else {
		numLen = 5		#//10000～
	}
	#//"LotSym.h"を出力します。
	iLotSym = 2	#//0=Hz,1=Htに予約し、2から開始することにします。
	fp = "LotSym.h"
	for(i = 1; i <= n; i++) {
		s = a[i]
		if(s == "Hz") {
			id = 0		#//0=Hz
		} else if(s == "Ht") {
			id = 1		#//1=Ht
		} else {
			id = iLotSym++
		}
		printf "#define LotSym_%-*s %*d //%s\n", maxLen, s, numLen, id, aDesc[s]	> fp
	}
	close(fp)
}
