#include "defines.h"
#include "stk.h"

extern STKSYS *stksys;

unchar *RemakeToken(unchar *ctext)
/* 中間コードに相当する文字列を作る（そのアドレスを返す）*/
// 中間コード化途中のコードは変換できない（実行時のコードのみ有効）
{
unchar c,len;
static unchar token[TKLEN];
	c=*ctext++;
	len=*ctext++;
	if (c<=SCCMD) { /* コマンド */
	    STKCOM *tbl;
		tbl=*(STKCOM **)ctext;
		return(tbl[c&CMDMAX].name); /* コマンド名 */
	}
	switch (c) {
		case SCSTR1:// 固定文字列
		case SCNUM: // 数値
		// 固定文字列・数値はその前にあるSCCOMTで表示されるので
		// それ自体は表示しない
			return(""); // 何も表示しない
		
		case SCEND: // End of Text
			return("; End");
		
		case SCVAR: // 変数
			// 中間コード -> point
			// Gvar.vwork[point]
			// .adrsに変数名の格納されているアドレスがある
			return(stksys->Gvar.vwork[*(long *)ctext].adrs);
		
		case SCLBL: // ラベルアドレス
		case SCCALL:// callラベルアドレス
			ctext=*(unchar **)ctext; // 飛び先のアドレス
			// その飛び先にはラベルのコメントがあるはず
			if ((*ctext++)!=SCCOMT) { // コメント以外はエラー
		    default:
				sprintf2(token,"中間コード異常:%02x(RemakeToken)",c);
				break;
			}
			ctext++; /* skip len */
		case SCCOMT: // コメント=テキスト参照
			// その後に続くアドレスがテキストをさしているので、
			// そこから１トークンを取ってくる
			// 必ず読み取れるはずなのでエラーチェックしていない
			{ unchar *text,*btext;
			text=*(unchar **)ctext;
			STKTokenGet(token,&text,&btext);
			// Label: ':'を変更する
			len=strlen(token)-1;
			if (c==SCLBL)  token[len]=0; // goto系
			else
			if (c==SCCALL) token[len]=SYMCL; // call
			}
			break;
	}
	return(token);
}
