/* 変数管理システム */
#include "var.h"

short VarDefine(unchar *vname,unsint type,VARSYS2 *var)
/* 変数登録（未確定）*/
/* type : VDAI=0:普通 ,1:再代入不可 , VTYPEも指定可能 */
/* 最初は0にしておいて、確定代入の時に1にしてもいい。ただし、そのときにはVarWriteは使えない */
/* >0:ok , <0:error */
{
short p;
	/* 新規登録／変更判定 */
	if (VarSearch(vname,var,NULL)) return(VARDBL0); /* ２重定義 */
	
	/* 変数名長チェック */
	if ((var->mode&BIT0? (int)(*vname):strlen(vname))>var->vlmax) {
		return(VARLONG0); /* 長すぎる */
	}
	
	/* 変数は未定義 -> 新規登録：最初は必ず数値未確定 */
	p=var->vpoint;
	if (p>=var->vwsize) return(VAROVER0); /* これ以上格納できない */
	
	/* ハッシュ設定 */
	{ unsint h; short vh;
	h=hash(vname)%var->vhsize;
	vh=var->vhash[h];
	if (vh) { // すでにそのハッシュは使われている
		if (vh>0) var->vhash[h]=-vh; // 重複有りの印
		// すでに重複している時は何もしない
	} else	var->vhash[h]=var->vpoint;
	#if DEBUG
	printf2("[%x,%x,%x]\n",var->vhash[h],hash(vname),h);
	#endif
	}
	
	#if DEBUG
	printf("(%d)%s[%x]\n",p,vname+(var->mode&BIT0),type);
	#endif
	
	/* 変数格納 */
	var->vwork[p].adrs=vname; /* 変数名(アドレス) */
	var->vwork[p].type=(unchar)(type|VKAKU); /* TYPE:未確定で */
	var->vpoint++; /* next point=変数個数 */
	return(p); /* この変数の要素番号を返す */
}
