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

long var_search(unchar *vname,VARSYS *var,int *md)
/* 変数サーチ */
/* return=0:その変数は定義されていない
	 >0:その変数の格納位置（数値確定）
	 <0:その変数の格納位置*-1（数値未確定）
*/
{
int len,vlen,fdbl=0;
long p;
	if (var->vpoint==VTOP) return(0); /* 変数は１つもない */
	
	/* ハッシュで最初のサーチポイントを決める */
	p=var->vhash[hash(vname)%var->vhsize];
	if (p&BIT31) {fdbl=1; p&=~(BIT31);}
	if (p>0) { /* ハッシュにはあった */
		len=strlen(vname); /* 変数名長 */
		do { /* 格納エリアからサーチ */
			/* 比較 */
			vlen=var->vwork[p];
			if (vlen==len) { /* 変数名長も一致 */
				/* 変数名比較 */
				if (memcmp(&var->vwork[p+6],vname,vlen)==0) { /* 発見 */
				    int m;
					m=var->vwork[p+1]; /* モード・型 */
					if (md!=NULL) *md=m;
					return(m&VKAKU? -p:p); /* 未確定:確定 */
				}
				/* まだ処理に無駄はあるけど・・・ */
			} /* 変数名長が一致しない時は即不一致 */
			if (!fdbl) break; /* ﾊｯｼｭ重複無し:ここで一致しなければなし */
			/* 次の変数へ */
			p+=(6+vlen+1);
		} while (p<var->vpoint);
	} /* ハッシュにない */
	/* この変数は登録されていない */
	return(0);
}
