//	ＡＩＧライブラリ　式評価/変数処理関数
//		Copyright (C) 1994-95,98 by AIG-SOFT

#ifndef	__AIG_VSIKI__
#define	__AIG_VSIKI__	1

#include "defines.h"
#include "vserr.h"

/* 演算子内部コード */
#define	VMINUS	'@'		/* マイナス */
#define	VRSHIFT	(('>'<<8)|'>')	/* 右シフト */
#define	VLSHIFT	(('<'<<8)|'<')	/* 右シフト */
#define	VGE	(('>'<<8)|'=')	/* 大なりイコール */
#define	VLE	(('<'<<8)|'=')	/* 小なりイコール */
#define	VEQU	(('='<<8)|'=')	/* イコール */
#define	VNE	(('!'<<8)|'=')	/* not イコール */
#define	VRROT	(('-'<<8)|'>')	/* 右ローテート */
#define	VLROT	(('<'<<8)|'-')	/* 右ローテート */
#define	VINC	(('+'<<8)|'+')	/* +1 */
#define	VDEC	(('-'<<8)|'-')	/* -1 */
#define	VAND	(('&'<<8)|'&')	// 論理AND
#define	VOR	(('|'<<8)|'|')	// 論理OR

typedef struct { /* 式評価構造体 */
	short	emax;		/* 演算子スタック段数 */
	short	vmax;		/* 数値スタック段数 */
	short	es;		/* 演算子スタック段数 */
	short	vs;		/* 数値スタック段数 */
	unsint	*estack;	/* 演算子スタック */
	long	*vstack;	/* 数値スタック */
	long	*pstack;	/* 変数ポイントスタック（数値スタックと連動）*/
	short	mode;		/* mode=0:vsiki , 1:vsiki_mini */
} VSSYS;

/** 変数管理 **/

#define	VTOP	2	/* 変数格納先頭位置：ハッシュの関係で０は使えない */

typedef struct { /* 変数管理システム構造体 */
	unchar	*vwork;		/* 変数格納エリア */
	long	vwsize;		/* 変数格納エリアサイズ */
	long	vpoint;		/* 新規変数登録位置 */
	long	vlots;		/* 登録されている変数の数 */
	long	*vhash;		/* ハッシュ格納エリア */
	unsint	vhsize;		/* ハッシュ格納エリア要素個数 */
	unsint	vlmax;		/* １変数最大長 */
	unsint	mode;		/* モード */
				/* BIT15=変数は要別定義 */
} VARSYS;

/* プロトタイプ宣言 */
/* 式評価・変数処理系はシステムに内部に関わるため、
	デバッグを強化するためプロトタイプ宣言のみとする */

#ifdef	__cplusplu
// 95/11 : G++対応
extern	"C" {
#endif

int	vsiki_open(int ,int ,int );
void	vsiki_close(void);
int	vsiki(unchar *(*),long *,VARSYS *,VARSYS *);
int	vsiki_mini(unchar *(*),long *);
int	vsiki_read(unchar *,long *,int ,int ,VARSYS *,VARSYS *);
int	vsiki_readF(unchar *,long *,int ,int ,VARSYS *,VARSYS *);
unchar	*vsiki_err(int );
unchar	*vsiki_err0(int );
unchar	*NumVarRead(unchar *,long *,int *,long *,int *,VARSYS *,VARSYS *);
unchar	*NumRead(unchar *,long *);
unchar	*read_var_name(unchar *,unchar *,int );
unchar	*EnzanRead(unchar *,unsint *);
int	Enzan(int (*)(),VARSYS *,int *);
int	Yusen(unint);

int	var_open(long,long,int,VARSYS *);
void	var_close(VARSYS *);
long	var_search(unchar *,VARSYS *,int *);
int	var_read(unchar *,long *,int *,long *,VARSYS *);
long	var_define(unchar *,int,VARSYS *);
int	var_num_read(long ,long *,int *,VARSYS *);
long	var_num_write(long ,long ,int ,VARSYS *);
int	var_write(unchar *,long,VARSYS *);
int	var_hash_set(unchar *,VARSYS *);
int	var_undef(unchar *,VARSYS *);
void	var_dump(int,VARSYS *);
long	var_check(VARSYS *);
unchar	*var_err(int );
long	var_search2(unchar *,VARSYS *,VARSYS *,int *,int *);
int	var_read2(unchar *,long *,int *,long *,VARSYS *,VARSYS *);
long	var_define2(long ,int ,VARSYS *,VARSYS *);
int	var_nkchk(VARSYS *,void (*)(unchar *));

#ifdef	__cplusplus
}
#endif

// マクロ関数
#define	var_err(no)	(ErrorSearch(ERRvar,no))
#define	vsiki_err0(no)	(ErrorSearch(ERRvsiki,no))

#endif
