#include "stk.h"

int STKVarChange(NSTACK *nstk,int mode)
// 変数を内容参照に変更+アドレスの絶対アドレス化(切り放し不可)
// mode : 0=普通 , 1=アドレスは絶対アドレス化しない
{
extern STKSYS *stksys;
static char VtoN[]={ // 変数型から数値スタック識別子に変えるテーブル
	// VNUM,VARY ,VSTR1    元
	   NNUM,NADRS,NSTR1 // 変換後
};
	//switch ((nstk->atrb)&0xff) {
	switch ((unchar)nstk->atrb) {
	    // 変数の内容参照化
	    case NVADR:
		nstk->atrb=(unsint)VtoN[(nstk->atrb)>>8];
		if (nstk->atrb==NSTR1) { // 固定文字列の時は長さを付ける
			// adrs-1に長さがある
			nstk->point=(long)*(unchar *)(nstk->num-1);
			break;
		}
		if (nstk->atrb==NADRS) { // 配列アドレスの時は先頭位置を返す
		    nstk->point=nstk->num; // 先頭ofst
		    nstk->num=nstk->point+ARYHEAD; // 本体先頭ofst
	    case NADRS:
		    if (!mode) { // 絶対アドレス化
			nstk->num  +=(long)stksys->Abuff;
			nstk->point+=(long)stksys->Abuff;
		    }
		}
		break;
	
	    // 未確定変数は参照不可
	    case NVADRN:
		#if DEBUG
		//printf2("atrb=%c/%d",nstk->atrb&0xff,nstk->atrb>>8);
		printf2("atrb=%c/%d",(unchar)nstk->atrb,nstk->atrb>>8);
		#endif
		return(VARNKAKU);
	} // 他は変換しない
	return(OK);
}
