@ECHO OFF
SETLOCAL
SET BATDIR=%~dp0

REM //--------------------------------------------------------------------------
REM // * Mon Jan 04 21:15:27 JST 2016 Naoyuki Sawa
REM // - 1st リリース。
REM //   C,C++ソースファイルから、グローバル定数の定義を抽出し、extern宣言に変換して、標準出力に出力します。

REM //--------------------------------------------------------------------------
REM //■使い方
REM //│①CALL MkExtCon.bat 入力ソースファイル [入力ソースファイル ...] > 出力ヘッダファイル
REM //│  指定された入力ソースファイルから、グローバル定数の定義を抽出し、extern宣言に変換して、標準出力に出力します。
REM //│②CALL MkExtCon.bat > 出力ヘッダファイル
REM //│  カレントフォルダに有る全てのC,C++ソースファイルから、グローバル定数の定義を抽出し、extern宣言に変換して、標準出力に出力します。
REM //□注意
REM //│当バッチファイルは、行の一文字目に'const 'と書いてある行だけを抽出します。
REM //│<例>
REM //││const int TBL_Data[][5]={	←この行を抽出します。
REM //││{0,1,2,3,4},
REM //││{5,6,7,8,9}};
REM //││↓出力結果
REM //││extern const int TBL_Data[][5];
REM //│行頭に空白文字が有る場合は、抽出しないので、注意して下さい。
REM //│このような仕様にした理由は、構造体定義の中のconstを、間違って抽出しないようにするためです。
REM //│<例>
REM //││struct ST_Data {
REM //││    int Size;
REM //││    const int* Ptr;		←この行は抽出しません。
REM //││};
REM //││↓出力結果
REM //││無し

REM //--------------------------------------------------------------------------
REM //入力ソースファイルが省略されたら、カレントフォルダに有る全てのC,C++ソースファイルを入力ファイルとします。
SET FILES=%*
IF "%FILES%" == "" SET FILES=*.c *.cpp

REM //--------------------------------------------------------------------------
REM //入力ソースファイルから、グローバル定数の定義を抽出し、extern宣言に変換して、標準出力に出力します。
ECHO //このファイルは%~nx0 %FILES%によって%DATE% %TIME%に自動生成されました。
ECHO #ifdef  __cplusplus
ECHO extern "C" {
ECHO #endif//__cplusplus
FOR %%i IN (%FILES%) DO (
	ECHO //%%i
	onigsed.exe -ne "/^\(const [^=]\+\).*$/s//extern \1;/p" %%i
	IF ERRORLEVEL 1 GOTO L_ERR
)
ECHO #ifdef  __cplusplus
ECHO }//extern "C"
ECHO #endif//__cplusplus

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

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