/*****************************************************************************/
/* 変数管理システム */
/*****************************************************************************/

#include "var.h"
#include "abuff.h"

/*****************************************************************************/
/* 変数の格納仕方
	VAR1	type adrs num
		2    4    4	size
		0    2    6     offset

		adrs			adrs
		len name+EOS		name+EOS
	BIT0=1	1   len         size	len		BIT0=0
		0   1		offset	0

	lenは1byte。従って、文字列長は最大255byteまで。
	00は予約で、1〜255までが有効。

	typeは変数モード。現在定義済みは次の状態。
		VKAKU	0=確定,1=未確定
		VDAI	0=普通,1=再代入不可
		VLABEL	0=数値,1=ラベル
		VTYPE	0〜31
			0=数値

	num:数値は32bit(long)数値のみ。
	それを数値とみなすかポインターとみなすかは利用システムによる。

	エリアサイズはmaxでshortサイズ=32K個の変数が扱えるということ。
	ハッシュは変数エリアの1/8の大きさで、shortサイズ。各要素もshort。
*/
/*****************************************************************************/

int VarOpen(short vsize,short vlmax,unsint mode,VARSYS2 *var)
/* 初期化 */
/* vsize=変数最大数 , vlmax=１変数名最大長 , mode=処理モード */
{
	/* 変数サイズチェック */
	if (vlmax<2||vlmax>255) vlmax=128; /* 長さ */
	/* 個数(最小数は適当>8) */
	if (vsize<8) vsize=8; /* maxは32K,shortなのでそれ以上は<0となる */
	
	/* ハッシュエリアサイズ計算 */
	var->vhsize=vsize/8; /* サイズは変数数の1/8 */
	if (var->vhsize<64) var->vhsize=64; /* ある程度以下にはしない */
	/* vsizeに上限があるので最大値設定はしない */
	
	/* エリア確保（変数/ハッシュ同時）*/
	var->vwork=(VAR1 *)newmalloc(sizeof(VAR1)*vsize+LSHORT*var->vhsize);
	if (var->vwork==NULL) return(VARNMEM); /* メモリーが足りない */
	var->vhash=(unsint *)&var->vwork[vsize];
	
	#if DEBUG
	printf2("vwork=%p,vsize=%d,vlmax=%d,vhsize=%d\n"
				,var->vwork,vsize,vlmax,var->vhsize);
	#endif
	
	/* 変数格納エリア初期化 */
	var->vwsize=vsize;
	var->vlmax=vlmax;
	var->vpoint=VTOP2;	/* ハッシュの関係で先頭は使えない */
	var->mode=mode;
	var->vnb.size=0;	/* 変数名格納エリアは使っていないの印 */
	
	/* ハッシュテーブル初期化 */
	{ short i;
	for (i=0;i<var->vhsize;i++) var->vhash[i]=0;
	}
	return(VOK);
}

/*****************************************************************************/
