@ECHO OFF
SETLOCAL
SET BATDIR=%~dp0

REM ■使用ソフトバージョン
REM 
REM xdoc2txt 2.00 (Jan 15 2013)
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 * Mon Feb 17 16:52:08 JST 2014 Naoyuki Sawa
REM - 使用するsedを、P/ECE開発環境付属の「GNU sed version 3.02」から、
REM   「GNU sed version 4.1.5 (for Windows) Modified for Win32 Japanese by hogemuta@gmail.com Build date is Sep 29 2009」へ移行しました。
REM   移行した理由は、「GNU sed version 3.02」を使って、長い行(500文字overぐらい)に対する処理を行うと、強制終了することがあったからです。
REM   強制終了する症状は、特定の環境のWindows Xpでしか発生せず、まだ原因を特定できていません。
REM   しかし、ともかく「GNU sed version 4.1.5」を使うと大丈夫のようなので、「GNU sed version 4.1.5」を使って回避することにしました。
REM - 「GNU sed version 4.1.5」へ移行したことに伴い、sedスクリプト内で「\t」が使用できるようになりました。
REM   スクリプトの読み易さのため、スクリプト内のタブ文字を、「\t」に変更しました。
REM 
REM * Fri Aug 15 23:58:34 JST 2014 Naoyuki Sawa
REM - 使用するsedを、「GNU sed version 4.1.5 (for Windows) Modified for Win32 Japanese by hogemuta@gmail.com Build date is Sep 29 2009」から、
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   当バッチファイルとは別の件で、前者に正規表現のバグらしき挙動が有り、後者を使うと正しく動作する事が有ったからです。
REM   前者のバグとは、[[:blank:]]が全角数字にマッチしたり、最終行の「$」を正しく判断できないことがありました。
REM   後者では正しく動作したので、後者の方が安定していると判断しました。

REM LotTbl.hとLotTbl.cが既に有れば、確実に削除しておきます。
IF EXIST LotTbl.h DEL LotTbl.h
IF EXIST LotTbl.c DEL LotTbl.c

REM ■説明
REM 
REM □xdoc2txt.exe %* ^
REM xdoc2txtを使って、エクセルファイルをタブ区切りのテキストストリームに変換し、標準出力に出力します。
REM 
REM □ | onigsed.exe -e ":top;$!N;s/\n\t/\t/;t top;P;D" ^
REM xdoc2txtは、『「文字列式」及び「文字列を参照するセル」の後ろに、余分な改行を出力する』というバグがあります。
REM そこで、以下の条件に基づいて、余分な改行を取り除くことにしました。
REM ⇒エクセル内の非空行は、全て左端列から記述する。
REM 上記の条件により、xdoc2txtが出力したテキストファイルの先頭にタブが有った場合、本来は前行の継続と見なせます。
REM sedを用いて、先頭にタブのある行を、前行に連結します。
REM なお、今回に限らず、sedの「N」コマンドは常に「$!」付きで使用するよう、注意してください。
REM sedの「N」コマンドを最終行で実行すると、次の行が読み込めず、即、終了してしまうからです。(sedの仕様です)
REM 
REM □ | onigsed.exe -e "/^\[/d" ^
REM xdoc2txtは、シート毎に"[シート名]"を出力するので、それらを取り除きます。
REM 
REM □ | onigsed.exe -e "s/\t*\/\/.*//" ^
REM エクセル内の「//」以降をコメントとして扱いたいため、「//」以降を削除します。
REM 末尾の空フィールドも削除するため、「//」に先行するタブも合わせて削除します。
REM 
REM □ | tee.exe __tmp__.csv ^
REM Awkスクリプトでエラーが発生した場合に、Awkスクリプトの入力内容を参照したいため、一時ファイルに保存します。
REM 必須ではありません。
REM 
REM □ | gawk.exe --re-interval -f %BATDIR%MkLotTbl.awk ^
REM タブ区切りのテキストストリームを、C言語の抽選データに変換するAwkスクリプトです。
REM 詳細は、MkLotTbl.awkのコメントを参照してください。
REM 
REM □  | onigsed.exe -n -e "/{{HEADER/,/}}HEADER/w LotTbl.h" ^
REM                    -e "/{{SOURCE/,/}}SOURCE/w LotTbl.c"
REM ヘッダ部とソース部に切り分けて保存します。

xdoc2txt.exe %* ^
 | onigsed.exe -e ":top;$!N;s/\n\t/\t/;t top;P;D" ^
 | onigsed.exe -e "/^\[/d" ^
 | onigsed.exe -e "s/\t*\/\/.*//" ^
 | tee.exe __tmp__.csv ^
 | gawk.exe --re-interval -f %BATDIR%MkLotTbl.awk ^
 | onigsed.exe -n -e "/{{HEADER/,/}}HEADER/w LotTbl.h" ^
                  -e "/{{SOURCE/,/}}SOURCE/w LotTbl.c"

REM LotTbl.hとLotTbl.cの作成途中でエラー中断した場合は、ファイルを削除して、バッチスクリプトをエラー終了します。
IF EXIST LotTbl.h ( grep.exe -q "}}HEADER" LotTbl.h || DEL LotTbl.h )
IF EXIST LotTbl.c ( grep.exe -q "}}SOURCE" LotTbl.c || DEL LotTbl.c )
IF NOT EXIST LotTbl.h EXIT /B 1
IF NOT EXIST LotTbl.c EXIT /B 1
