#//USAGE:
#//	gawk.exe -f MkDirSeqNo.awk 入力ファイル > 出力ファイル

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

#*******************************************************************************
#//開始時の処理を行います。
BEGIN {
	#//** no job **
}

#*******************************************************************************
/^#define[[:blank:]]+DirTbl_[_[:alnum:]]+[[:blank:]]+[1-9][0-9]*/ {
	#//定義を分割します。
	if($1 != "#define")                { die(FILENAME "(" FNR ")に、不正な定義があります。") }
	if($2 !~ /^DirTbl_[_[:alnum:]]+$/) { die(FILENAME "(" FNR ")に、不正な定義があります。") }
	if($3 !~ /^[1-9][0-9]*$/)          { die(FILENAME "(" FNR ")に、不正な定義があります。") }
	Name  = substr($2, 8)
	Index = $3
	#//ヘッダ文字列を追加します。
	aHeader[length(aHeader)+1] = sprintf("#define DirTblNo_%s %d",Name,++DirTblNo)	#//有効な番号を1〜にするため、プレインクリメントします。
	#//ソース文字列を追加します。
	aSource[length(aSource)+1] = sprintf("%d,//DirTblNo_%s",Index,Name)
}

#//*****************************************************************************
#//終了時の処理を行います。
END {
	#//die()経由ならば、ENDのアクションを実行せずに終了させます。
	#//- Awkの仕様: 引数付きのexit文を最初に実行し、その後で引数無しのexit文を実行すると、その前に使った引数が終了ステータスとして使われる。
	if(_die_exit) { exit }
	#//ヘッダ文字列を出力します。
	print "//{{HEADER"
	for(i = 1; i <= length(aHeader); i++) { print aHeader[i] }
	print "#define DirTblNo_Max " DirTblNo
	print "extern const int TBL_DirTblNo[DirTblNo_Max+1];"
	print "extern const unsigned char TBL_DirSeq[];"	#//アプリケーションがDirSeq.hをインクルードせずに済むよう、必要最小限の宣言をDirTblNo.hに含めることにした。
	print "//}}HEADER"
	#//ソース文字列を出力します。
	print "//{{SOURCE"
	print "const int TBL_DirTblNo[]={0,"
	for(i = 1; i <= length(aSource); i++) { print aSource[i] }
	print "};"
	print "//}}SOURCE"
}
