/*****************************************************************************
 * 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.h======================================================*/
/*---------------------------------------------------------------------------*/
/* 構造体定義 */
typedef struct _ST_LabelRow {
	int		line;		//行番号。エラーメッセージのためだけに使用する。
	char*		lab;
} ST_LabelRow;
//play
typedef struct _ST_PlayRows {
	int		n;
	char**		TBL_PlayRow/*[n]*/;
} ST_PlayRows;
typedef struct _ST_SeqTbl {
	ST_LabelRow*	labelRow;
	ST_PlayRows*	playRows[2];	//[0]=repeatよりも前,[1]=repeatよりも後
	//--- これより下は2パス目で使用 ---
	int		addr;
	int		outLen;
	unsigned char*	outBuf/*[outLen]*/;
} ST_SeqTbl;
//data
typedef struct _ST_DataRow {
	int		n;
	int*		TBL_Dimmer/*[n]*/;
} ST_DataRow;
typedef struct _ST_DataRows {
	int		n;
	ST_DataRow**	TBL_DataRow/*[n]*/;
} ST_DataRows;
typedef struct _ST_DatTbl {
	ST_LabelRow*	labelRow;
	ST_DataRows*	dataRows;
	int		loopIndex;
	//--- これより下は2パス目で使用 ---
	int		addr;
	int		outLen;
	unsigned char*	outBuf/*[outLen]*/;
} ST_DatTbl;
/*---------------------------------------------------------------------------*/
/* グローバル関数宣言 */
void add_seqTbl(ST_SeqTbl* seqTbl);
void add_datTbl(ST_DatTbl* datTbl);
ST_SeqTbl* SeqTbl_new(ST_LabelRow* labelRow, ST_PlayRows* playRows0, ST_PlayRows* playRows1);
ST_DatTbl* DatTbl_new(ST_LabelRow* labelRow, ST_DataRows* dataRows, int loopIndex);
ST_LabelRow* LabelRow_new(char* lab);
char* LabDef_new(char* lab);
ST_PlayRows* PlayRows_add(ST_PlayRows* playRows, char* lab);
char* LabRef_new(char* lab);
ST_DataRows* DataRows_add(ST_DataRows* dataRows, ST_DataRow* dataRow);
ST_DataRow* DataRow_add(ST_DataRow* dataRow, int num);
int Dimmer_new(int num);
/*---------------------------------------------------------------------------*/
/*--- 変更履歴 ---*/
// * Fri Feb 27 21:32:00 JST 2015 Naoyuki Sawa
// - 1st リリース。
// * Sat Feb 28 23:34:35 JST 2015 Naoyuki Sawa
// - 最適化処理を実装しました。
// * Sun Mar 01 08:36:08 JST 2015 Naoyuki Sawa
// - イントロ部分の圧縮データサイズを格納しないように変更しました。clipleds.hとclipleds.cの処理も変更しました。
// - やや大幅な変更になったので、変更前のコードは当モジュール内には残してありません。
//   変更前の処理でも動作確認済みだったので、今後変更前のコードを参考にする場合は、前回のアーカイブを参照してください。
// * Mon Mar 02 21:47:20 JST 2015 Naoyuki Sawa
// - TBL_LedSeqNo[0]に((LedSeqNo_Max+1)|(LedCh_Max+1)<<16)を格納するようにしました。
// - アプリケーションは「TBL_LedSeq=&TBL_LedSeqNo[(unsigned short)TBL_LedSeqNo[0]]」でデータの先頭位置を求められるようになりました。
//   ヘッダファイルを見なくてもバイナリだけを見て処理できるようにするためです。
//   尚、LedSeqNo_Maxの定義もこれまで通りヘッダファイルに出力していますので、LedSeqNo_Maxもこれまで通り使用可能です。
//   LedSeqNo_Maxを使ってデータの先頭位置を求める場合は「TBL_LedSeq=&TBL_LedSeqNo[(LedSeqNo_Max+1)]」としてください。
// - アプリケーションはLedSeq_Init()に指定するLEDチャネル数を「pLedSeq=LedSeq_Init(〜,TBL_LedSeqNo[0]>>16)」と指定できるようになりました。
//   ヘッダファイルを見なくてもバイナリだけを見て処理できるようにするためです。
//   尚、LedCh_Maxの定義もこれまで通りヘッダファイルに出力していますので、LedCh_Maxもこれまで通り使用可能です。
//   LedCh_Maxを使ってLEDチャネル数を指定する場合は「pLedSeq=LedSeq_Init(〜,(LedCh_Max+1)」としてください。
// * Fri Mar 06 21:00:56 JST 2015 Naoyuki Sawa
// - '-e'オプションを追加しました。
//   標準エラー出力をリダイレクトすると、進捗表示と混ざって見づらかったので、ログファイルを生成できるようにしました。
/* バージョン定義 */
#define VERSION "20150306"
/*---------------------------------------------------------------------------*/
#endif/*__WINAPP_H__*/
