#//
#//	MkScnInf.awk
#//
#//	シーン管理データ作成スクリプト
#//
#//	* Mon Nov 09 21:43:23 JST 2015 Naoyuki Sawa
#//	- 1st リリース。
#//	  /clip/clipscnm.cモジュールで使用するデータを作成するスクリプトです。
#//	  /clip/tool/MkScnInf.batから呼び出して使用して下さい。
#//
#//----------------------------------------------------------------------------
#//エラーメッセージを表示して終了する。
function die(s) {
	print "### " s > "/dev/stderr"
	exit (_die_exit = 1)
}
#//----------------------------------------------------------------------------
BEGIN {
	print "ScnNo"
}
#//----------------------------------------------------------------------------
END {
	#//die()経由ならば、ENDのアクションを実行せずに終了させます。
	#//- Awkの仕様: 引数付きのexit文を最初に実行し、その後で引数無しのexit文を実行すると、その前に使った引数が終了ステータスとして使われる。
	if(_die_exit) { exit }

	print "end"
}
#//----------------------------------------------------------------------------
{
	#//'#'以降をｺﾒﾝﾄと見なして切り捨てる｡
	sub(/#.*/, "")
	#//空行は読み飛ばして、空行以外を処理する。
	if(!NF) { next }
	#//$1はシーン名,$2以降は全て1文字単位シーン情報と見なして、$2以降を連結する。
	#//$2以降の空白は読み易いように任意の位置に置いて良く、データ上の意味は無い。
	s = ""
	for(i = 2; i <= NF; i++) { s = s $i }
	if(!nLyr) {	#//最初のシーン定義行でレイヤ数を判断する。それ以降は全て同じレイヤ数でなければならない。
		nLyr = length(s)
		if((nLyr < 1) || (nLyr > 255)) { die(FILENAME "(" FNR "): レイヤ数が1〜255の範囲外です。") }
	}
	if(length(s) != nLyr) { die(FILENAME "(" FNR "): レイヤ数が一致しません。") }
	#//$2以降を全て連結した文字を、1文字=1レイヤと見なして処理する。
	delete a
	iLyr = 0
	for(i = 1; i <= nLyr; i++) {
		switch(substr(s, i, 1)) {
		case "R":	#//'reset'相当
			if(iLyr) { die(FILENAME "(" FNR "): 再生レイヤが複数指定されています。") }
			iLyr = i
			#//FALLTHRU
		case "x":	#//'delete'相当
			a[i] = 1
			break
		case "N":	#//'noreset'相当
			if(iLyr) { die(FILENAME "(" FNR "): 再生レイヤが複数指定されています。") }
			iLyr = i
			#//FALLTHRU
		case ".":	#//'through'相当
			a[i] = 0
			break
		default:
			die(FILENAME "(" FNR "): シーン情報の文字が不正です。")
			break
		}
	}
	#//'R'も'N'も指定されていなければ、iLyr==0となる。
	#//'R',又は,'N'が指定されていたら、iLyr>=1となる。
	#//これは、(再生レイヤ番号+1)に相当し、シーン情報の1バイト目に相当する。
	#//詳細は、clipscnm.cのScnMgr_GetLyrNo(),及び,ScnMgr_SetScn()を参照せよ。
	print "\tScnNo_" $1
		printf "\t\tScnInf\t= {%3d,", iLyr	#//シーン名,(このシーンの再生レイヤ番号+1)
		for(i = 1; i <= nLyr; i++) {		#//このシーンが停止するレイヤのビットマスク
			if((i >= 32) && ((i % 32) == 1)) { printf "\n\t\t\t       " }	#//見易さのために32レイヤ単位で改行する事にした。不要ならばこの行を削除せよ。
			printf "bit %d", a[i]
			if(i != nLyr) { printf "," }
		}
		printf "}\n"
	print "\tend"
}
