static    char    sccsid[]="%Z% %M% %I% %E% %U%";
/*************************************************/
/*  Program name                                 */
/*       int       col_mn_tr_if                  */
/* --------------------------------------------- */
/*  (I/O)                                        */
/*       Out        0   :Normal                  */
/*                 -1   :AbNormal                */
/* --------------------------------------------- */
/*  Function :                                   */
/*     Justify no shori.                         */
/* --------------------------------------------- */
/*************************************************/
#include "colmn.h"

extern condList  CLcList;	/* 情報リスト */
extern tableRoot CLtbl;		/* 解析するタグ及び文字が格納される領域*/
extern CLNCB     CLSTCB;	/* タグの構文解析を行うための領域 */

/********************************************/
/*											*/
/********************************************/
static int _parmset(p,len)
char *p;
int len;
{
	int rc;
/*
printf("_parmset:Enter: len=%d\n",len);
*/
	rc = 0;
#if 1
	if ((len=akxttrim(0,p,len)) > 0)	/* 1-->0 2018.10.14 */
#else
	if (akxnskipin(p,len," \t") < len)
#endif
		rc = clparmset(p,len);
/*
printf("_parmset:Exit : len=%d\n",len);
*/
	return rc;
}

/********************************************/
/*											*/
/********************************************/
static int _change_try_with_resources()
{
	static char *_func_="_change_try_with_resources";
	static char sep[]={" \t\"'();"};
	SSP_S ssp;
	int rc,len,i,num,pnm_len,st_pos,nbun;
	int kk_level;	/* ()のネストレベル */
	char *pnm,buf[33];
	GWPRM_S gwprm;

	if ((rc=cl_tr_gather(0)) <= 0) return rc;
	pnm = CLcList.cmd.prmp[0]->prp;
	pnm_len = CLcList.cmd.prmp[0]->prmlen;
	num = CLcList.cmd.prmnum;
/*
printf("%s: num=%d pnm_len=%d pnm=[%s]\n",_func_,num,pnm_len,pnm);
*/
	ssp.sp = 0;
	if ((len=akxtgwns(pnm,pnm_len,&ssp,sep,0x21)) > 0) {
		if (*ssp.wd != '(') {
			rc = ECL_SCRIPT_ERROR;
			memnzcpy(buf,ssp.wd,len,sizeof(buf));
			ERROROUT2("%s: 括弧がありません。[%s]",_func_,buf);
			goto Err;
		}
	}
	else {
		CLcList.cmd.prmnum = 0;
		return 0;
	}
	st_pos = ssp.sp;
	kk_level = 1;
	rc = nbun = 0;
	while ((len=akxtgwns(pnm,pnm_len,&ssp,sep,0x21)) > 0) {
		switch (*ssp.wd) {
		case '(':
			kk_level++;
			break;
		case ')':
			if (--kk_level <= 0) {
				if ((len=akxtpkns(pnm,pnm_len,&ssp," \t",0x21)) > 0) {
					memnzcpy(buf,ssp.wd,len,sizeof(buf));
					/* %s: 右括弧')'の後ろに余分な語句[%s]があります。(sp=%d) */
					ERROROUT3(FORMAT(96),_func_,buf,ssp.sp);
				 	rc = ECL_SCRIPT_ERROR;
					goto Err;
				}
/*
printf("%s: st_pos=%d ssp.sp=%d\n",_func_,st_pos,ssp.sp);
*/
				if (rc=_parmset(pnm+st_pos,ssp.sp-st_pos-1)) goto Err;
			}
			break;
		case ';':
			rc = ECL_SCRIPT_ERROR;
			if (kk_level > 1) {
				/* %s: 区切り';'の位置が不正です。(sp=%d) */
				ERROROUT2(FORMAT(97),_func_,ssp.sp);
				goto Err;
			}
			if (rc=_parmset(pnm+st_pos,ssp.sp-st_pos-1))  goto Err;
			st_pos = ssp.sp;
			break;
		}
	}
	rc = ECL_SCRIPT_ERROR;
	if (kk_level > 0) {
		ERROROUT1(FORMAT(99),_func_);	/* %s: 括弧が閉じていません。 */
		goto Err;
	}
	num = --CLcList.cmd.prmnum;
	for (i=0;i<num;i++) CLcList.cmd.prmp[i] = CLcList.cmd.prmp[i+1];
	return num;
 Err:
	CLcList.cmd.prmnum = num;
 	return rc;
}

/*********************************************/
/*                                           */
/*********************************************/
int col_mn_tr_if()
{
	int rc;

	if (CLcList.cmd.prmnum == 0) {
		ERROROUT(FORMAT(91));	/* col_mn_tr_if: 論理式が必要です。 */
		return ECL_TR_IF;
	}
	if ((rc = cl_tr_gather(0)) >= 0) rc = cl_make_push_leaf();
	return rc;
}

/*********************************************/
/*                                           */
/*********************************************/
int col_mn_tr_try()
{
	static int able[]={C_ENDTRY,C_PROC};
	static int deny[]={C_TRY,C_CATCH,C_FINALLY};
	int rc;

#if 1	/* 2017.05.20 */
	if ((rc=_change_try_with_resources()) < 0 ) {
#else
	if (CLcList.cmd.prmnum > 0) {
		ERROROUT1(FORMAT(41),"col_mn_tr_try");	/* %s: 不要なパラメータがあります。 */
#endif
		return ECL_TR_IF;
	}
/*	if (!(rc=cl_tr_node_check(deny,3,able,2))) */rc = cl_make_push_leaf();
	return rc;
}

/*********************************************/
/*                                           */
/*********************************************/
int col_mn_tr_throw()
{
	int rc;

	if (CLcList.cmd.prmnum == 0) {
		ERROROUT1(FORMAT(92),"col_mn_tr_throw");	/* %s: 式が必要です。 */
		return ECL_TR_IF;
	}
	if (!(rc = cl_make_leaf())) rc = cl_push();
	return rc;
}
