/*****************************************************************************
 * 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_Symbol {
	char*				pLabel;			//シンボルラベル	┬シンボル定義の場合は両方ともNULL不可。シンボル参照の場合は片方だけNULLとする事。
	char*				pDesc;			//説明文		┘
	//以下のフィールドは2パス目で格納する。
	int				iSymbolNo;		//シンボル番号
} ST_Symbol;
ST_Symbol* SymbolDef_New(char* pLabel, char* pDesc);	//両方ともNULL不可
ST_Symbol* SymbolRef_New(char* pLabel, char* pDesc);	//片方だけNULLとする事
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ゲームモード
typedef struct _ST_GameMode {
	char*				pLabel;			//ゲームモードラベル
	struct _ST_GameModeBody*	pGameModeBody;		//ゲームモードボディ
	//以下のフィールドは2パス目で格納する。
	int				iGameModeNo;		//ゲームモード番号
} ST_GameMode;
ST_GameMode* GameMode_New(char* pLabel, struct _ST_GameModeBody* pGameModeBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ゲームモードボディ
typedef struct _ST_GameModeBody {
	struct _ST_ReelStrip*		pReelStrip;		//リールストリップ
	struct _ST_LineDef*		pLineDef;		//ライン定義
	struct _ST_PayTable*		pPayTable;		//ペイテーブル
} ST_GameModeBody;
ST_GameModeBody* GameModeBody_New(struct _ST_ReelStrip* pReelStrip, struct _ST_LineDef* pLineDef, struct _ST_PayTable* pPayTable);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//リールストリップ
typedef struct _ST_ReelStrip {
	GSList*				sl_pReelStripRow;	//リールストリップ行のリスト
	//以下のフィールドは2パス目で格納する。
	int				nReel;			//リールストリップの、一行目の列数(=リール数)。TBL_ReelStripLen[0]〜TBL_ReelStripLen[nReel-1]の値は、全て1以上の値になるはずである。
	int		TBL_ReelStripLen[256/*調整可*/];	//リールストリップの、各列(リール)の長さを数える配列。一般的な列数は5列(=5リール)程度だから、256列分用意しておけば充分過ぎるだろう。
} ST_ReelStrip;
ST_ReelStrip* ReelStrip_New(struct _ST_ReelStripRow* pReelStripRow);
ST_ReelStrip* ReelStrip_AddReelStripRow(ST_ReelStrip* pReelStrip, struct _ST_ReelStripRow* pReelStripRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//リールストリップ行
typedef struct _ST_ReelStripRow {
	struct _ST_ReelStripRowBody*	pReelStripRowBody;	//リールストリップ行ボディ
} ST_ReelStripRow;
ST_ReelStripRow* ReelStripRow_New(struct _ST_ReelStripRowBody* pReelStripRowBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//リールストリップ行ボディ
typedef struct _ST_ReelStripRowBody {
	GSList*				sl_pSymbolRef;		//シンボル参照のリスト
} ST_ReelStripRowBody;
ST_ReelStripRowBody* ReelStripRowBody_New(ST_Symbol* pSymbolRef);
ST_ReelStripRowBody* ReelStripRowBody_AddSymbol(ST_ReelStripRowBody* pReelStripRowBody, ST_Symbol* pSymbolRef);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ライン定義
typedef struct _ST_LineDef {
	GSList*				sl_pLineDefRow;		//ライン定義行のリスト
} ST_LineDef;
ST_LineDef* LineDef_New(struct _ST_LineDefRow* pLineDefRow);
ST_LineDef* LineDef_AddLineDefRow(ST_LineDef* pLineDef, struct _ST_LineDefRow* pLineDefRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ライン定義行
typedef struct _ST_LineDefRow {
	struct _ST_LineDefRowBody*	pLineDefRowBody;	//ライン定義行ボディ
} ST_LineDefRow;
ST_LineDefRow* LineDefRow_New(struct _ST_LineDefRowBody* pLineDefRowBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ライン定義行ボディ
typedef struct _ST_LineDefRowBody {
	GSList*				sl_iRow;		//行番号のリスト
} ST_LineDefRowBody;
ST_LineDefRowBody* LineDefRowBody_New(int iRow);
ST_LineDefRowBody* LineDefRowBody_AddRow(ST_LineDefRowBody* pLineDefRowBody, int iRow);
int Row_New(int iRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ペイテーブル
typedef struct _ST_PayTable {
	GSList*				sl_pPayTableRow;	//ペイテーブル行のリスト
} ST_PayTable;
ST_PayTable* PayTable_New(struct _ST_PayTableRow* pPayTableRow);
ST_PayTable* PayTable_AddPayTableRow(ST_PayTable* pPayTable, struct _ST_PayTableRow* pPayTableRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ペイテーブル行
typedef struct _ST_PayTableRow {
	struct _ST_PayTableRowBody*	pPayTableRowBody;	//ペイテーブル行ボディ
} ST_PayTableRow;
ST_PayTableRow* PayTableRow_New(struct _ST_PayTableRowBody* pPayTableRowBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ペイテーブル行ボディ
typedef struct _ST_PayTableRowBody {
	ST_Symbol*			pSymbolRef;		//シンボル参照
	GSList*				sl_nPay;		//配当額のリスト
} ST_PayTableRowBody;
ST_PayTableRowBody* PayTableRowBody_New(ST_Symbol* pSymbolRef, int nPay);
ST_PayTableRowBody* PayTableRowBody_AddPay(ST_PayTableRowBody* pPayTableRowBody, int nPay);
int Pay_New(int nPay);
//-----------------------------------------------------------------------------
//グローバル関数宣言
//-----------------------------------------------------------------------------
int cast_dbl_to_int(double d);
void addSymbolRow(ST_Symbol* pSymbolDef);
void addGameMode(ST_GameMode* pGameMode);
//-----------------------------------------------------------------------------
//変更履歴
//-----------------------------------------------------------------------------
// * Thu Feb 23 21:53:55 JST 2017 Naoyuki Sawa
// - 1st リリース。
//   dTexDefCをベースにして作成しました。
// - アプリケーションからの使用方法は、clipvsl.cの「dVslDefC.exe対応ユーティリティ」を参照して下さい。
// * Fri Feb 24 21:21:52 JST 2017 Naoyuki Sawa
// - シンボルの列挙定義名を"Symbol_*"→"VslSym_*"に変更しました。
//   ゲームモードの列挙定義名を"GameMode_*"→"VslGmd_*"に変更しました。
//   変更した理由は、"Symbol_*"や"GameMode_*"では一般的な名前過ぎて、アプリケーションが別の目的で定義した定数や変数の名前と衝突する恐れが有ると思ったからです。
//   変更後の"VslSym_*","VslGmd_*"ならば、まず衝突する事は無いと思います。
// * Thu Mar 16 22:31:07 JST 2017 Naoyuki Sawa
// - ライン定義も出力するように変更し、それに伴って、レジストリ構造も変更しました。
//   詳細は、/clip/clipvsl.h の同日のコメントを参照して下さい。
// - 今回は変更量が多かったので、変更前のコードはコメントアウトして残していません。
//   変更前のコードを参照する必要が有る場合は、前回のアーカイブを参照して下さい。
// - 今回、既存の定義ファイルの書式に対する変更点として、NULLのシンボル参照を変更前は「-」で表していたのを、変更後は「""」にしました。
//   そうせざるを得なかった理由は、「-」では(今回追加した)ライン定義の数値の一部とも見なせてしまい、shift/reduce衝突が発生してしまうからです。
//   「""」ならば、(ライン定義だった場合はそれに続く「,」又は改行との組み合わせで)ライン定義と判断出来るので、shift/reduce衝突は発生しません。
// * Thu Mar 16 23:39:55 JST 2017 Naoyuki Sawa
// - 複数の入力ファイルを指定した時に、最後以外のファイルでエラーが発生した場合、当ツールの終了ステータスが0になっていたバグを修正しました。
//   詳細は、/clip/tool/dEnmDefC/winapp.hの同日のコメントを参照して下さい。
//-----------------------------------------------------------------------------
//バージョン定義
//-----------------------------------------------------------------------------
#define VERSION "20170316"
//-----------------------------------------------------------------------------
#endif/*__WINAPP_H__*/
