/*---------------------------------------------------------------------------*/
/** エラー処理（切り放し不可）**/

#include "stk.h"

static unchar SysErr[TKLEN*2];
static unchar ErrToken[TKLEN];
static unchar *Errctext;

/*---------------------------------------------------------------------------*/

void SetErrToken(unchar *token)
/* エラーの発生したtokenの記録 */
{
	strcpy(ErrToken,token[0]==0? (unchar *)"不明":token);
}

void SetErrCode(unchar *ctext)
/* エラーの発生した中間コードの記録 */
{
	ErrToken[0]=0; /* Errctextを使う印 */
	Errctext=ctext;
}

void ErrCode2Token(void)
// エラーの発生した中間コードをテキスト化する
// 中間コードエリア解放後にエラーチェックをするための文字列化処理
{
	// ErrTokenの設定がある時にはそれを使う
	if (ErrToken[0]==0) strcpy(ErrToken,RemakeToken(Errctext));
}

unchar *STKErrToken(void)
// エラーの発生したtokenを返す
{
	// あらかじめErrCode2Token()で中間コードエラーをテキスト化しておくこと
	return(ErrToken);
}

/*---------------------------------------------------------------------------*/

int STKCodeErr(unchar c,unchar *mes)
// 中間コードエラー用メッセージ設定＆エラーリターン
{
	sprintf2(SysErr,"中間コード(%02x/%s)",c,mes);
	return(SYSERR);
}

int STKSysErr(unchar *mes)
// SYSERR用メッセージ設定＆エラーリターン
{
	// メッセージはTKLEN以内で設定すること
	strcpy(SysErr,mes);
	return(SYSERR);
}

/*---------------------------------------------------------------------------*/

static ERLINK erlist1={ERRvar,NULL    };	// 変数系エラー	: ﾘﾝｸ２番目
static ERLINK erlist0={ERRstk,&erlist1};	// STKエラー	: ﾘﾝｸ最初

int STKErrLink(ERLINK *elink)
// エラーリンク
{
	SetErrLink(&erlist0,elink);
	return(OK);
}

/*---------------------------------------------------------------------------*/

unchar *STKError(int eno)
// エラーメッセージ作成 : STKは細かいエラーメッセージが売りもの
{
static unchar line[TKLEN*2];
unchar *mes;
	mes=LinkErrorSearch(&erlist0,eno);
	if (mes!=NULL) { // メッセージあり
		if (eno!=SYSERR) return(mes);
		// SYSERRはその発生場所も表示する
		// ｼｽﾃﾑｴﾗｰ:内容
		sprintf2(line,"%s：%s",mes,SysErr);
	} else {// mes==NULL : メッセージは登録されていない
		// ここに来た時はシステムがバグっているか、破壊されている
		sprintf2(line,"未知のエラー:$%x",eno);
	}
	return(line);
}

/*---------------------------------------------------------------------------*/
