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

REM //--------------------------------------------------------------------------
REM // * Sat Mar 11 22:34:25 JST 2017 Naoyuki Sawa
REM // - 1st リリース。
REM //   dRegTblC.exe等が出力したC#形式のソースファイルに含まれている定数定義を、C言語形式のヘッダファイルに変換するバッチスクリプトです。
REM //   当バッチスクリプトを作成した目的は、以下の通りです。
REM // - 2017/02/27〜に、dRegTblC.exe等のツールに'-xcs'オプションを追加して、C#形式のソースファイルを出力出来るように変更しました。
REM //   C#プログラムで使う分にはそれで良いのですが、別のツールのスクリプトの定数定義として使う場合は、問題が有る事に気付きました。
REM //   例えば、dDirSeqC.exeに入力する演出シーケンサスクリプトは、dEnmDefC.exeが生成した列挙定義の定数に依存している事が多いです。
REM //   そのため、MkDirSeq.batを使うと、dEnmDefC.exeが生成した列挙定義と、演出シーケンサスクリプトをまとめてcpp.exeでプリプロセスし、演出シーケンサスクリプト内の定数を置き換えています。
REM //   2017/02/27以前は、dEnmDefC.exeが生成する列挙定義(,及び,各ツールが出力するソース)は必ずC言語形式のヘッダファイルだったので、上記の処理を行う際に特に注意する点はありませんでした。
REM //   しかし、2017/02/27以降は、dEnmDefC.exeが生成する列挙定義(,及び,各ツールが出力するソース)は、C#形式のソースファイルである可能性も有るようになりました。
REM //   列挙定義がC#形式のソースファイルだった場合は、cpp.exeが解釈する事は出来ず、演出シーケンサスクリプト内の定数を置き換える事が出来ません。(他のツールやスクリプトの場合も同様です。)
REM // - 解決方法の一つとしては、dEnmDefC.exeを'-xcs'と'-xc'で二回実行して、C#形式のソースファイルとC言語形式のヘッダファイルを両方生成する方法が考えられます。
REM //   しかし、定数定義の形式のためだけに、データ全体を生成する処理を二回実行するというのは、無駄が多く良くないと思いました。
REM //   特に、dLotTblC.exeやdRegTblC.exe等では、大きな入力スクリプトを扱う事が多く、時間が掛かる処理を二回行いたくありません。
REM // - そこで別の方法として、C#形式のソースファイルに含まれている定数定義を、C言語形式のヘッダファイルに変換するだけの、バッチスクリプト(当ファイルです)を作成して対応する事にしました。
REM //   例えば、以下のように使用して下さい。
REM //   │dTexDefC.exe      -rRegTexDef.txt -uEnmTexDef.txt TexDef.txt				テクスチャ定義スクリプトから、列挙定義スクリプトを生成する。
REM //   │dEnmDefC.exe -xcs -rRegEnmDef.txt                 EnmTexDef.txt > EnmDef.cs		列挙定義スクリプトから、C#形式のソースファイルを生成する。
REM //   │CALL ConvertCsToH.bat EnmDef.cs > EnmDef.h						C#形式のソースファイルを、C言語形式のヘッダファイルに変換する。
REM //   │cat.exe EnmDef.h DirSeq.txt | dDirSeqC.exe -xcs -rRegDirSeq.txt > DirSeq.cs		C言語形式のヘッダファイルを用いて、演出シーケンサスクリプト内のスプライト番号等を置き換えて、コンパイルする。
REM //   │DEL                               EnmDef.h						C言語形式のヘッダファイルはもう不要なので、削除する。(残しておいても構いません。)
REM // - 上記の例は、各ツールを直接呼び出した例です。
REM //   2017/03/11現在は、C#形式のソースファイルを出力する場合は、MkDirSeq.bat等のような、一連の手順を定義したバッチスクリプトは用意していません。
REM //   もし今後、C#形式のソースファイルを出力する場合についても、バッチスクリプトを作成する場合は、その中で、ConvertCsToH.batを利用する予定です。

REM //--------------------------------------------------------------------------
REM //■使い方
REM //│CALL ConvertCsToH.bat dRegTblC.exe等が出力したC#形式のソースファイル ...

REM //--------------------------------------------------------------------------
REM //「static partial class Const {」〜「}」の間に有る、「public const int シンボル = 値;」を、「#define シンボル 値」に置き換える。
REM //□【開発メモ】
REM //│sedの'-e'オプションは、個々にコマンドのブロックが閉じていなくても、問題無く動作する事に気付きました。(これまで知らなかった…)
REM //│下記のように、大きなブロックを、複数の'-e'オプションに分割して指定しても、問題無く動作しました。
REM //│どうやらsedの'-e'オプションは、個々の'-e'オプションで指定されたブロックを個別に解釈するのではなく、全部の'-e'オプションを連結してからまとめて解釈するようです。
onigsed.exe -n ^
            -e "/^[[:blank:]]*static[[:blank:]]\+partial[[:blank:]]\+class[[:blank:]]\+Const[[:blank:]]*{[[:blank:]]*\(\/\/.*\)\?$/,/^[[:blank:]]*}[[:blank:]]*\(\/\/.*\)\?$/{              " ^
            -e "#             ~~~~~~             ~~~~~~~             ~~~~~             ~~~~~            ~            ~~~~~~~~~~~~                 ~            ~~~~~~~~~~~~                 " ^
            -e "#             static             partial             class             Const            {               //  〜                    }               //  〜                    " ^
            -e "    /^[[:blank:]]*public[[:blank:]]\+const[[:blank:]]\+int[[:blank:]]\+\([_[:alnum:]]\+\)[[:blank:]]*=[[:blank:]]*\(.*[^[:blank:]]\)[[:blank:]]*;[[:blank:]]*\(\/\/.*\)\?$/{" ^
            -e "    #             ~~~~~~             ~~~~~             ~~~             ~~~~~~~~~~~~~~~~~~            ~            ~~~~~~~~~~~~~~~~~~            ~            ~~~~~~~~~~~~   " ^
            -e "    #             public             const             int                     〜                    =                    〜                    ;               //  〜      " ^
            -e "        s//#define \1 \2/p                                                                                                                                                  " ^
            -e "    }                                                                                                                                                                       " ^
            -e "}                                                                                                                                                                           " ^
            %*
IF ERRORLEVEL 1 GOTO L_ERR

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

REM //--------------------------------------------------------------------------
:L_ERR
ECHO ###エラーが発生しました。
REM //PAUSE
EXIT /B 1
