@ECHO OFF
SETLOCAL
SET BATDIR=%~dp0

REM ■使い方
REM │CALL MkDirSeq.bat 演出シーケンサスクリプト [[演出シーケンサスクリプト] ...]
REM │(演出シーケンサスクリプトの書式は、dDirSeqC.exeの説明を参照してください。)

REM □DirSeq.hとDirSeq.cが既に有れば、確実に削除しておきます。
IF EXIST DirSeq.h DEL DirSeq.h
IF EXIST DirSeq.c DEL DirSeq.c

REM □カレントディレクトリに「ﾄﾘｶﾞ定義.txt」というファイルが在ったら、トリガ名の置換を行います。
REM │トリガ名の置換には、onigsed.exeを使用することにしました。
REM │cpp.exeやm4.exeでは、1文字目が数字のトリガ名を置換できず、'1on','3off'等に対応できないからです。
REM │「ﾄﾘｶﾞ定義.txt」の書式は、1列目=置換後の数値,2列目=置換前のトリガ名,[3列目以降=任意のコメント等(無くても可)]。
REM │----- ｢ﾄﾘｶﾞ定義.txt｣のサンプル:ここから -----
REM ││書式に一致しない行は無視されます。(たとえばこの行のように)
REM ││1	lv	ﾚﾊﾞｰｵﾝ
REM ││2	st	回転開始
REM ││3	btn	ﾁｬﾝｽﾎﾞﾀﾝ
REM ││4	1on	第1停止
REM ││5	2on	第2停止
REM ││6	3on	第3停止
REM ││7	3off	全停止
REM ││8	dmy	ﾀﾞﾐｰ
REM ││9	bet	次ﾍﾞｯﾄ
REM │----- ｢ﾄﾘｶﾞ定義.txt｣のサンプル:ここまで -----
IF EXIST ﾄﾘｶﾞ定義.txt (
	onigsed.exe -ne "/^\([[:digit:]]\+\)[[:blank:]]\+\([_[:alnum:]]\+\).*$/s//s\/\\b\2\\b\/\1\/g/p" ﾄﾘｶﾞ定義.txt > __tmp__.sed
) ELSE (
	ECHO.>__tmp__.sed
)
REM □'cpp.exe'も通しているので、演出シーケンサスクリプト内でCプリプロセッサの疑似命令も使えます。
REM │'cpp.exe'に'-P'を指定していないので'# 行番号 "ファイル名"'が生成されますが、dDirSeqC.exeがコメントとして無視するので問題ありません。
REM │'cpp.exe'に'-P'を指定してもしなくても同じ結果になるはずです。
onigsed.exe -f __tmp__.sed %* | cpp.exe > __tmp__.txt
DEL __tmp__.sed

REM □「演出シーケンサコンパイラ」を実行します。
dDirSeqC.exe __tmp__.txt > DirSeq.c
IF ERRORLEVEL 1 EXIT /B 1
DEL __tmp__.txt

REM □DirSeq.cから、以下の行を抽出して、DirSeq.hを作成します。
REM ・"DirTbl_"で始まるインデクスの定義⇒そのまま出力します。
REM   "DirTbl_"で始まらないインデクスの定義は、スクリプト内部で使用するサブルーチンのローカルシンボルと見なし、DirSeq.hには出力しないことにしました。
REM   尚、ローカルシンボルの概念は、当バッチファイル独自の概念であり、dDirSeqC.exeにはローカル/グローバルの区別もシンボルの名前付け規約もありません。
REM ・データ配列の定義⇒データ配列の宣言に変換して出力します。
REM │http://www.gnu.org/software/sed/manual/html_node/Addresses.html
REM │The empty regular expression ‘//’ repeats the last regular expression match (the same holds if the empty regular expression is passed to the s command).
REM │Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression.
onigsed.exe -n -e "/^#define DirTbl_/p" ^
               -e "/^\(const unsigned char TBL_DirSeq\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
 < DirSeq.c > DirSeq.h
IF ERRORLEVEL 1 EXIT /B 1
