/*****************************************************************************
 * 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_Fmt {
	char*		pFmtStr;	//書式文字列無しならばNULL。
	char*		pFmtLab;	//書式ラベル無しならばNULL。
} ST_Fmt;
//数値リスト
typedef struct _ST_ExprList {
	int		nExpr;
	int		aExpr[/*nExpr*/];
} ST_ExprList;
//属性リスト
typedef struct _ST_AttrList {
	int		nAttr;
	char*		aAttr[/*nAttr*/];
} ST_AttrList;
//初期値
typedef struct _ST_Init {
	int		iInit;
} ST_Init;
//範囲
typedef struct _ST_Range {
	int		iMin;
	int		iMax;
} ST_Range;
//列挙
typedef struct _ST_Enum {
	ST_ExprList*	pExprList;
} ST_Enum;
//ラベル行
typedef struct _ST_LabelRow {
	char*		pLabel;		//NULL不可。空文字不可。
	char*		pDesc;		//NULL不可。説明文無しならば""とする。
	ST_Fmt*		pFmt;		//NULL不可。
} ST_LabelRow;
//タイプボディ
typedef struct _ST_TypeBody {
	ST_Init*	pInit;
	ST_Range*	pRange;
	ST_Enum*	pEnum;
} ST_TypeBody;
//タイプ
typedef struct _ST_Type {
	char*		pLabel;							//組み込み型は'$'で始まり、その後に10進数で固定id値をつなげた名前とする。例:'$32767'
	char*		pDesc;		//NULL不可。説明文無しならば""とする。	┬同時指定は不可
	ST_Fmt*		pFmt;		//NULL不可。				┘
	ST_TypeBody*	pTypeBody;
	//--- 2パス目で設定する ---
	int		bUse;		//いずれかのテーブルから変数の型として参照されているタイプならば1をセットする。どのテーブルからも参照されていなければ0のままとなり無駄なので削除する。
	int		iType;		//テーブルとタイプに通算で一意な'タイプid'
	int		iInit;		//エンコード済みの初期値
	int		iBitLen;
} ST_Type;
//変数
typedef struct _ST_Var {
	char*		pTypeLabel;	//'var'変数ならばNULL			//組み込み型は'$'で始まり、その後に10進数で固定id値をつなげた名前とする。例:'$32767'
	char*		pVarLabel;						//組み込み型は'$'で始まり、その後に10進数で固定id値をつなげた名前とする。例:'$1','$2'
	ST_ExprList*	pDim;		//スカラー変数ならばNULL
	ST_AttrList*	pAttrList;	//属性が無ければNULL
	char*		pDesc;		//NULL不可。説明文無しならば""とする。
	ST_Fmt*		pFmt;		//NULL不可。
	//--- 2パス目で設定する ---
	int		iVar;
	int		iType;
	int		iBitPos;
} ST_Var;
//テーブルボディ
typedef struct _ST_TableBody {
	int		nVar;
	ST_Var*		aVar[/*nVar*/];
} ST_TableBody;
//テーブル
typedef struct _ST_Table {
	char*		pLabel;							//組み込み型は'$'で始まり、その後に10進数で固定id値をつなげた名前とする。例:'$32767'
	char*		pDesc;		//NULL不可。説明文無しならば""とする。
	ST_Fmt*		pFmt;		//NULL不可。
	ST_TableBody*	pTableBody;
	//--- 2パス目で設定する ---
	int		iType;		//テーブルとタイプに通算で一意な'タイプid'
	int		iBitLen;
} ST_Table;
//-----------------------------------------------------------------------------
//グローバル関数宣言
//-----------------------------------------------------------------------------
int cast_dbl_to_int(double d);
void addType(ST_Type* pType);
void addTable(ST_Table* pTable);
char* addInlineType(ST_TypeBody* pTypeBody);
//ST_Fmt
ST_Fmt* Fmt_new(char* pFmtStr/*NULL可*/, char* pFmtLab/*NULL可*/);
//ST_ExprList
ST_ExprList* ExprList_new(int iExpr);
ST_ExprList* ExprList_add(ST_ExprList* pExprList, int iExpr);
//ST_AttrList
ST_AttrList* AttrList_new(char* pAttr);
ST_AttrList* AttrList_add(ST_AttrList* pAttrList, char* pAttr);
//ST_LabelRow
ST_LabelRow* LabelRow_new(char* pLabel, ST_Fmt* pFmt/*NULL不可*/, char* pDesc/*NULL不可*/);
//ST_Type
ST_Type* Type_new(ST_LabelRow* pLabelRow, ST_TypeBody* pTypeBody);
//ST_TypeBody
ST_TypeBody* TypeBody_new();
ST_TypeBody* TypeBody_setInit(ST_TypeBody* pTypeBody, ST_Init* pInit);
ST_TypeBody* TypeBody_setRange(ST_TypeBody* pTypeBody, ST_Range* pRange);
ST_TypeBody* TypeBody_setEnum(ST_TypeBody* pTypeBody, ST_Enum* pEnum);
//ST_Init
ST_Init* Init_new(int iExpr);
//ST_Range
ST_Range* Range_new(int iMin, int iMax);
//ST_Enum
ST_Enum* Enum_new(ST_ExprList* pExprList);
//ST_Table
ST_Table* Table_new(ST_LabelRow* pLabelRow, ST_TableBody* pTableBody);
//ST_TableBody
ST_TableBody* TableBody_new();
ST_TableBody* TableBody_addVar(ST_TableBody* pTableBody, ST_Var* pVar);
//ST_Var
ST_Var* Var_new(char* pVarLabel, ST_ExprList* pDim/*NULL可*/, char* pTypeLabel/*NULL可*/, ST_AttrList* pAttrList/*NULL可*/, ST_Fmt* pFmt/*NULL不可*/, char* pDesc/*NULL不可。説明文無しならば""とする。*/);
//-----------------------------------------------------------------------------
//変更履歴
//-----------------------------------------------------------------------------
// * Wed Sep 23 21:05:13 JST 2015 Naoyuki Sawa
// - 1st リリース。
// * Fri Sep 25 21:42:17 JST 2015 Naoyuki Sawa
// - '-n'オプションを追加しました。
// * Sat Sep 26 23:32:59 JST 2015 Naoyuki Sawa
// - 2パス目の処理で、どのテーブルからも参照されていないタイプを検出し、削除する処理を追加しました。
//   この処理の追加により、無駄なレジストリデータが削減出来ます。
//   ただし、元々、参照されていない無駄なタイプを記述していなかった場合は、効果は有く害も有りません。
// * Sun Sep 27 21:17:06 JST 2015 Naoyuki Sawa
// - 組み込み'Double'型を追加しました。
// - 大きな数を格納する場合、ほとんどの場合は既存のプリミティブ整数型'var'で足りると思うのですが、
//   もっと大きな値や小数も格納したい場合のために、64ビット浮動小数点数も格納出来るようにしました。
//   使用頻度は低いと思うので、速度効率やメモリ効率よりも、実装を単純にしておく方が重要だと考えて、
//   新たなプリミティブ小数型を追加するのではなく、内部的にはテーブルを使って実装する事にしました。
// * Thu Oct 08 21:07:24 JST 2015 Naoyuki Sawa
// - レジストリ構造を変更しました。具体的には、以下の通りです。
//   ・範囲型のタイプ定義において、これまではPrp_rangeキーの下にminとmaxの値を格納していましたが、
//     変更後はPrp_rangeをBLOBとしてminとmaxを格納するようにしました。
//   ・列挙型のタイプ定義において、これまではPrp_enumキーの下にPrp_for及びPrp_revサブキーを作成しその中に順方向と逆方向の変換辞書を格納していましたが、
//     変更後はPrp_enumをBLOBとして列挙値を配列として格納しました。
//     辞書ではなくリニアサーチで変換するようになったため、列挙値が多いと性能低下しますが、大抵は列挙値は10個程度以下だと思うので問題無いと思います。
//   ・配列変数の定義において、これまではPrp_dimキーの下に各次元の(要素数-1)を格納していましたが、
//     変更後は変更後はPrp_dimをBLOBとして各次元の(要素数-1)を格納するようにしました。
//   以上のように変更した理由は、プロパティテーブルの読み書き時のレジストリ検索回数を減らして、高速化するためです。
// - 上記の変更に伴って、当ツールも、変換語のレジストリ構造を出力するように変更しました。
// * Fri Oct 09 21:09:22 JST 2015 Naoyuki Sawa
// - dRegTblC.exeが、BLOBのデータ定義に'byte','half','word'のプレフィクス指定を追加した事に伴い、
//   当ツールが出力するレジストリスクリプトも、上記の機能を利用するように変更しました。
// * Sat Oct 10 21:13:38 JST 2015 Naoyuki Sawa
// - '~'演算子を対応しました。
// * Thu Oct 15 21:01:52 JST 2015 Naoyuki Sawa
// - '-n'オプションを追加しました。
//   詳細は、/clip/tool/dLotTblC/winapp.h の同日のコメントを参照して下さい。
// - 既存の'-n'オプション(名前の文字列を格納しない)は、'-s'オプションに変更しました。
//   (Unixのstripコマンドの'-s'オプションに倣って、'-s'とする事にしました。)
// * Fri Oct 16 21:16:43 JST 2015 Naoyuki Sawa
// - clipstr.hのstrnatcmp(),strnatcasecmp()の動作を変更した事に伴い、当ツールをリビルドしました。
//   上記の関数の動作変更は、当ツールの使用方法では影響無いのですが、念のためにリビルドする事にしました。
// * Mon Oct 19 21:21:27 JST 2015 Naoyuki Sawa
// - clipprp.cに属性を追加した事に伴い、当ツールも属性の出力に対応しました。
//   詳細は、clipprp.cの同日のコメントを参照して下さい。
// * Mon Oct 19 22:41:11 JST 2015 Naoyuki Sawa
// - clipprp.cがレジストリ構造を変更して、PrpTblキーの下のtypeサブキーとtableサブキーを削除した事に伴い、当ツールも変更後のレジストリ構造を出力するように変更しました。
//   詳細は、clipprp.cの同日のコメントを参照して下さい。
// * Fri Oct 23 21:55:26 JST 2015 Naoyuki Sawa
// - 「range min,max」を「limit max」と記述出来る糖衣構文を追加しました。
//   「range 0,127」のように、minを0と指定する事が特に多いので、入力ミスを防ぐためにも簡易に指定できる方が良いと思ったからです。
//   これはあくまでも糖衣構文であり、「range 0,127」と「limit 127」とで、出力されるレジストリスクリプトや動作に違いは有りません。
// - テーブル定義内でインラインタイプ定義を行う糖衣構文を追加しました。
//   これまでは、タイプ定義は全て「type～end」のブロックで明示的に定義する必要が有りました。
//   しかし、変数個別に上限が違うような場合、共用しない大量のタイプ定義を、変数定義とは離れた場所に「type～end」のブロックを作って行うのが、煩わしい問題が有りました。
//   そこで、テーブル定義内でインラインタイプ定義を行う糖衣構文を追加しました。
//   <例>
//   □これまでの書き方:
//   │type TypeName1
//   │  range 0,10
//   │  init 5
//   │end
//   │type TypeName2
//   │  enum 1,2,3
//   │end
//   │table TableName
//   │  TypeName1 x
//   │  TypeName2 y
//   │end
//   □糖衣構文を用いた書き方:
//   │table TableName
//   │  range 0,10 init 5 x
//   │  enum 1,2,3        y
//   │end
//   要するに、変数名の前に、タイプ定義の行要素を改行せずに繋げて書けば良いです。
//   なお、上記ではinit付きのrangeとinit無しの二例のみ示しましたが、その他にも、「type～end」のブロックで使える指定は全て使えます。
//   initとrange/limit/enumの順序や、initの有無との組み合せも、全て可能です。
//   以上はあくまでも糖衣構文であり、使い過ぎるとタイプ定義が管理し辛くなる恐れが有ります。
//   複数の変数で共用するタイプ定義には、なるべくインラインタイプ定義を使わず、これまでどおり「type～end」のブロックで明示的に定義する方が良いです。
// * Thu Oct 29 21:30:16 JST 2015 Naoyuki Sawa
// - clipreg.cモジュールを修正した事に伴い、当ツールもリビルドしました。
//   当ツールのソースは、変更していません。
// * Sun Nov 08 21:48:30 JST 2015 Naoyuki Sawa
// - 「Boehm GC」をマルチスレッド対応にした事,及び,それに伴ってclipbpe.cモジュールを修正した事に伴い、当ツールもプロジェクト設定の変更を行ってリビルドしました。
//   詳細は、/clip/tool/gc/README.TXT と /clip/clipbpe.c の2015/11/03のコメントを参照して下さい。
// - レジストリスクリプト出力の中の、BLOBのインデントレベルを変更しました。
//   具体的には、これまでは'{','}'よりも1段深いインデントレベルで要素を出力していまいたが、変更後は'{','}'と同じインデントレベルで要素を出力するようにしました。
//   この変更は見易さのためだけであり、レジストリコンパイル後のバイナリに違いは有りません。
// * Sat Nov 14 21:55:38 JST 2015 Naoyuki Sawa
// - ゼロ除算エラーと、範囲外ビットシフトのハンドリングを追加しました。
//   これまでは前者はCPU例外で終了し、後者は無視してしまっていました。今後はエラーと見なします。
// - '%'演算子を対応しました。
// * Sun Nov 22 21:02:41 JST 2015 Naoyuki Sawa
// - 環境変数'プログラム名_OPTION'で指定されたオプション(有れば)を、コマンドライン引数にマージするようにしました。
//   詳細は、/clip/clipmisc.c の同日のコメントを参照して下さい。
// - GCに'-DLARGE_CONFIG'を付けてリビルドした事に伴い、当アプリケーションもリビルドしました。
//   詳細は、/clip/tool/gc/README.TXT の同日のコメントを参照して下さい。
// * Mon Nov 30 21:58:52 JST 2015 Naoyuki Sawa
// - タイプ,テーブル,変数に、それぞれ、説明文を付けられるようにしました。スクリプトの書式は、Sample/Sample.txt を参照して下さい。
//   変数の説明文は、PrpHdr_name_l(),PrpHdr_desc_l()等を使って取り出せます。また、PrpTbl_dump()にも自動的に出力されます。
//   タイプとテーブルの説明文は、現在の所、専用の関数は用意していません。必要に応じて、REG_get_string()等を使って取り出してください。
// - '-sn','-sd'オプションを追加しました。
// - 前回までの変更時にコメントアウトして残していた、古いコードやコメントを削除して、ソースコードを整理しました。
//   古いコードやコメントを参照する必要が有る場合は、前回のアーカイブを参照して下さい。
// * Sun Dec 06 21:06:49 JST 2015 Naoyuki Sawa
// - 文字列式を追加しました。今回対応した文字列式は、以下の二種類のみです。
//   │("文字列")⇒文字列
//   │"文字列"+"文字列"⇒文字列
//   文字列式を追加した目的は、スクリプト上、複数の文字列に分けて記述する方が見た目に判り易い場合が有るからです。
//   文字列式を使わなくても最初から連結して記述すれば結果は同じになのですが、見た目の判り易さのために対応する事にしました。
// - C言語の書式に倣うならば「"文字列" "文字列"」なのですが、二つの文字列トークンの並びと区別出来なくなる事を避けるために、'+'を使う事にしました。
// - 文字列と数値の連結は、今回は、対応しない事にしました。
//   数値を文字列化して連結する場合、数値の書式を指定出来ないと、実用上、使い物にならないと思ったからです。
//   もし今後、文字列と数値の連結にも対応する場合は、その時に、数値の書式の指定方法を検討しようと思います。
// * Mon Dec 07 21:18:38 JST 2015 Naoyuki Sawa
// - 書式指定を対応しました。
//   スクリプトの例は、Sample/Sample.txt を参照して下さい。
//   アプリケーションからの利用方法は、clipprp.cの実装を参照して下さい。
// - '-sf'オプションを追加しました。
// - 今回はかなり変更範囲が大きかったので、変更前のコードをコメントアウトして残していません。
//   変更前のコードを参照する必要が有る場合は、前回のアーカイブを参照して下さい。
// * Thu Dec 10 21:13:28 JST 2015 Naoyuki Sawa
// - clipprp.cモジュールの変更に伴い、当アプリケーションもリビルドしました。
//   当アプリケーションの動作に、変更は有りません。
// * Sun Dec 13 21:20:57 JST 2015 Naoyuki Sawa
// - 組み込み'Double'型の書式文字列に"%g"を格納しないようにしました。
//   組み込み'Double'型に対して書式文字列に"%g"を適用する処理はclipprp.cのPrpTbl_ffmt_v()で行っているので、データとして格納されている必要は無く無駄だからです。
// - その上、無駄であるだけでなく、害すら有った事に気付きました。
//   clipprp.cのPrpTbl_op_v()で、組み込み'Double'型の変数に対してPrpHdr_get_*()が呼び出された時の(サービスの)処理で整数型として読み出した場合に、
//   snprintf(～"%g"～)に対して整数型の可変引数を渡す事になり、(小数部が切り捨てられるだけではなく)全く異なる値が表示されてしまいます。
//   今回、組み込み'Double'型の書式文字列に"%g"を格納しないように修正したので、上記の問題は解決しました。
//   【修正前】PrpTbl_fmt_v()に対してDouble変数(値=123.456)を指定すると、結果が"0"(,又は,不定な結果)になっていた。(意図と違う)
//   【修正後】PrpTbl_fmt_v()に対してDouble変数(値=123.456)を指定すると、結果が"123"になった。                    (意図どおり)
// * Sun Dec 27 21:37:47 JST 2015 Naoyuki Sawa
// - プロパティテーブルスクリプトの書式を大幅に変更しました。
//   ①タイプ定義とテーブル定義の、一行目の書式を共通化しました。
//   │□変更前
//   ││type Type1   <"%x" fmt1> "desc1" #//書式と説明文は省略可
//   ││  ～
//   ││end
//   ││table Table2 <"%x" fmt2> "desc2" #//書式と説明文は省略可
//   ││  ～
//   ││end
//   │変更前の問題点は、以下の通りです。
//   │・プロパティテーブルスクリプトをぱっと見た時にタイプ名やテーブル名が先頭に無く判り辛い。キーワードよりも名前の方が重要なので、名前が先頭に有る方が望ましい。
//   │・毎回先頭に'type'や'table'を書くのが面倒だから。
//   │上記の問題点を解決するために、以下のように変更しました。
//   │□変更後
//   ││Type1  <"%x" fmt1> "desc1" #//書式と説明文は省略可
//   ││  ～
//   ││end
//   ││Table2 <"%x" fmt2> "desc2" #//書式と説明文は省略可
//   ││  ～
//   ││end
//   ②テーブル定義内の、変数定義行の書式を変更しました。
//   │□変更前
//   ││var   x[2,3] attr1 attr2 <"%x" fmt1> "desc1" #//配列,属性,書式,説明文は省略可
//   ││Type1 y[2,3] attr3 attr4 <"%x" fmt2> "desc2" #//配列,属性,書式,説明文は省略可
//   │変更前の問題点は、以下の通りです。
//   │・プロパティテーブルスクリプトをぱっと見た時に変数名が先頭に無く判り辛い。キーワードやタイプ名よりも変数名の方が重要なので、変数名が先頭に有る方が望ましい。
//   │・①の変更だけを行うと、Yaccのreduce/reduceコンフリクトが発生した。Yaccが1要素しか先読みしない(?)ので、②の変更前の書式ではタイプ定義かテーブル定義かを判断出来ないのだと思う。
//   │上記の問題点を解決するために、以下のように変更しました。
//   │□変更後
//   ││x[2,3]       attr1 attr2 <"%x" fmt1> "desc1" #//配列,属性,書式,説明文は省略可
//   ││y[2,3]:Type1 attr3 attr4 <"%x" fmt2> "desc2" #//配列,属性,書式,説明文は省略可
//   │変更前はC言語の変数宣言に似た書式でしたが、変更後はPascalの変数宣言に似た書式になったと思います。
//   変更後のスクリプトの例は、Sample/Sample.txtを参照して下さい。
//   尚、変更後は'type','table','var'を予約語から削除したので、アプリケーションが各種要素の名前として使用して構いません。
// - '<<','>>'と'<','>'に対して、これまでlex.yy.lがどちらも'<','>'を返していましたが、前者についてはT_SHL,T_SHRを返すようにして区別しました。
//   今回の書式変更を行った際に、'<<','>>'と'<','>'が同じ値を返していると、インラインタイプ定義の'<<'と書式の'<'が区別出来ない問題が生じたからです。
//   元々'<<','>>'に対して'<','>'を返していたのは手抜きでしたので、いずれにしても区別するのが望ましい方法でした。
//   とりあえず今回は当ツールだけを修正しましたが、今後、他のツールも'<<','>>'がT_SHL,T_SHRを返すように修正する予定です。
// - 出力ファイルの仕様は変わっていないので、既存のプログラムへの影響は有りません。
//   今回は変更箇所がやや多かったので、変更前のコードはコメントアウトして残していません。
//   変更前のコードを参照する場合は、前回のアーカイブを参照して下さい。
// * Tue Dec 29 21:41:52 JST 2015 Naoyuki Sawa
// - range型,及び,enum型の値の範囲を、これまでは符号無し16ビット(0～UINT16_MAX)でしたが、符号付き16ビット(INT16_MIN～INT16_MAX)に変更しました。
//   特にrange型において、32768～65535の値が必要なケースよりも、-32768～0が必要なケースの方が多いと思ったからです。
//   たとえば、プレイヤーの座標値を格納する場合などです。
// - enum型の列挙値にマイナス値の指定が必要なケースは少ないと思うので、range型だけ変更してenum型はそのままでも良かったのですが、判り易さのために両方とも変更して統一する事にしました。
// - limit指定の最小値はこれまでと変わらす0である事に注意して下さい。
//   つまり、limit指定の最大値にマイナス値を指定する事は出来ません。
//   たとえば「limit -1」と指定すると、「range 0,-1」と解釈され、最小値と最大値が逆であるエラーになります。
// - 変更前のコードはコメントアウトして残していません。
//   変更前のコードを参照する場合は、前回のアーカイブを参照して下さい。
// * Sat Jan 02 21:26:28 JST 2016 Naoyuki Sawa
// - <"書式文字列">と<書式番号>の同時指定は不可としました。
//   詳細は、/clip/clipprp.h の同日のコメントを参照して下さい。
// * Sun Feb 21 21:02:01 JST 2016 Naoyuki Sawa
// - libclipのライブラリ化の伴い、以下の変更を行いました。
//   ・extclip.hとextclip.cを削除しました。extclip.hとextclip.cはlibclipに含まれるようになったからです。
//   ・"CLiP Files"を削除しました。CLiPライブラリの各モジュールはlibclipに含まれるようになったからです。
//   当ツールの動作には変更有りません。
// * Sun Feb 28 23:18:54 JST 2016 Naoyuki Sawa
// - range型の範囲の制限を緩和しました。
//   変更前は、最小値,最大値共に(-32768～32767)である必要がありました。
//   変更後は、最小値が(-32768～32767)で、最大値は(最小値+0～最小値+65535)となりました。
// - 今回の変更により、以下のようなrange型の定義が可能になりました。
//   ○range -32768,32767 //変更前も変更後もok
//   ○range      0,32767 //変更前も変更後もok
//   ○range      0,65535 //変更前はNG、変更後はok
//   ○range  32767,98302 //変更前はNG、変更後はok(使う事は無いと思いますが…)
//   ×range -65535,0     //変更前も変更後もNG。変更後の仕様でも最小値は(-32768～32767)でなければならない事に注意して下さい。
//   ×range     -1,65535 //変更前も変更後もNG。変更後の仕様でも(最大値－最小値≦65535)でなければならない事に注意して下さい。
// - 上記の変更のために、Prp_rangeのBLOBの構造を変更しました。
//   変更前: Prp_range = {minL,minH,maxL,maxH}
//   変更後: Prp_range = {minL,minH,(max-min)L,(max-min)H}
// - ライブラリ側の変更については、/clip/clipprp.h の同日のコメントを参照して下さい。
//   ダンプツールの変更については、/clip/tool/dPrpTblD/app.c の同日のコメントを参照して下さい。
// * Tue Mar 01 21:34:55 JST 2016 Naoyuki Sawa
// - clipstd.hにてC4131の警告レベルを引き上げましたが、Bison/Flexの生成コードには旧スタイルの宣言が使われているので、Bison/Flexの生成コードのみ警告レベルを元に戻しました。
// * 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で指定するようにし、個別のアプリケーション設定からは削除しました。
// * Mon Apr 25 22:45:55 JST 2016 Naoyuki Sawa
// - 実数の計算式に対応しました。
//   暗黙の型変換のルールは、C言語と同じです。
//   キャスト演算子は、'(int)'と'(double)'のみ対応しています。
// - あくまでも途中計算で実数の計算式が使えるだけであり、最終的には整数にキャストする必要が有る事に注意して下さい。
//   例は、/clip/tool/dTexDefC/winapp.hの同日のコメントを参照して下さい。
// * 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以外のツールについては、今すぐにマルチステートメント対応が必要な訳ではないのですが、上述の通り変更箇所は少ないので、他のツールも一緒に変更しておく事にしました。
//-----------------------------------------------------------------------------
//バージョン定義
//-----------------------------------------------------------------------------
#define VERSION "20161002"
//-----------------------------------------------------------------------------
#endif/*__WINAPP_H__*/
