@ECHO OFF
SETLOCAL
SET BATDIR=%~dp0
SET TMPNAM=%~n0.tmp
SET TMPSED=%~n0.sed

REM //--------------------------------------------------------------------------
REM // * Mon Feb 23 21:02:26 JST 2015 Naoyuki Sawa
REM // - dDirSeqC.exe自身がラベルを扱うようになったことに伴い、MkDirSeq.batを変更しました。
REM //   変更前のMkDirSeq.batは、「clip/keep/13_MkDirSeqNo_bat_MkDirSeqNo_awk_削除前保存.20150223」に保存しておきました。
REM // * Wed Feb 25 21:01:46 JST 2015 Naoyuki Sawa
REM // - 環境変数'DIRSEQ_BIN'によって、テキスト形式とバイナリ形式の出力を選択できるようにしました。
REM //   環境変数'DIRSEQ_BIN'が定義されていなければ、テキスト形式で出力します。出力ファイル=DirSeq.h,DirSeq.c
REM //   環境変数'DIRSEQ_BIN'が定義されていたら、バイナリ形式で出力します。出力ファイル=DirSeq.h,%DIRSEQ_BIN%
REM // * Wed Mar 04 00:39:19 JST 2015 Naoyuki Sawa
REM // - 'cpp.exe'の前段に'dpesc5c.exe'を通すように変更しました。
REM //   コメント行の行末のマルチバイト文字の2バイト目が偶然'\'に一致して、Cプリプロセッサが誤って次の行も削除してしまう問題を、
REM //   当バッチファイル自身が回避するようになったので、当バッチファイルを呼び出す処理が明示的に回避する必要は無くなりました。
REM // * Fri Mar 06 21:00:56 JST 2015 Naoyuki Sawa
REM // - '-e'オプションを指定して、エラー発生時にエラーログファイルが生成されるようにしました。

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

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

REM //--------------------------------------------------------------------------
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 > %TMPSED%
  IF ERRORLEVEL 1 EXIT /B 1
) ELSE (
  ECHO.>%TMPSED%
)
REM //--------------------------------------------------------------------------
REM //□'cpp.exe'も通しているので、演出シーケンサスクリプト内でCプリプロセッサの疑似命令も使えます。
REM //│'cpp.exe'に'-P'を指定していないので'# 行番号 "ファイル名"'が生成されますが、dDirSeqC.exeがコメントとして無視するので問題ありません。
REM //│'cpp.exe'に'-P'を指定してもしなくても同じ結果になるはずです。
onigsed.exe -f %TMPSED% %* | dpesc5c.exe | cpp.exe > %TMPNAM%
IF ERRORLEVEL 1 EXIT /B 1
DEL %TMPSED%

REM //--------------------------------------------------------------------------
REM //□「演出シーケンサコンパイラ」を実行します。
REM //環境変数'DIRSEQ_BIN'が定義されていなければ、テキスト形式で出力します。
IF "%DIRSEQ_BIN%" EQU "" (
  dDirSeqC.exe -e -pDirTblNo_                %TMPNAM% > DirSeq.c
  IF ERRORLEVEL 1 EXIT /B 1
  REM //DirSeq.cから、ラベル定義の行を抽出して、DirSeq.hを作成します。
  onigsed.exe -n -e "/^#define DirTblNo_/p" ^
                 -e "/^\(const int TBL_DirTblNo\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
   < DirSeq.c > DirSeq.h
  IF ERRORLEVEL 1 EXIT /B 1
REM //環境変数'DIRSEQ_BIN'が定義されてたら、バイナリ形式で出力します。
) ELSE (
  dDirSeqC.exe -e -pDirTblNo_ -o%DIRSEQ_BIN% %TMPNAM% > DirSeq.h
  IF ERRORLEVEL 1 EXIT /B 1
)
DEL %TMPNAM%
