@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET BATDIR=%~dp0
SET TMPNAM=%~n0.tmp
SET TMPLST=%~n0.lst
SET TMPDIR=%~n0.dir\

REM //--------------------------------------------------------------------------
REM // * Mon Feb 16 22:03:21 JST 2015 Naoyuki Sawa
REM // - 1st リリース。
REM // - 抽選表変換ツールを、MkLotTbl.awk⇒dLotTblC.exeへ移行したことに伴い、
REM //   これまではMkLotTbl.awkを呼び出していたMkLotTbl.batを、dLotTblC.exeを呼び出すように変更しました。
REM // - 古いMkLotTbl.batとMkLotTbl.awkは不要になったので、toolフォルダから削除しました。
REM //   しかし、これまで安定して動作していた実績が有り、今後参考にするかも知れないので、
REM //   「keep/11_MkLotTbl_bat_MkLotTbl_awk_削除前保存.20150216/」に保存しておきました。
REM // * Sat Feb 21 13:26:55 JST 2015 Naoyuki Sawa
REM // - dLotTblC.exe自身が抽選表idを扱うようになったことに伴い、MkLotTbl.batを変更しました。
REM //   変更前のMkLotTbl.batは、「clip/keep/12_MkLotTblNo_bat_MkLotTblNo_awk_削除前保存.20150221」に保存しておきました。
REM // * Wed Feb 25 21:01:46 JST 2015 Naoyuki Sawa
REM // - 環境変数'LOTTBL_BIN'によって、テキスト形式とバイナリ形式の出力を選択できるようにしました。
REM //   環境変数'LOTTBL_BIN'が定義されていなければ、テキスト形式で出力します。出力ファイル=LotTbl.h,LotTbl.c
REM //   環境変数'LOTTBL_BIN'が定義されていたら、バイナリ形式で出力します。出力ファイル=LotTbl.h,%LOTTBL_BIN%
REM // * Sun Mar 01 12:04:24 JST 2015 Naoyuki Sawa
REM // - エクセルファイル以外も指定できるようにしました。
REM //   エクセルファイルを指定した場合は、これまでと同様に動作します。
REM // - ただし、引数の最初のファイルだけで判断しているので、エクセルファイルとそれ以外を混在して指定する事は出来ません。
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 // * Sun Mar 15 21:44:53 JST 2015 Naoyuki Sawa
REM // - 環境変数'IGNHITVALDUP'が'0'以外の値に定義されていたら、dLotTblC.exeの'-i'オプションを指定するようにしました。
REM // * Mon Dec 21 21:46:29 JST 2015 Naoyuki Sawa
REM // - エラーが発生した時に、不完全な最終出力ファイルを確実に削除するようにしました。
REM // * Sun Jan 03 21:17:56 JST 2016 Naoyuki Sawa
REM // - dLotTblC.exeの'-p'オプションを廃止した事に伴い、当バッチファイルも変更しました。
REM //   詳細は、/clip/tool/dLotTblC/winapp.h の同日のコメントを参照して下さい。
REM // * Fri Jan 15 21:04:54 JST 2016 Naoyuki Sawa
REM // - 大幅に変更しました。変更点は以下の通りです。
REM //   ・入力ファイルに、エクセルとそれ以外を混在出来るようになりました。
REM //     これまでは、最初の入力ファイルだけを調べて、全ての入力ファイルがエクセルかそれ以外かを判定していたので、混在できませんでした。
REM //     今回、個々の入力ファイルについてエクセルかそれ以外かを判定するようにしたので、エクセルとそれ以外を混在出来るようになりました。
REM //   ・LotSym.hを暗黙にインクルードするのをやめました。
REM //     これまでは、カレントフォルダに有るLotSym.hを、暗黙に先頭にインクルードするようにしていました。
REM //     そうしていた理由は、これまでは入力ファイルにエクセルとそれ以外を混在出来なかったので、入力ファイルがエクセルの時もシンボル定義用のヘッダだけはインクルード出来るようにするためでした。
REM //     今回、入力ファイルにエクセルとそれ以外を混在出来るようになったので、LotSym.hを暗黙にインクルードする必要は無くなりました。
REM //     今後は、シンボル定義用のヘッダファイルが必要ならば、明示的に入力ファイルに指定して下さい。
REM //     シンボル定義用のヘッダファイルの名前は、LotSym.hでなくても、任意のファイル名で構いません。
REM // - 変更前のMkLotTbl.batは、keepフォルダ内に保存して*いません*。
REM //   変更前のMkLotTbl.batも、安定して動作していた実績が有るので、もし参照する必要がある場合は、前回のアーカイブを参照して下さい。
REM // * Sat Jan 23 21:37:38 JST 2016 Naoyuki Sawa
REM // - パイプライン実行に、pipefail.exeを使用するように変更しました。
REM //   処理内容には、変更は有りません。
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 // * Thu Apr 26 23:59:59 JST 2018 Naoyuki Sawa
REM // - OOXML形式(*.xlsx,*.xlsm)ならば、DumpXlsx.exeを使ってcsvに変換するように変更しました。
REM //   尚、古いXLS形式(*.xls)ならば、これまで通りExcelSaveAsCsv.batを使ってcsvに変換します。
REM // - OOXML形式の場合にDumpXlsx.exeを使うようにした理由は、安定性のためです。
REM //   OOXML形式でもExcelSaveAsCsv.batを使って変換する事は出来るのですが、ExcelSaveAsCsv.batはエクセルを起動してマクロを実行しているため遅かったり、実行環境やエクセルのバージョンに依存して微妙に挙動や結果が異なる場合がありました。
REM //   DumpXlsx.exeならばツール自身で変換を行うので、上記のような問題は発生しないので、今後はDumpXlsx.exeを使うように変更しました。
REM //   ただし、DumpXlsx.exeは古いXLS形式には対応していないので、古いXLS形式の場合のみ引き続きExcelSaveAsCsv.batを使う事にしました。
REM //   今後、古いXLS形式を使う事は減って行くはずなので、完全に不要になったと判断したら、ExcelSaveAsCsv.batを使う処理は削除しても良いかも知れません。

REM //--------------------------------------------------------------------------
REM //■使い方
REM //│MkLotTbl.bat 入力ファイル [入力ファイル ...]
REM //■使用ソフトバージョン
REM //GNU sed version 4.1.5 with Oniguruma (ver. 2.5.0) Modified for Win32 Japanese by hogemuta@gmail.com Build date Sep 29 2009
REM //GNU Awk 3.1.7 (windows special Nov 24 2009)

REM //--------------------------------------------------------------------------
REM //一時フォルダを作成する。既に存在している場合は空にする。
IF NOT EXIST %TMPDIR%      MD  %TMPDIR%
IF     EXIST %TMPDIR%*.csv DEL %TMPDIR%*.csv
REM //ファイルリストが既に存在している場合は、削除する。
IF     EXIST %TMPLST%      DEL %TMPLST%

REM //--------------------------------------------------------------------------
REM //各入力ファイルについて…
FOR %%i IN (%*) DO (
  REM //拡張子の「.(3文字)」の部分を取得する。
  SET ext=%%~xi
  SET ext=!ext:~0,4!
  REM //拡張子が「.xls*」ならば…
  IF /I "!ext!" EQU ".xls" (
REM //{{2018/04/26変更:OOXML形式(*.xlsx,*.xlsm)ならば、DumpXlsx.exeを使ってcsvに変換するように変更しました。
REM //    REM //エクセルファイルをcsvに変換し、一時フォルダに出力する。
REM //    CALL %BATDIR%ExcelSaveAsCsv.bat /D%TMPDIR% %%i
REM //    IF ERRORLEVEL 1 GOTO L_ERR
REM //↓2018/04/26変更:OOXML形式(*.xlsx,*.xlsm)ならば、DumpXlsx.exeを使ってcsvに変換するように変更しました。
    REM //古いXLS形式(*.xls)ならば、ExcelSaveAsCsv.batを使ってcsvに変換し、一時フォルダに出力する。
    IF /I "%%~xi" EQU ".xls" (
      CALL %BATDIR%ExcelSaveAsCsv.bat /D%TMPDIR% %%i
      IF ERRORLEVEL 1 GOTO L_ERR
    REM //OOXML形式(*.xlsx,*.xlsm)ならば、DumpXlsx.exeを使ってcsvに変換し、一時フォルダに出力する。
    ) ELSE (
      DumpXlsx.exe %%i > %TMPDIR%%%~ni.csv
      IF ERRORLEVEL 1 GOTO L_ERR
    )
REM //}}2018/04/26変更:OOXML形式(*.xlsx,*.xlsm)ならば、DumpXlsx.exeを使ってcsvに変換するように変更しました。
  REM //拡張子が「.xls*」以外ならば…
  ) ELSE (
    REM //ファイルリストに登録する。
    ECHO %%i >> %TMPLST%
    IF ERRORLEVEL 1 GOTO L_ERR
  )
)
REM //一時フォルダに出力したcsvが有れば、ファイルリストに登録する。
REM // - '/S'オプションは必要です。
REM //   '/S'オプションを付けないと、一時フォルダからの相対パス(つまりファイル名のみ)になってしまいます。
IF EXIST %TMPDIR%*.csv (
  DIR /B /S %TMPDIR%*.csv >> %TMPLST%
  IF ERRORLEVEL 1 GOTO L_ERR
)
REM //ファイルリストに登録した各ファイルを連結し、
REM //Cプリプロセッサで処理し、
REM //csvに変換した時に付けられた行末の余分な','が有れば削除し、
REM //一時ファイルに保存する。
pipefail.exe -q dpcat.exe -f %TMPLST% ^
             ^| dpesc5c.exe ^
             ^| cpp.exe ^
             ^| onigsed.exe -e "s/\([[:blank:]]*,[[:blank:]]*\)*$//" ^
 > %TMPNAM%
IF ERRORLEVEL 1 GOTO L_ERR
REM //一時フォルダとファイルリストはもう不要なので、削除する。
RD /S /Q %TMPDIR%
DEL      %TMPLST%

REM //--------------------------------------------------------------------------
SET DLOTTBLC_FLAGS=-e
REM //環境変数'IGNHITVALDUP'が'0'以外の値に定義されていたら、dLotTblC.exeの'-i'オプションを指定する。
IF "%IGNHITVALDUP%" NEQ "" (
  IF "%IGNHITVALDUP%" NEQ "0" (
    SET DLOTTBLC_FLAGS=%DLOTTBLC_FLAGS% -i
  )
)
REM //抽選テーブルコンパイラを実行する。
REM //{{2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM //REM //環境変数'LOTTBL_BIN'が定義されていなければ、テキスト形式で出力します。
REM //IF "%LOTTBL_BIN%" EQU "" (
REM //  dLotTblC.exe %DLOTTBLC_FLAGS%                %TMPNAM% > LotTbl.c
REM //  IF ERRORLEVEL 1 GOTO L_ERR
REM //  REM //LotTbl.cから、抽選表id定義の行を抽出して、LotTbl.hを作成します。
REM //  onigsed.exe -n -e "/^#define LotTblNo_/p" ^
REM //                 -e "/^\(const int TBL_LotTblNo\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
REM //                 -e "/^\(const unsigned short TBL_LotTbl\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
REM //   < LotTbl.c > LotTbl.h
REM //  IF ERRORLEVEL 1 GOTO L_ERR
REM //REM //環境変数'LOTTBL_BIN'が定義されてたら、バイナリ形式で出力します。
REM //) ELSE (
REM //  dLotTblC.exe %DLOTTBLC_FLAGS% -o%LOTTBL_BIN% %TMPNAM% > LotTbl.h
REM //  IF ERRORLEVEL 1 GOTO L_ERR
REM //)
REM //↓2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM //□環境変数'CSHARP'が定義されていなければ、出力ソースをC言語形式とする。
IF "%CSHARP%" EQU "" (
  REM //環境変数'LOTTBL_BIN'が定義されていなければ、テキスト形式で出力します。
  IF "%LOTTBL_BIN%" EQU "" (
    dLotTblC.exe %DLOTTBLC_FLAGS%                     %TMPNAM% > LotTbl.c
    IF ERRORLEVEL 1 GOTO L_ERR
    REM //LotTbl.cから、抽選表id定義の行を抽出して、LotTbl.hを作成します。
    onigsed.exe -n -e "/^#define LotTblNo_/p" ^
                   -e "/^\(const int TBL_LotTblNo\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
                   -e "/^\(const unsigned short TBL_LotTbl\[[1-9][0-9]*\]\)={$/{s//extern \1;/;p}" ^
     < LotTbl.c > LotTbl.h
    IF ERRORLEVEL 1 GOTO L_ERR
  REM //環境変数'LOTTBL_BIN'が定義されてたら、バイナリ形式で出力します。
  ) ELSE (
    dLotTblC.exe %DLOTTBLC_FLAGS%      -o%LOTTBL_BIN% %TMPNAM% > LotTbl.h
    IF ERRORLEVEL 1 GOTO L_ERR
  )
REM //□環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とする。
) ELSE (
  REM //環境変数'LOTTBL_BIN'が定義されていなければ、テキスト形式で出力します。
  IF "%LOTTBL_BIN%" EQU "" (
    dLotTblC.exe %DLOTTBLC_FLAGS% -xcs                %TMPNAM% > LotTbl.cs
    IF ERRORLEVEL 1 GOTO L_ERR
    REM //C#形式ではソース一つなので、ラベル定義の行を抽出する処理は不要です。
  REM //環境変数'LOTTBL_BIN'が定義されてたら、バイナリ形式で出力します。
  ) ELSE (
    dLotTblC.exe %DLOTTBLC_FLAGS% -xcs -o%LOTTBL_BIN% %TMPNAM% > LotTbl.cs
    IF ERRORLEVEL 1 GOTO L_ERR
  )
  REM //{{2017/03/27追加:環境変数'CSHARP'が定義された場合に、ConvertCsToH.batを使ってC#形式の出力ソースからC言語形式のヘッダファイルを生成する処理も、当バッチスクリプトに含めました。
  CALL ConvertCsToH.bat LotTbl.cs > LotTbl.h
  IF ERRORLEVEL 1 GOTO L_ERR
  REM //}}2017/03/27追加:環境変数'CSHARP'が定義された場合に、ConvertCsToH.batを使ってC#形式の出力ソースからC言語形式のヘッダファイルを生成する処理も、当バッチスクリプトに含めました。
)
REM //}}2017/03/26変更:環境変数'CSHARP'が定義されていたら、出力ソースをC#形式とするようにしました。
REM //一時ファイルはもう不要なので、削除する。
DEL      %TMPNAM%

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

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