/*****************************************************************************
 * Bison/Flexプログラム部分をテストするための、Windowsアプリケーションの雛型 *
 * □ビルド・実行方法:                                                       *
 * ┃"C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"  *
 * ┃make -f winapp.mk run                                                   *
 *****************************************************************************/
#ifndef __WINAPP_H__
#define __WINAPP_H__
/*{{定型コード:winapp.h======================================================*/
#include <clip.h>
/* y.tab.y */
extern int yynerrs;
#if     (YYDEBUG!=0)
extern int yydebug;
#endif/*(YYDEBUG!=0)*/
int yyparse();
void yyerror(const char* fmt, ...);
/* lex.yy.l */
extern FILE* yyin;
extern FILE* yyout;
extern int yylineno;
int yylex();
void yylex_init(FILE* input_file);
/* winapp.c */
void push_location(const char* path);
void pop_location();
/*}}定型コード:winapp.h======================================================*/
//-----------------------------------------------------------------------------
//構造体定義
//-----------------------------------------------------------------------------
//スプライト
typedef struct _ST_Spr {
	char*		pSprLab;		//スプライト名。NULL不可。
	int		x, y;			//左上座標
	int		w, h;			//幅、高さ
	int		cx, cy;			//原点オフセット
	char*		Param;			//パラメータ
	//以下のフィールドは2パス目で格納する。
	int		iSprNo;			//このスプライトのスプライト番号。1ベース。
	char*		pTexLab;		//このスプライトが属するテクスチャのテクスチャ名。NULL不可。
} ST_Spr;
//テクスチャヘッダ
typedef struct _ST_TexHdr {
	char*		pTexLab;		//テクスチャ名。NULL不可。
	char*		pPath;			//ファイル名。一時的にはNULL可。1パス目完了時点でNULLのままならばエラー。
//{{2017/08/25削除:リソースフラグを廃止しました。
//	int		bResource;		//リソースフラグ。リソースフラグはP/ECE用のテクスチャ定義ヘッダだけに影響する。汎用の列挙定義,及び,レジストリスクリプトでは無視される。
//}}2017/08/25削除:リソースフラグを廃止しました。
//{{2017/03/26変更:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
//	int		bLoop;			//ループフラグ。ループフラグはレジストリスクリプトだけに出力する。Windowsでムービーグラフィックを再生する時に参照する。
//↓2017/03/26変更:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
	struct _ST_AttrList*	pAttrList;	//属性リスト。属性リストはレジストリスクリプトだけに出力する。Windowsでムービーグラフィックのループ設定やグラフィックの描画モードを設定する時等に参照する。
//}}2017/03/26変更:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
} ST_TexHdr;
//テクスチャボディ
typedef struct _ST_TexBody {
	int		nSpr;			//スプライト数。0以上。0ならばテクスチャ定義だけでスプライト定義が無い事を意味する。
	ST_Spr*		aSpr[/*nSpr*/];		//スプライト配列
} ST_TexBody;
//テクスチャ
typedef struct _ST_Tex {
	ST_TexHdr*	pTexHdr;		//テクスチャヘッダ。NULL不可。
	ST_TexBody*	pTexBody;		//テクスチャボディ。NULL不可。
	//以下のフィールドは2パス目で格納する。
	int		iTexNo;			//このテクスチャのテクスチャ番号。1ベース。
} ST_Tex;
//{{2017/03/26追加:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
typedef struct _ST_Attr {
	char*		pAttrName;		//属性名
	int		iAttrType;		//属性の種類	0=数値,1=文字列
	union {
		int	iVal;			//数値		(iAttrType==0)の場合はこちらのフィールドが有効です。
		char*	pStr;			//文字列	(iAttrType==1)の場合はこちらのフィールドが有効です。
	};
} ST_Attr;
typedef struct _ST_AttrList {
	GTree*		pAttrValTree;		//数値属性のツリー	┬違う種類で同じ名前の属性は存在しても良い。
	GTree*		pAttrStrTree;		//文字列属性のツリー	┘
} ST_AttrList;
//}}2017/03/26追加:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
//-----------------------------------------------------------------------------
//グローバル変数宣言
//-----------------------------------------------------------------------------
//{{2017/07/05削除:グリッドの原点を指定出来るようにしました。
//extern int grid_w, grid_h;
//}}2017/07/05削除:グリッドの原点を指定出来るようにしました。
//-----------------------------------------------------------------------------
//グローバル関数宣言
//-----------------------------------------------------------------------------
int cast_dbl_to_int(double d);
void addTex(ST_Tex* pTex);
ST_Tex* Tex_new(ST_TexHdr* pTexHdr, ST_TexBody* pTexBody);
//{{2017/03/26変更:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
//ST_TexHdr* TexHdr_new(char* pTexLab/*片方のみNULL可*/, char* pPath/*片方のみNULL可*/, int bResource, int bLoop);
//↓2017/03/26変更:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
//ST_TexHdr* TexHdr_new(char* pTexLab/*片方のみNULL可*/, char* pPath/*片方のみNULL可*/, int bResource, ST_AttrList* pAttrList);
//↓2017/08/25変更:リソースフラグを廃止しました。
ST_TexHdr* TexHdr_new(char* pTexLab/*片方のみNULL可*/, char* pPath/*片方のみNULL可*/, ST_AttrList* pAttrList);
//}}2017/08/25変更:リソースフラグを廃止しました。
//{{2017/07/05変更:グリッドの原点を指定出来るようにしました。
//ST_TexBody* TexBody_new(int iGridW, int iGridH);
//↓2017/07/05変更:グリッドの原点を指定出来るようにしました。
ST_TexBody* TexBody_new();
//}}2017/07/05変更:グリッドの原点を指定出来るようにしました。
ST_TexBody* TexBody_addSpr(ST_TexBody* pTexBody, ST_Spr* pSpr);
//{{2017/07/04追加:一つのテクスチャ定義ブロック内で、グリッドサイズを切り替えて、複数のスプライト定義ブロックを書けるようにしました。
ST_TexBody* TexBody_addTexBody(ST_TexBody* pTexBodyTo, ST_TexBody* pTexBodyFrom);
//}}2017/07/04追加:一つのテクスチャ定義ブロック内で、グリッドサイズを切り替えて、複数のスプライト定義ブロックを書けるようにしました。
ST_Spr* Spr_new( char* pSprLab, int x, int y, int w, int h, int cx, int cy, char* Param);
ST_Spr* Spr_newP(char* pSprLab, int x, int y, int w, int h, int px, int py, char* Param);
//{{2017/12/01追加:「'.'スプライト名」の書式を追加しました。
//char* SprLab_AddPrefix(char* pDotLab);
//↓2018/07/28コメント変更:テクスチャ名とスプライト名が同じ場合の簡略記法を追加しました。
char* SprLab_AddPrefix(char* pDotLab/*NULL可*/);
//}}2018/07/28コメント変更:テクスチャ名とスプライト名が同じ場合の簡略記法を追加しました。
//{{2017/03/26追加:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
ST_AttrList* AttrList_NewBlank();
ST_AttrList* AttrList_New(ST_Attr* pAttr);
ST_AttrList* AttrList_AddAttr(ST_AttrList* pAttrList, ST_Attr* pAttr);
ST_Attr* Attr_New(char* pAttrName, int iAttrType, intptr_t iVal_pStr);
//}}2017/03/26追加:テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
//-----------------------------------------------------------------------------
//{{2017/07/02追加:'-m'オプションを追加しました。
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
void* Bitmap_Load(const char* path);
void Bitmap_Free(void* _bitmap);
int Bitmap_GetWidth(void* _bitmap);
int Bitmap_GetHeight(void* _bitmap);
int Bitmap_GetPixel(void* _bitmap, int x, int y, int* r, int* g, int* b, int* a);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
//}}2017/07/02追加:'-m'オプションを追加しました。
//-----------------------------------------------------------------------------
//変更履歴
//-----------------------------------------------------------------------------
// * Sun Jan 10 21:20:52 JST 2016 Naoyuki Sawa
// - 1st リリース。
// * Thu Jan 14 21:10:13 JST 2016 Naoyuki Sawa
// - 列挙定義スクリプトを生成するオプション名を、'-m'⇒'-u'に変更しました。
//   オプション名をdFsmMapC.exeと統一するためです。
// * Tue Jan 26 21:39:05 JST 2016 Naoyuki Sawa
// - スプライトの中心位置を、サイズに対するパーセンテージでも指定出来るようにしました。
//   詳細は、y.tab.yのsprの処理,及び,winapp.cのSpr_newP()関数を参照して下さい。
//   この指定方法を追加した理由は、様々なサイズのスプライトに対して全て中央を中心にする場合、全て共通で'50%,50%'(又は'49%,49%',後述)の指定で済むからです。
// - 中央を指定する場合、50%ではなく、49%を指定する方が良い場合が有ります。
//   右(又は下)端を指定する場合、100%ではなく、99%を指定する方が良い場合が有ります。
//   特に、P/ECEのような解像度が低い環境で使用する場合、グリッド座標とピクセル座標の差が大きいので、49%や99%の方が適切かも知れません。
//   例えば右下を中心に回転する場合、'100%'指定では(右下+1)のドットが中心になって回転してしまいます。
//   '99%'指定ならば、右下のドットが中心になって回転するので、自然です。(ただし、スプライトのサイズが100以下の場合に限る)
//   ケースバイケースですので、環境によって調整して下さい。
//   より厳密に指定するには、パーセンテージ指定でなく、これまで通りピクセル単位で指定する方法で中心位置を指定して下さい。
// * Wed Jan 27 21:15:43 JST 2016 Naoyuki Sawa
// - レジストリスクリプトでも、マイナスのcx,cyを表現出来るようにしました。
//   アプリケーション側では、取得したcx,cyを(((int)(x<<8))>>8)のように符号拡張して使用して下さい。
// * Wed Jan 27 22:56:05 JST 2016 Naoyuki Sawa
// - ファイル名からラベルを自動生成する処理を変更しました。
// - 変更前は、単純に、Cシンボル以外の文字が出現した所で打ち切っていました。
//   しかしそれだと、'foo 001.bmp','foo 002.bmp','foo 003.bmp',…のような空白を含むファイル名に対して、個別のラベルが上手く生成出来ない問題が生じました。
//   「AVI2JPG」(http://www.gigafree.net/media/conv/avi2jpg.html)等のフリーソフトで連番画像を作成すると、上記のようにファイル名に空白が含まれるからです。
// - そこで、ファイル名からラベルを自動生成する処理を、以下のように変更しました。
//   ①'-'が出現するまでの間、Cシンボル以外の文字が出現したら、'_'に置き換えて継続する。
//   ②'-'が出現したら、そこで打ち切る。
//   (※②はdpbmpcnv.exeに準拠するための仕様です。Win32プロジェクトで使用する場合は必ずしも適切ではないのですが、P/ECEプロジェクトでの使い易さを優先する事にしました。)
// - 変更後の処理で、前述の例のファイル名は、以下のようなラベルに自動変換されます。
//   'foo 001.bmp'⇒FOO_001,'foo 002.bmp'⇒FOO_002,'foo 003.bmp'⇒FOO_003
//   別の例として、dpbmpcnv.exe用のフォーマット指定が付いているファイル名の場合、以下のようにラベルが自動変換されます。
//   'bar 001-2m.bmp'⇒BAR_001,'bar 002-2m.bmp'⇒BAR_002,'bar 003-2m.bmp'⇒BAR_003
// * Sun Feb 21 21:02:01 JST 2016 Naoyuki Sawa
// - libclipのライブラリ化の伴い、以下の変更を行いました。
//   ・extclip.hとextclip.cを削除しました。extclip.hとextclip.cはlibclipに含まれるようになったからです。
//   ・"CLiP Files"を削除しました。CLiPライブラリの各モジュールはlibclipに含まれるようになったからです。
//   当ツールの動作には変更有りません。
// * Wed Feb 24 21:12:31 JST 2016 Naoyuki Sawa
// - output_enm()において、テクスチャ名の一文字目がCシンボルの一文字目として無効な文字(多分数字)ならば、テクスチャ名の先頭に「`」を付与するようにしました。
// - output_enm()において、スプライト名の一文字目がCシンボルの一文字目として無効な文字(多分数字)ならば、スプライト名の先頭に「`」を付与するようにしました。
// * Tue Mar 01 21:34:55 JST 2016 Naoyuki Sawa
// - clipstd.hにてC4131の警告レベルを引き上げましたが、Bison/Flexの生成コードには旧スタイルの宣言が使われているので、Bison/Flexの生成コードのみ警告レベルを元に戻しました。
// * Wed Apr 06 21:53:01 JST 2016 Naoyuki Sawa
// - loopフラグを追加しました。
//   ループフラグはレジストリスクリプトだけに出力され、Windowsでムービーグラフィックを再生する時に参照します。
//   詳細は、Sample/Sample.txt を参照して下さい。
//   Windowsでムービーグラフィックを再生する時にループフラグを参照する処理は、近日中に/clip/DxlibHelper.cppに実装する予定です。
// * Sun Apr 24 21:05:43 JST 2016 Naoyuki Sawa
// - 2016/04/23に、/clip/clipstd.hにparsonとLibYAMLのインクルードを追加した事に伴い、当プロジェクトにもparsonとLibYAMLのインクルードパスとライブラリパスの設定を追加しました。
//   当プロジェクトはparsonもLibYAMLも使用していませんが、インクルードパスとライブラリパスの設定を追加しないとビルドエラーになるからです。
// - libclip.lib,gc.lib,pthreadVC2(d).lib,sqlite.lib,pdcurses.libのリンク指定を、/clip/libclip/extclip.hで指定するようにし、個別のアプリケーション設定からは削除しました。
//   parson.lib,yaml.libのリンク指定を、/clip/clipstd.hで指定するようにし、個別のアプリケーション設定からは削除しました。
// - 座標単位のダリミタを、「.」⇒「:」に変更しました。
//   【変更前】グリッド単位.ピクセル単位
//   【変更後】グリッド単位:ピクセル単位
//   変更した理由は、もし今後、数値に実数を使えるように変更した場合に、'グリッド単位.ピクセル単位'だと実数と区別できなくなるからです。
//   2016/04/24現時点は、まだ数値の実数対応は行っていませんが、今後実数対応する可能性が有るので、今のうちに変更しておく事にしました。	⇒{{2016/04/25追記:実数対応しました。}}
// * Mon Apr 25 22:45:55 JST 2016 Naoyuki Sawa
// - 実数の計算式に対応しました。
//   暗黙の型変換のルールは、C言語と同じです。
//   キャスト演算子は、'(int)'と'(double)'のみ対応しています。
// - あくまでも途中計算で実数の計算式が使えるだけであり、最終的には整数にキャストする必要が有る事に注意して下さい。	⇒{{2016/04/25追記:整数引数への暗黙の型変換を対応しました。}}
//   <例>
//   │TEX1
//   │  grid 1,1
//   │  SPR1       100.0/3 ,      50*1.23	//エラー
//   │  SPR2 (int)(100.0/3),(int)(50*1.23)	//正しい
//   │end
// * Tue Apr 26 22:39:26 JST 2016 Naoyuki Sawa
// - 実数の計算式から、整数引数への、暗黙の型変換を対応しました。
//   '-w'オプションを指定しなければ、C言語と同様に、警告無しで処理します。
//   '-w'オプション,又は,'-wcast'オプションを指定すると、暗黙の型変換によって誤差が発生した時のみ警告を表示し、最終的にエラー終了します。
//   C言語と違って、誤差が発生しなかった時は警告を表示しない事に注意して下さい。
// - 上記の変更のために、'-w'オプションを処理する仕組みとして、getsubopt()を導入しました。
//   今後、他の種類の警告を追加する時は、この仕組みを使って警告を追加出来ます。
// * Thu Jun 09 21:26:53 JST 2016 Naoyuki Sawa
// - lex.yy.lにて、数値(T_NUM)の解析を、既存の10進数と16進数に加えて、新しく8進数と2進数も解析出来るようにしました。
// * Sat Jul 02 21:34:21 JST 2016 Naoyuki Sawa
// - 2016/06/14に、/clip/clipstd.hに'#pragma comment(lib, "liblua.lib")'を追加した事に伴い、当プロジェクトにもlibluaのライブラリパスの設定を追加しました。
//   現在の所、当プロジェクトはlibluaを使用していませんが、インクルードパスとライブラリパスの設定を追加しないとビルドエラーになるからです。
//   尚、libluaのインクルードパスは以前から設定していたので、今回、追加したのはlibluaのライブラリパスのみです。
// - 2016/07/01に、/clip/libclip/extclip.hに'#include <sqlite3.h>'と'#pragma comment(lib, "sqlite3.lib")'を追加した事に伴い、当プロジェクトにもsqlite3のインクルードパスとライブラリパスの設定を追加しました。
//   現在の所、当プロジェクトはsqlite3を使用していませんが、インクルードパスとライブラリパスの設定を追加しないとビルドエラーになるからです。
// * Sun Jul 10 11:29:13 JST 2016 Naoyuki Sawa
// - y.tab.yのint_argの文法規則の最後に、「;」が抜けていたミスを修正しました。
//   bison.exeはこのような単純なミスを自動的に補ってくれるので、bison.exeのエラーにもならず、生成したプログラムの動作上も問題無く、これまで気付きませんでした。
//   しかし、間違った記述であった事には違い無いので、修正しておく事にしました。
// * Fri Sep 16 21:30:10 JST 2016 Naoyuki Sawa
// - '-q'オプションを追加しました。
//   /clip/test.win/を元にしたプロジェクトで、VC++6.0のカスタムビルドから呼び出された場合に、'\r'による同じ行の重ね書きが上手く認識されず、VC++6.0の出力ペインに進捗表示が多く出過ぎて、その他の重要なエラーが見づらくなってしまう問題を避けるためです。
//   基本的には、VC++6.0のカスタムビルドから呼び出す場合だけに'-q'オプションを使用し、コマンドラインから呼び出す場合はこれまで通り'-q'オプションは指定しなくて構いません。
// * Wed Sep 21 21:20:16 JST 2016 Naoyuki Sawa
// - die(～)で終了していた箇所を、error(EXIT_FAILURE,～)で終了するように変更しました。
//   変更した理由は、以下の通りです。
// - die()は、標準エラー出力がコンソールでなければ、エラーメッセージをメッセージボックスで表示します。
//   通常はそれが望ましい動作なのですが、VC++6.0やVS2015のカスタムビルドとして当ツールを呼び出した場合に、使い辛い問題が生じます。
//   VC++6.0やVS2015は、カスタムビルドとして呼び出すツールの標準エラー出力をリダイレクトして、アウトプットウインドウに表示します。
//   標準エラー出力がコンソールでないので、当ツールはエラー終了する場合に、メッセージボックスを表示します。
//   結果として、カスタムビルドとして呼び出したツールがエラーになると、いちいちメッセージボックスを表示して停止し、使い辛い問題が生じました。
//   元々、die()が標準エラー出力がコンソールでなければエラーメッセージをメッセージボックスで表示するようにした理由は、コマンドプロンプトを持たないウインドウアプリケーションのためであり、
//   当ツールのようなコンソールアプリケーションの標準エラー出力がリダイレクトされた場合にメッセージボックスを表示する必要はあまり有りません。
//   そこで、当ツールがエラー終了する時にdie()を呼び出すのをやめて、error()で終了するように変更する事にしました。
// * Sun Sep 25 21:05:26 JST 2016 Naoyuki Sawa
// - /clip/test.win/lex.yy.lの'popen'対応処理を、当ツールのlex.yy.lにマージしました。
//   当ツールの'popen'対応は必須ではないのですが、本日dFsmMapC.exeに上記の変更を行ったついでに当ツールも対応しておく事にしました。
// - エラーメッセージに、現在の行番号だけでなく、現在のファイル名も表示するようにしました。
//   エラーメッセージの形式は、VC++6.0に合わせて、「ファイル名(行番号) : エラーメッセージ」としました。
// * Wed Sep 28 21:26:44 JST 2016 Naoyuki Sawa
// - error()の文字列の最後に余計な改行が付いていたのを削除しました。
//   error()は指定された文字列の後に(もし有ればエラー名を挟んで)自動的に改行を出力するので、アプリケーション側で文字列の最後に改行を付けると、文字列とエラー名の間に余計な改行が出力されたり、二回改行してしまう問題が生じていました。
// * Sun Oct 02 21:48:17 JST 2016 Naoyuki Sawa
// - ";"によるマルチステートメントに対応しました。
//   変更箇所は、lex.yy.lの「\n { return T_EOL; }」の上の行に、「";" |」を追加しただけです。
// - マルチステートメント対応が必要になった理由は、主にdDirSeqC.exeのためです。
//   Cプリプロセッサで一つのマクロで複数のact命令を生成する時に、Cプリプロセッサの制限のために複数行に分けられないからです。
//   今回マルチステートメントを対応した事によって、「act ～; act ～; act ～」のように一行で複数のact命令が可能になりました。
//   dDirSeqC.exe以外のツールについては、今すぐにマルチステートメント対応が必要な訳ではないのですが、上述の通り変更箇所は少ないので、他のツールも一緒に変更しておく事にしました。
// * Thu Mar 16 23:39:55 JST 2017 Naoyuki Sawa
// - 複数の入力ファイルを指定した時に、最後以外のファイルでエラーが発生した場合、当ツールの終了ステータスが0になっていたバグを修正しました。
//   詳細は、/clip/tool/dEnmDefC/winapp.hの同日のコメントを参照して下さい。
// * Sun Mar 26 22:13:56 JST 2017 Naoyuki Sawa
// - テクスチャに汎用の属性リストを追加し、既存のループフラグも属性に含めました。
//   詳細は、以下の通りです。
// - これまで、テクスチャの属性には、'resource'と'loop'しか指定する事が出来ませんでした。
//   'resource'はP/ECE特有の指定なので置いておくとして、描画に関する属性は'loop'しか指定する事が出来ませんでした。
//   それ以外にも属性を指定したい場合、スプライトのparamとして指定して、スプライト描画経由でテクスチャ描画に伝播させるという方法しか使えず、やや無理が有りました。
//   今回、特定のムービーテクスチャを加算合成モードで描画したいという要件が生じました。(具体的には「CRIWARE Unity plugin」です。「CRIWARE Unity plugin」ではムービーテクスチャを再生開始する直前にadditiveModeで加算合成モードを設定する必要が有り、これをスプライトのparamとして指定するのは無理が有ります。)
//   今回の要件に限らず、テクスチャに色々な任意の属性を指定出来る方が便利だと思うので、思い切って大幅な変更を行う事にしました。
//   今回の変更により、例えば上述の加算合成モードを指定したい場合は、
// //{{2017/05/10変更:加算モードを示すテクスチャ属性の名前を、'additive'⇒'add'に変更しました。詳細は、/clip/libclip.net/keep/Program/src/clipgrp_uni.csの同日のコメントを参照して下さい。
// //│TEX_SAMPLE "sample.usm" loop additive
// //↓2017/05/10変更:加算モードを示すテクスチャ属性の名前を、'additive'⇒'add'に変更しました。詳細は、/clip/libclip.net/keep/Program/src/clipgrp_uni.csの同日のコメントを参照して下さい。
//   │TEX_SAMPLE "sample.usm" loop add
// //}}2017/05/10変更:加算モードを示すテクスチャ属性の名前を、'additive'⇒'add'に変更しました。詳細は、/clip/libclip.net/keep/Program/src/clipgrp_uni.csの同日のコメントを参照して下さい。
//   のように指定出来るようになりました。
// - 今回の変更に置いて工夫した点は、互換性維持のために、既存のloop指定を生かしたまま、任意の属性も指定出来るようにする事です。
//   そのために、属性の省略記法も使えるようにしました。
//   今回追加した任意の属性の指定方法は、「属性名 = 数値」又は「属性名 = "文字列"」です。
//   それに加えて、省略記法として「属性名」も使えるようにし、その場合暗黙に「属性名 = 1」と見なす事にしました。
//   これによって、「loop」と指定されたら、暗黙に「loop = 1」と見なされ、これまでのループ指定と同じレジストリスクリプトが出力出来ます。(厳密には少し非互換性が有ります。後述)
// - 複数の属性も指定出来ます。計算式も使えます。
//   │TEX_SAMPLE "sample.ogv" loop scale_x=1<<2 scale_y=1<<3 comment="コメント"
//   一つのテクスチャに対する定義を複数に分けて書いた場合、それぞれの属性がマージされる事についても、これまで通りです。
//   │TEX_SAMPLE "sample.bmp" loop resource
//   │TEX_SAMPLE              scale_x=2 scale_y=3
//   また、(実際にそうする事は無いと思いますが)属性の種類が違っていれば、同じ名前の属性を登録する事も出来ます。
//   │TEX_SAMPLE "sample.ogv" attrNameX=1 attrNameX="One"
//   具体的には、winapp.cのAttrList_AddAttr()の実装を参照して下さい。
// - 今回の変更による、変更前との非互換性について説明します。
//   変更前は、loopに対するレジストリ名は、「Loop」として出力していました。
//   変更後は、loopに対するレジストリ名は、「loop」として出力します。
//   なぜならば、変更後はloopは予約語ではなく、単なる属性名の一つでしかないので、そのままの名前でレジストリ名として出力されるからです。
//   上記の非互換性が発生したため、既存のアプリケーションで「RegKey_Loop」と指定している箇所は、「RegKey_loop」に変更して下さい。
//   尚、当ツール内で属性名の一文字目を大文字化する案も考えましたが、却って使い辛くなる問題の方が大きいと思ったので、その方法は取らない事にしました。
//   今回の非互換性によるアプリケーション側の修正は僅かなので、アプリケーション側で対応する事にしました。
// * Fri Mar 31 21:21:33 JST 2017 Naoyuki Sawa
// - 入力ファイル名のサフィックスによる属性の自動出力に対応しました。
//   今回は自動スケーリング属性のサフィックス('-1x'～'-9x')だけに対応しました。
//   今後必要に応じて増やして行く予定です。
// * Mon May 08 08:35:51 JST 2017 Naoyuki Sawa
// - ライブラリのバグ修正に伴う、ツールのリビルドを行いました。
//   詳細は、clipmisc.cの'Sun May 07 09:13:01 JST 2017 Naoyuki Sawa'のコメントを参照して下さい。
// * Wed May 10 22:17:50 JST 2017 Naoyuki Sawa
// - '-aloop','-aadd'オプションを追加しました。
//   これまでは、'/clip/test.win/grp/LoopMovie.txt'のような方法で明示的にテクスチャの属性を追加する必要が有りましたが、今後は、任意属性"loop","add"については、ファイル名で自動的に設定する事が出来るようになり、LoopMovie.txtを管理する手間が省けるようになりました。
//   尚、引き続きLoopMovie.txtによる属性追加も可能です。
// {{2017/05/10削除:同じ名前の属性が複数回指定されても、同じ種類で同じ値ならば、エラーにしないようにしました。
// //ただし、ファイル名による属性指定と、LoopMovie.txtによる属性追加が被ると、AttrList_AddAttr()にてエラーになってしまうので、両方を混ぜて使う場合は注意して下さい。
// //原則としては、どちらか一方の方法だけを使うのが安全です。
// }}2017/05/10削除:同じ名前の属性が複数回指定されても、同じ種類で同じ値ならば、エラーにしないようにしました。
// - 複数の属性のサフィックスを混在してファイル名に含める事も可能です。
//   <例> "foobar_123-loop-add-2x.avi" ┐
//        "foobar_123-add-2x-loop.avi" │
//        "foobar_123-2x-loop-add.avi" ├サフィックスを指定する順番は関係無いので、どれでも同じ意味になります。
//        "foobar_123-loop-2x-add.avi" │
//        "foobar_123-add-loop-2x.avi" │
//        "foobar_123-2x-add-loop.avi" ┘
// * Wed May 10 23:32:30 JST 2017 Naoyuki Sawa
// - 同じ種類で同じ名前の属性が複数回指定されても、同じ値ならばエラーにしないようにしました。
//   これまでは、以下のような指定は、エラーになっていました。
//   │"foobar-loop-loop.usm"  …  ファイル名サフィックスによる指定の重複。
//   │"foobar-loop.usm" loop  …  ファイル名サフィックスによる指定と、スクリプトによる指定の重複。
//   今後は、上記のようなケースも、エラーにしません。
//   エラーにしないようにした理由は、LoopMovie.txtによるスクリプトへの属性追加と、ファイル名サフィックスによる指定が、(作業の都合上)重複する事が有り得るからです。
//   つまり、上記の例の、後者のようなケースが起こり得るからです。
//   厳密にはエラーとすべきなのかも知れませんが、害は無いし、エラーにしない方が使い易いので、エラーにしない事にしました。
//   尚、上記の例の前者のような例は、明らかにファイル名サフィックスの付け方が適切ではありませんが、当ツールの処理の都合上、前者だけをエラーにするのは難しく、また、エラーにしなくても特に害は無いので、前者もエラーにしない事にしました。
// - ちなみに、もう忘れているかもしれないので再度メモしておきますが、同じ名前で【違う種類】の属性ならば、被っていてもエラーにはなりません。
//   その点は、今回の変更によるものではなく、2017/03/26にテクスチャに汎用の属性リストを追加した時点からの仕様です。
//   現実的には、同じ名前で別の種類の属性を指定する事はまずないと思いますが(「foo=123 foo="ABC"」のように)、一応、可能ではある事を、備忘録としてメモしておきます。
// * Sun Jul 02 23:19:31 JST 2017 Naoyuki Sawa
// - '-m'オプションを追加しました。
//   追加した理由は、以下の通りです。
//   尚、当オプションは、P/ECE環境でも、Win32環境,及び,汎用でも利用出来ますが、主な目的はP/ECE環境で利用する事です。
//   以下の説明は、P/ECE環境で利用する場合を前提として、説明します。
// - 一枚のビットマップ上でスプライトアニメーションを直接描く時に、グリッドサイズを、パターン中の最大サイズに固定して、描く事が良く有ります。
//   例えば、爆発アニメーションで、ほとんどのパターンは8x8以下で、一瞬だけ32x32になる場合に、個々のパターンのサイズで隙間無く敷き詰めるのでなく、全部32x32にして、中心合わせで描く事が多いです。
//   その方が描き易いし、グラフィックエディタ(EDGE2(http://takabosoft.com/edge2)等)の機能上、グリッドサイズを固定する方が、エディタ上でのアニメーションの確認も行い易いです。
//   また、スプライト定義(clip/test.pce/grp/SprDef.txt等)を手作業で書く場合にも、一連のアニメーションパターンのグリッドサイズが同じである方が書き易いです。
//   以上の理由により、グリッドサイズは大きめに取る事が多いです。
// - しかし、小さなパターンを描く時に、無駄が多く、実行時の性能が低下する問題が有ります。
//   透明部分の描画も、透明でない部分の描画と、さほど変わらない負荷が掛かるからです。
//   Win32等では元々の描画性能が高いので、無駄が多くても間に合う事が多いのですが、P/ECEでは元々の描画性能が低いので、なるべく無駄は省きたいです。
//   とは言え、スプライト定義を書く時に、手作業で透明部分を省いて定義するのは、手間が掛かり過ぎるし、グラフィックを変える度に変更する必要が生じ、現実的ではありません。
// - そこで、テクスチャ定義コンパイラ(当ツール)がスプライト定義を出力する段階で、自動的に透明部分を取り除いて、スプライトを最小サイズとする機能を追加する事にしました。
//   この機能を使えば、グラフィックを描く時や、スプライト定義を書く時は、これまで通り最大のグリッドサイズに固定して作業出来ます。
//   テクスチャ定義コンパイラ(当ツール)がスプライトの空白部分を取り除いた分は、描画原点(cx,cy)で相殺されるので、アプリケーションの実行時にも考慮する必要は無く、アプリケーションも変更不要です。
// - 今回の対応では解決されていない問題点としては、実行ファイルに組み込まめる画像データ自体の空白部分はそのまま残りますので、実行ファイルのサイズは小さくなりません。
//   上記の問題を解決するには、テクスチャ定義コンパイラ(当ツール)だけで行うのは難しいです。
//   もし行うならば、スプライトシート作成ツール(dpsprsht.exe)が空白部分を取り除いて、取り除いたサイズを(何らかの方法で)当ツールに引き渡してパッキングする等の方法が必要でしょう。
//   簡単には行えないので、それは今回は行わない事にしました。
//   尚、実際には、実行ファイルのサイズは小さくならない問題は、現状のままでも、VQTC形式を使う事で、ある程度低減されています。
//   VQTC形式は、同じパターンを効率良く圧縮するので、空白部分が多いグラフィックデータは効率良く圧縮出来ているからです。
// - 最後に、'-m'オプションを使用する場合の注意点について、記載しておきます。
//   '-m'オプションによって、左側,又は,上側からトリミングされた量は、cx,cyから引いて相殺されます。
//   それ自体は問題無いのですが、cx,cyが減少する事によって、P/ECE用のSPRITE構造体(clipspr.h参照)のcx,cyの下限である-128を下回ってしまう可能性が有ります。
//   当ツールは、cx,cyが-128を下回っても、エラーも警告も表示しません。
//   なぜならば、上記の制限はP/ECEの場合だけであり、'-m'オプションはP/ECE専用という訳ではないからです。
//   cx,cyが-128を下回った場合、出力されたスプライト定義(sprite.h)をP/ECEアプリケーションに組み込んでビルドする時に「warning: overflow in implicit constant conversion」という警告が出るので、それを見て判断して下さい。
//   cx,cyが-128を下回らないように修正するには、あまりにも空白部分の大きなパターンは作成しない事です。
//   実際には、P/ECE用のスプライトアニメーションで、空白部分が128ピクセルも有るようなパターンは、描かないとは思います。
// * Tue Jul 04 21:21:43 JST 2017 Naoyuki Sawa
// - 一つのテクスチャ定義ブロック内で、グリッドサイズを切り替えて、複数のスプライト定義ブロックを書けるようにしました。
//   これまでは、一つのテクスチャに対して、異なるグリッドサイズでテクスチャ定義を行うには、複数のテクスチャ定義ブロックを使用する必要が有りました。
//   □変更前(Sample/Sample.txtから引用)
//   │"grp/tex7-2m.bmp"
//   │		grid		4
//   │		SPR71		0,0
//   │end
//   │"grp/tex7-2m.bmp"
//   │		grid		5
//   │		SPR72		1,1
//   │end
//   今後は、より判り易く、以下のように書けるようになりました。
//   □変更後
//   │"grp/tex7a-2m.bmp"
//   │		grid		4
//   │		SPR7A1		0,0
//   │		grid		5
//   │		SPR7A2		1,1
//   │end
//   尚、変更前の書き方も引き続き使用可能ですので、既存のスクリプトを修正する必要は有りません。
// * Wed Jul 05 21:51:37 JST 2017 Naoyuki Sawa
// - グリッドの原点を指定出来るようにしました。
//   具体的には、以下の通りです。
// - これまでは、グリッドの原点はテクスチャの左上隅(0,0)に固定でした。
//   しかし、それでは使い辛い事が時々有りました。
//   例えば、グラフィックエディタのグリッドサイズを(8,8)にして、一行目に2x2グリッドのアニメーションパターンを描き、その下に3x3グリッドのアニメーションパターンを描いた場合です。
//     ┌─┬─┬─┬────┐
//     │○│○│○│　　　　│
//     ├─┴┬┴─┼──┐　│
//     │△△│△△│△△│　│
//     │△△│△△│△△│　│
//     ├──┴──┴──┘　│
//     │　　　　　　　　　　│
//     └──────────┘
//   これまでは、上図のようなアニメーションパターンを定義する場合、スクリプト上では以下のように表現するしかありませんでした。
//     □変更前
//     │"pat.bmp"
//     │    grid    8,8          #//'grid 8'でも構いません。
//     │    SMALL1  2*0,0,2,2
//     │    SMALL2  2*1,0,2,2
//     │    SMALL3  2*2,0,2,2
//     │    LARGE1  3*0,2,3,3
//     │    LARGE2  3*1,2,3,3
//     │    LARGE3  3*2,2,3,3
//     │end
//   上記の表現方法でも動作上の問題は無いのですが、直観的でなく書き間違い易い危険が有ったり、何を定義しているのかが一見して判り辛いという問題が有りました。
//   そこで、より直観的に定義出来るように、グリッドの原点を指定出来るようにしました。
// - 今回の変更によって、グリッド指定の既存の書式「grid w」「grid w,h」に加えて、新しい書式「grid x,y,w」「grid x,y,w,h」が指定出来るようになりました。
//   それぞれの意味は、以下の通りです。
//     │grid      w    #//'grid     w,w'と等価です。
//     │grid      w,h  #//'grid 0,0,w,h'と等価です。
//     │grid  x,y,w    #//'grid 0,0,w,w'と等価です。
//     │grid  x,y,w,h  #//テクスチャの(x,y)[ピクセル]の位置を原点として、(w,h)[ピクセル]のグリッドが並んでいる事を意味します。
//   新しい書式を利用して、前述のアニメーションパターンは、以下のように表現出来るようになりました。
//     □変更後
//     │"pat.bmp"
//     │    grid    0,8*0,8*2,8*2  #//'grid 0,8*0,8*2'でも構いません。
//     │    SMALL1  0,0            #//'SMALL1 0,0,1,1'でも構いません。
//     │    SMALL2  1,0
//     │    SMALL3  2,0
//     │    grid    0,8*2,8*3,8*3  #//'grid 0,8*2,8*3'でも構いません。
//     │    LARGE1  0,0            #//'LARGE1 0,0,1,1'でも構いません。
//     │    LARGE2  1,0
//     │    LARGE3  2,0
//     │end
//   変更前のスクリプトよりも、より直観的で判り易くなったと思います。
//   また、一連のアニメーションパターンを描いた位置をまとめてずらした場合にも、個々のスプライト定義を修正する必要は無く、グリッドの原点をずらすだけで済むようになったという利点も有ります。
//   変更前の書き方(グリッドの原点を明示しない)も引き続き有効ではありますが、今後はなるべく変更後の書き方(グリッドの原点を明示する)を使うようにして下さい。
// - ちなみに、今回の変更の主目的ではありませんが、既存のgrid_w,grid_h,及び,今回追加したgrid_x,grid_yの宣言と定義を、winapp.h,winapp.cから削除し、y.tab.yへ移動しました。
//   移動した理由は、grid_x,grid_y,grid_w,grid_hは、y.tab.y内の構文解析処理内だけで使う変数であり、winapp.c内の処理では使用していない事を強調するためです。
// * Sat Aug 05 23:33:42 JST 2017 Naoyuki Sawa
// - スクリプトでテクスチャのファイル名を設定を忘れ,かつ,'-m'を指定した場合に、正しくエラーを表示して終了せずに、一般保護エラーで終了してしまっていたバグを修正しました。
// * Tue Aug 08 21:44:58 JST 2017 Naoyuki Sawa
// - スクリプトでテクスチャ定義の途中のgridに誤りが有り,かつ,'-m'を指定した場合に、正しくエラーを表示して終了せずに、一般保護エラーで終了してしまっていたバグを修正しました。
// * Fri Aug 25 23:07:18 JST 2017 Naoyuki Sawa
// - リソースフラグを廃止しました。
//   /clip/test.pce/app.cの同日の変更にて、常にリソースを使用するように変更した事に伴い、当ツールのresourceキーワードは不要になりました。
//   今後は、常に、(変更前で言う所の)resourceキーワードが指定されたのと同じように、TEXTURE_RESOURCE_マクロを使ってP/ECE用の出力を行います。
//   今後は、明示的にresourceキーワードを指定すると、任意属性と見なされてエラーにはなりませんが、レジストリに無駄な値が出力されてしまうので注意して下さい。
// * Sat Aug 26 23:54:22 JST 2017 Naoyuki Sawa
// - '-t',及び,'-p'オプションを廃止しました。
//   各種定義ヘッダをP/ECE専用の形式から汎用形式への切り替えたので、もう、P/ECE専用形式の出力は使用しなくなったからです。
//   詳細は、/clip/test.pce/Makefileの、同日のコメントを参照して下さい。
// - 一般的なパラメータマクロをdTexDefC.exe自身で展開出来るようにしました。
//   詳細は、以下の通りです。
// - これまでは、パラメータにマクロを使用した場合のマクロは、テクスチャ定義スクリプト自体をプリプロセッサで処理して展開するか、又は、
//   テクスチャ定義スクリプトにはパラメータを文字列として指定しておき、レジストリスクリプトにはパラメータ部分を文字列のまま出力して、レジストリスクリプトをプリプロセッサで処理して展開する必要が有りました。
//   汎用性を考慮すれば上記の方法が適切ではあるのですが、実際の所、パラメータにマクロを使用するのはP/ECEの描画パラメータとして使用する場合がほとんどである事を考えると、もっと簡単に使いたいと思いました。
//   そこで、'C:\usr\PIECE\include\draw.h'で定義されているP/ECEの描画パラメータだけは、当ツール自身で理解して、展開する事にしました。
// * Fri Dec 01 23:59:59 JST 2017 Naoyuki Sawa
// - 「'.'スプライト名」の書式を追加しました。
//   「'.'スプライト名」の書式を追加した理由は、以下の通りです。
// - スプライト名のプレフィクスとして、テクスチャ名を付与するケースが多いです。
//   □変更前の例
//   │MYTEX1 "mytex1.bmp"	#//「MYTEX1」や「"mytex1.bmp"」でも構いません。
//   │  grid 1,1
//   │  MYTEX1_MYSPR1 0,0
//   │  MYTEX1_MYSPR2 0,1
//   │  MYTEX1_MYSPR3 1,0
//   │  MYTEX1_MYSPR4 1,1
//   │end
//   これまでは、スプライト名全体を指定する書式しか無かったので、常に上記の例のように指定する必要が有り、煩わしさが有りました。
//   今回追加した「'.'スプライト名」の書式を使用すると、上記の例は、以下のように指定出来るようになりました。
//   □変更後の例
//   │MYTEX1 "mytex1.bmp"	#//「MYTEX1」や「"mytex1.bmp"」でも構いません。
//   │  grid 1,1
//   │  .MYSPR1 0,0
//   │  .MYSPR2 0,1
//   │  .MYSPR3 1,0
//   │  .MYSPR4 1,1
//   │end
//   具体的には、スプライト名の先頭に'.'を付与すると、'.'を「テクスチャ名+'_'」に置き換えます。
//   尚、スプライト名の先頭に'.'を付与しなければ、これまで通りスプライト名全体の指定と解釈するので、既存のスクリプトを修正する必要は有りません。
// * Thu May 03 23:59:59 JST 2018 Naoyuki Sawa
// - Boehm GCを修正した事に伴い、当ツールもリビルドしました。
//   詳細は、/clip/tool/gc/README.TXTの'Wed May 02 23:59:59 JST 2018 Naoyuki Sawa'のコメントを参照して下さい。
// * Sat Jul 28 23:59:59 JST 2018 Naoyuki Sawa
// - テクスチャ名とスプライト名が同じ場合の簡略記法を追加しました。
//   2017/12/01の変更によって、テクスチャ名をプレフィクスとするテクスチャ名をたくさん定義するのは簡単になったのですが、テクスチャ名と同じ名前のスプライトを一つだけ定義するのは簡単になっていませんでした。
//   □変更前の例
//   │MYTEX1 "mytex1.bmp"	#//「MYTEX1」や「"mytex1.bmp"」でも構いません。
//   │  grid 1,1
//   │  MYTEX1 0,0
//   │end
//   同じ名前を二回指定する手間を省くために、スプライト名を省略したら、テクスチャ名と同じと見なす事にしました。
//   □変更後の例
//   │MYTEX1 "mytex1.bmp"	#//「MYTEX1」や「"mytex1.bmp"」でも構いません。
//   │  grid 1,1
//   │         0,0
//   │end
//-----------------------------------------------------------------------------
//バージョン定義
//-----------------------------------------------------------------------------
#define VERSION "20180728"
//-----------------------------------------------------------------------------
#endif/*__WINAPP_H__*/
