/* 式評価ルーチン：内部変数設定 */

#include "defines.h"
#include "vsiki.h"
#include "abuff.h"

/* グローバル変数 */
VSSYS Vsikis;

/* 変数システムはローカルを持つ意味があるが、式評価はないと思われるので、
　　システムスタックの増減は可能にするが、ローカルは実現しない */

int vsiki_open(int emax,int vmax,int mode)
/* vsiki/vsiki_miniの利用宣言をする */
/* mode : 0=vsiki , 1=vsiki_mini */
{
unchar *work;
unint size;
	/* ワークエリア設定（全スタック一括確保）*/
	size=emax*LSHORT+vmax*LLONG;
	if (!mode) size+=vmax*LLONG;
	/* このサイズがunintで収まらないときはエラーということ */
	work=newmalloc(size);
	if (work==NULL) return(1);
	
	/* 演算子スタック */
	Vsikis.estack=(unsint *)work;
	Vsikis.vstack=(long *)&Vsikis.estack[emax];
	if (!mode) {
		/* 変数ポイントスタック（数値スタックと連動）*/
		Vsikis.pstack=(long *)&Vsikis.vstack[vmax];
	} /* vsiki_miniでは不要 */
	Vsikis.emax=emax;	/* 演算子スタック段数 */
	Vsikis.vmax=vmax;	/* 数値スタック段数 */
	Vsikis.es=0;		/* 演算子スタック段数 */
	Vsikis.vs=0;		/* 数値スタック段数 */
	Vsikis.mode=mode;	/* モード */
	return(0);
}

void vsiki_close()
/* vsiki/vsiki_miniの利用終了をする */
{
	free(Vsikis.estack);
}
