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

long var_define(unchar *vname,int mode,VARSYS *var)
/* 変数登録（未確定）*/
/* mode : VDAI=0:普通 ,1:再代入不可 , VTYPEも指定可能 */
/* 最初は0にしておいて、確定代入の時に1にしてもいい */
/* ただし、そのときにはvar_writeは使えない */
{
long p,p0;
int len;
	/* 新規登録／変更判定 */
	p=var_search(vname,var,NULL);
	if (p!=0) return(-2L); /* ２重定義 */
	
	p0=p=var->vpoint;
	len=strlen(vname);
	if (len>var->vlmax) return(-3L); /* 変数名長が長すぎる */
	
	/* 変数は未定義 -> 新規登録：最初は必ず数値未確定 */
	if (p+1+1+LLONG+len+1>=var->vwsize) return(-1L); /* これ以上格納できない */
	
	/* ハッシュ設定 */
	var_hash_set(vname,var);
	
	/* 変数名書き込み */
	#if DEBUG
	printf("(%d)%s[%x]",var->vlots+1,vname,mode);
	#endif
	
	/* 変数格納 */
	var->vwork[p++]=(unchar)len; /* 変数名長 */
	var->vwork[p++]=(unchar)(mode|VKAKU); /* TYPE:未確定で */
	p+=LLONG; /* 数値代入はしない */
	strcpy(&var->vwork[p],vname); /* 変数名格納 */
	var->vpoint=p+len+1; /* next point */
	
	/* 変数個数 */
	var->vlots++;
	return(p0); /* この変数の先頭アドレスを返す */
}
