static    char    sccsid[]="%Z% %M% %I% %E% %U%";
/************************************************************************/
/*																		*/
/*	処理目的	： ＥＬＳＥコマンドメイン								*/
/*																		*/
/*	関数名		： int cl_process_else(pLeaf, pProc)					*/
/*																		*/
/*	引き数		： (I)Leaf		: * pLeaf								*/
/*				   (I)ProcCT	: * pProc								*/
/*																		*/
/*	戻り値		： ERROR												*/
/*				   NORMAL												*/
/*																		*/
/*	処理概要	：														*/
/*																		*/
/************************************************************************/

#include "colmn.h"
#define NEORET

extern GlobalCt *pGlobTable;

int cl_process_else(pLeaf, pProc)
Leaf   *pLeaf;
ProcCT *pProc;
{
	int rc;
	char buf[32];
	int id;
	BlockCB *pIfCB;
	BlockCB *pBlockCB;

	if (!(pIfCB = pProc->pcrBlockCB)) return -1;
	id = pIfCB->cid;
	if (id==C_IF || id==C_SWITCH || id==C_TRY) ;
	else return -1;

	if( pIfCB->ElseFlag == L_ON ) {
		if (cl_get_cmd_name(pLeaf->cmd.cid,buf)) return -2;
		ERROROUT1(FORMAT(366),buf);	/* %sが重複しています。 */
		return ECL_EX_ELSE;
	}

	/* ＥＬＳＥコマンドフラグをオン */
	pIfCB->ElseFlag = L_ON;

	/* 2017.03.18 */
	id = pLeaf->cmd.cid;
	if (id==C_DEFAULT && pIfCB->TureFlag==L_ON) {
		if (pIfCB->iLoopMax != C_BREAK) {
			pIfCB->Blockleaf = pLeaf->rightleaf;	/* Add 2021.6.27 */
			pProc->Nextleaf = pLeaf->leftleaf;
			cl_ret_leaf_push(pProc,pLeaf->rightleaf);
		}
		else
			pProc->Nextleaf = pLeaf->rightleaf;
	}
	else if (id==C_FINALLY || (id==C_ELSE && pIfCB->TureFlag!=L_ON)) {
		pIfCB->iUsed = D_SWITCH_DEFAULT;	/* Add 2017.3.25 */
		pIfCB->Blockleaf = pLeaf->rightleaf;	/* Add 2017.3.25 */
		pProc->Nextleaf = pLeaf->leftleaf;
		cl_ret_leaf_push(pProc,pLeaf->rightleaf);
#if 0	/* 2021.3.19 */
		/* Catchされたときは、エラーメッセージをクリアする */
		if (id==C_FINALLY && !pGlobTable->exception) {
			pGlobTable->err_hist[0].parlen = 0;
			pGlobTable->err_hist[1].parlen = 0;
			*pGlobTable->errmsg = '\0';
		}
#endif
	}
	else {
		pProc->Nextleaf = pLeaf->rightleaf;
	}

	return 0;
}
