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

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 // * Fri Nov 20 21:44:18 JST 2015 Naoyuki Sawa
REM // - dDirSeqC.exeの変更に伴い、sedでトリガ名をトリガ番号に置換する処理を削除しました。
REM //   今後は、dDirSeqC.exe自身が、トリガ名をトリガ番号に変換します。
REM //   この変更に伴い、アプリケーションプロジェクトフォルダに「ﾄﾘｶﾞ定義.txt」が有っても無意味になりました。
REM // * Mon Dec 21 21:46:29 JST 2015 Naoyuki Sawa
REM // - エラーが発生した時に、不完全な最終出力ファイルを確実に削除するようにしました。
REM // * Sun Jan 03 21:17:56 JST 2016 Naoyuki Sawa
REM // - dDirSeqC.exeの'-p'オプションを廃止した事に伴い、当バッチファイルも変更しました。
REM //   詳細は、/clip/tool/dDirSeqC/winapp.h の同日のコメントを参照して下さい。
REM // * Sat Jan 23 21:37:38 JST 2016 Naoyuki Sawa
REM // - パイプライン実行に、pipefail.exeを使用するように変更しました。
REM //   処理内容には、変更は有りません。
REM // * Thu Mar 02 22:09:26 JST 2017 Naoyuki Sawa
REM // - 「演出シーケンサコンパイラ」を実行する手順に、"-rRegDirSeq.txt"を追加して、演出文字列のレジストリスクリプトを生成するようにしました。
REM //   詳細は、/clip/tool/dDirSeqC/winapp.hの、同日のコメントを参照して下さい。
REM // * Sun Mar 26 22:13:56 JST 2017 Naoyuki Sawa
REM // - 環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM // * Mon Mar 27 22:39:32 JST 2017 Naoyuki Sawa
REM // - 環境変数'CSHARP'が定義された場合に、ConvertCsToH.batを使ってC#形式の出力ソースからC言語形式のヘッダファイルを生成する処理も、当バッチスクリプトに含めました。
REM //   C#プロジェクトでC言語形式のヘッダファイルが必要かどうかは各アプリケーション次第なので、この処理は当バッチスクリプトでなく各アプリケーションのバッチスクリプトに書こうかとも思ったのですが、
REM //   実際の所、他のツールのスクリプトへの入力としてC言語形式のヘッダファイルは大抵必要なので、毎回、各アプリケーションのバッチスクリプトに書く手間を省くために、当バッチスクリプトに含めました。
REM //   不要ならば、各アプリケーションのバッチスクリプトで、当バッチスクリプトを呼び出した後、当バッチスクリプトが生成したC言語形式のヘッダファイルを削除して下さい。

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

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

REM //--------------------------------------------------------------------------
REM //□「演出シーケンサコンパイラ」を実行します。
REM //{{2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM //REM //環境変数'DIRSEQ_BIN'が定義されていなければ、テキスト形式で出力します。
REM //IF "%DIRSEQ_BIN%" EQU "" (
REM //  dDirSeqC.exe -e -rRegDirSeq.txt                %TMPNAM% > DirSeq.c
REM //  IF ERRORLEVEL 1 GOTO L_ERR
REM //  REM //DirSeq.cから、ラベル定義の行を抽出して、DirSeq.hを作成します。
REM //  onigsed.exe -n -e "/^#define /p" ^
REM //                 -e "/^\(const int TBL_DirTblNo\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
REM //   < DirSeq.c > DirSeq.h
REM //  IF ERRORLEVEL 1 GOTO L_ERR
REM //REM //環境変数'DIRSEQ_BIN'が定義されてたら、バイナリ形式で出力します。
REM //) ELSE (
REM //  dDirSeqC.exe -e -rRegDirSeq.txt -o%DIRSEQ_BIN% %TMPNAM% > DirSeq.h
REM //  IF ERRORLEVEL 1 GOTO L_ERR
REM //)
REM //↓2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM //□環境変数'CSHARP'が定義されていなければ、出力ソースをC言語形式とする。
IF "%CSHARP%" EQU "" (
  REM //環境変数'DIRSEQ_BIN'が定義されていなければ、テキスト形式で出力します。
  IF "%DIRSEQ_BIN%" EQU "" (
    dDirSeqC.exe -e      -rRegDirSeq.txt                %TMPNAM% > DirSeq.c
    IF ERRORLEVEL 1 GOTO L_ERR
    REM //DirSeq.cから、ラベル定義の行を抽出して、DirSeq.hを作成します。
    onigsed.exe -n -e "/^#define /p" ^
                   -e "/^\(const int TBL_DirTblNo\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
     < DirSeq.c > DirSeq.h
    IF ERRORLEVEL 1 GOTO L_ERR
  REM //環境変数'DIRSEQ_BIN'が定義されてたら、バイナリ形式で出力します。
  ) ELSE (
    dDirSeqC.exe -e      -rRegDirSeq.txt -o%DIRSEQ_BIN% %TMPNAM% > DirSeq.h
    IF ERRORLEVEL 1 GOTO L_ERR
  )
REM //□環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とする。
) ELSE (
  REM //環境変数'DIRSEQ_BIN'が定義されていなければ、テキスト形式で出力します。
  IF "%DIRSEQ_BIN%" EQU "" (
    dDirSeqC.exe -e -xcs -rRegDirSeq.txt                %TMPNAM% > DirSeq.cs
    IF ERRORLEVEL 1 GOTO L_ERR
    REM //C#形式ではソース一つなので、ラベル定義の行を抽出する処理は不要です。
  REM //環境変数'DIRSEQ_BIN'が定義されてたら、バイナリ形式で出力します。
  ) ELSE (
    dDirSeqC.exe -e -xcs -rRegDirSeq.txt -o%DIRSEQ_BIN% %TMPNAM% > DirSeq.cs
    IF ERRORLEVEL 1 GOTO L_ERR
  )
  REM //{{2017/03/27追加:環境変数'CSHARP'が定義された場合に、ConvertCsToH.batを使ってC#形式の出力ソースからC言語形式のヘッダファイルを生成する処理も、当バッチスクリプトに含めました。
  CALL ConvertCsToH.bat DirSeq.cs > DirSeq.h
  IF ERRORLEVEL 1 GOTO L_ERR
  REM //}}2017/03/27追加:環境変数'CSHARP'が定義された場合に、ConvertCsToH.batを使ってC#形式の出力ソースからC言語形式のヘッダファイルを生成する処理も、当バッチスクリプトに含めました。
)
REM //}}2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
DEL %TMPNAM%

REM //--------------------------------------------------------------------------
REM //ECHO 完了しました。
REM //PAUSE
EXIT /B

REM //--------------------------------------------------------------------------
:L_ERR
REM //□不完全な最終出力ファイルを確実に削除します。
IF EXIST    DirSeq.h   DEL    DirSeq.h
IF EXIST    DirSeq.c   DEL    DirSeq.c
IF EXIST    DirSeq.cs  DEL    DirSeq.cs
IF EXIST RegDirSeq.txt DEL RegDirSeq.txt
IF "%DIRSEQ_BIN%" NEQ "" IF EXIST "%DIRSEQ_BIN%" DEL "%DIRSEQ_BIN%"
ECHO ###エラーが発生しました。
REM //PAUSE
EXIT /B 1
