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

REM //--------------------------------------------------------------------------
REM // * Fri Jun 26 21:07:18 JST 2015 Naoyuki Sawa
REM // - 1st リリース。
REM // * Wed Jul 01 21:52:52 JST 2015 Naoyuki Sawa
REM // - 'cpp.exe'を通さないように変更しました。
REM //   有限状態機械マップスクリプト内の'%{〜%}'の中に、#includeや条件マクロを書いた場合、実際にコンパイルするよりも先に展開されてしまい、
REM //   実際にコンパイルする時のインクルードパスが指定されていないためにエラーになったり、異なる設定で展開されてしまう事を避けるためです。
REM // - 本日、dFsmMapC.exe自体に'行末のバックスラッシュで行継続する機能'を追加したので、行末のバックスラッシュによる行継続は使用可能です。
REM // * Mon Dec 21 21:46:29 JST 2015 Naoyuki Sawa
REM // - エラーが発生した時に、不完全な最終出力ファイルを確実に削除するようにしました。
REM // * Thu Jan 07 21:54:54 JST 2016 Naoyuki Sawa
REM // - 状態マップ番号,状態番号,遷移番号の定義を、列挙定義スクリプトとしてRegFsmMap.txtへ出力するように変更しました。
REM //   これまでは、状態マップ番号,状態番号,遷移番号の定義も、グローバル関数宣言と一緒にFsmMap.hへ生成していましたが、
REM //   今後は、FsmMap.hにはグローバル関数宣言だけが出力されます。
REM // - 状態マップ番号,状態番号,遷移番号の定義の#define定義は、RegFsmMap.txtを列挙定義コンパイラでコンパイルして生成して下さい。
REM //   その際に生成される列挙定義のレジストリスクリプトを利用して、状態マップ番号,状態番号,遷移番号の名前変換が可能になります。
REM //   詳細は、/clip/tool/dFsmMapC/winapp.h の同日のコメントを参照して下さい。
REM // - 名前変換が不要ならば、列挙定義コンパイラが生成する#define定義のみ使用し、レジストリスクリプトは使わなくても構いません。
REM //   特にP/ECEの場合はメモリ節約が重要なので、状態マップ番号,状態番号,遷移番号の名前変換が不要ならば、そのようにして下さい。
REM // * Fri Mar 04 21:22:19 JST 2016 Naoyuki Sawa
REM // - 有限状態機械スクリプトの中に書いたプロパティテーブルスクリプトを、PrpFsmMap.txtへ出力するように変更しました。
REM //   詳細は、/clip/tool/dFsmMapC/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 MkFsmMap.bat 有限状態機械マップスクリプト [[有限状態機械マップスクリプト] ...]
REM //│(有限状態機械マップスクリプトの書式は、dFsmMapC.exeの説明を参照してください。)

REM //--------------------------------------------------------------------------
REM //□'cpp.exe'を通しているので、有限状態機械マップスクリプト内でCプリプロセッサの疑似命令も使えます。
REM //│'cpp.exe'に'-P'を指定していないので'# 行番号 "ファイル名"'が生成されますが、dFsmMapC.exeがコメントとして無視するので問題ありません。
REM //│'cpp.exe'に'-P'を指定してもしなくても同じ結果になるはずです。
REM //{{2015/07/01変更:'cpp.exe'を通さないように変更しました。
REM //dpesc5c.exe %* | cpp.exe > %TMPNAM%
REM //↓2015/07/01変更:'cpp.exe'を通さないように変更しました。
      dpesc5c.exe %*           > %TMPNAM%
REM //}}2015/07/01変更:'cpp.exe'を通さないように変更しました。
IF ERRORLEVEL 1 GOTO L_ERR

REM //--------------------------------------------------------------------------
REM //□「有限状態機械マップコンパイラ」を実行します。
REM //{{2016/01/07変更:状態マップ番号,状態番号,遷移番号の定義を、列挙定義スクリプトとしてRegFsmMap.txtへ出力するように変更しました。
REM //dFsmMapC.exe -e -rRegFsmMap.txt -tFsmMap.c %TMPNAM% > FsmMap.h
REM //IF ERRORLEVEL 1 GOTO L_ERR
REM //↓2016/01/07変更:状態マップ番号,状態番号,遷移番号の定義を、列挙定義スクリプトとしてRegFsmMap.txtへ出力するように変更しました。
REM //dFsmMapC.exe -e -rRegFsmMap.txt -tFsmMap.c -uEnmFsmMap.txt %TMPNAM% > FsmMap.h
REM //IF ERRORLEVEL 1 GOTO L_ERR
REM //↓2016/03/04変更:有限状態機械スクリプトの中に書いたプロパティテーブルスクリプトを、PrpFsmMap.txtへ出力するように変更しました。
REM //dFsmMapC.exe -e -rRegFsmMap.txt -tFsmMap.c -uEnmFsmMap.txt -pPrpFsmMap.txt %TMPNAM% > FsmMap.h
REM //IF ERRORLEVEL 1 GOTO L_ERR
REM //↓2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM //□環境変数'CSHARP'が定義されていなければ、出力ソースをC言語形式とする。
IF "%CSHARP%" EQU "" (
  dFsmMapC.exe -e      -rRegFsmMap.txt -tFsmMap.c -uEnmFsmMap.txt -pPrpFsmMap.txt %TMPNAM% > FsmMap.h
  IF ERRORLEVEL 1 GOTO L_ERR
REM //□環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とする。
) ELSE (
  dFsmMapC.exe -e -xcs -rRegFsmMap.txt            -uEnmFsmMap.txt -pPrpFsmMap.txt %TMPNAM% > FsmMap.cs
  IF ERRORLEVEL 1 GOTO L_ERR
  REM //{{2017/03/27追加:環境変数'CSHARP'が定義された場合に、ConvertCsToH.batを使ってC#形式の出力ソースからC言語形式のヘッダファイルを生成する処理も、当バッチスクリプトに含めました。
  CALL ConvertCsToH.bat FsmMap.cs > FsmMap.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    FsmMap.h   DEL    FsmMap.h
IF EXIST    FsmMap.c   DEL    FsmMap.c
IF EXIST    FsmMap.cs  DEL    FsmMap.cs
IF EXIST RegFsmMap.txt DEL RegFsmMap.txt
IF EXIST EnmFsmMap.txt DEL EnmFsmMap.txt
IF EXIST PrpFsmMap.txt DEL PrpFsmMap.txt
ECHO ###エラーが発生しました。
REM //PAUSE
EXIT /B 1
