/************************************/
/*	cl_def_var_mult					*/
/************************************/
int cl_def_var_mult(cmdobj,prmnum,pprmp,scrct,proc,opt,iParm)
CMDObject *cmdobj;
int      prmnum;
parmList **pprmp;
ScrPrCT  *scrct;
ProcCT   *proc;
int      opt,iParm[];
{
	XHASHB *pha_vname;
	tdtInfoParm ***pTBL_vname;
	int  i,j,k,iParmNo,rc,vnlen,is,ias,ntype,datalen,nvar,rc_srch_equ,pos,pos_var_end,disp;
	int line_len,sp_save,type,vlen,n;
	int check[4],*obj,npr,iob,exec_flg,ipr,ida,ipr_pos,ida_nam,iob_ary;
	int iARRAY,iEQU,iCONST,iSKIP,iSTATIC,iCLEAR,iCOM,iARRAY0,iMAPPED;
	char c,*varnam,*p,id,*argv[6],*line,wrk[128],*pp,*vnam,**da;
	tdtInfoParm *pInfoParm,*pParm,*pInfoDef;
	tdtDefType *pDeftype,*pDeftypeP;
	parmList  **parmName;
	tdtArrayIndex *pIndex;
	int *index,attr,size,len;
	SSPL_S ssp;
	parmList *pPrmp;
	parmList *qprmp3[MAX_ARRAY_DIM+1];
	parmList *qprmp[MAX_ARRAY_DIM+1];
	tdtObjHead *pObj;
	GXObject *bxobj[2];
	uchar ucLOCAL;

	argv[0] = "cl_def_var_mult";
/*
printf("%s: Enter opt=%08x iParm=%d %d %08x %d\n",
argv[0],opt,iParm[0],iParm[1],iParm[2],iParm[3]);
*/
	type = iParm[0];
	pDeftypeP = NULL;
#if defined(_LP64)	/* 2021.2.13 */
	memcpy(&p,iParm+2,sizeof(char *));
	if (!type && p) {
		if (pInfoDef = (tdtInfoParm *)p) {
#else
	if (!type && iParm[2]) {
		if (pInfoDef = (tdtInfoParm *)iParm[2]) {
#endif
			pDeftypeP = (tdtDefType *)pInfoDef->pi_data;
			type = pInfoDef->pi_aux[0];
		}
	}

	line = pprmp[0]->prp;
	line_len = pprmp[0]->prmlen;
	memset(&ssp,0,sizeof(SSPL_S));

	iob = cmdobj->nobj;
	ida = cmdobj->nda;
	obj = cmdobj->exobj;
	da  = cmdobj->da;
	pos         = iParm[6];
	pos_var_end = iParm[7];
	npr         = iParm[8];
	ipr_pos     = iParm[9];
/*
printf("%s: pos=%d pos_var_end=%d npr=%d ipr_pos=%d iob=%d ida=%d\n",
argv[0],pos,pos_var_end,npr,ipr_pos,iob,ida);
*/
	ssp.sp = pos;
	obj[iob++] = pos;
	nvar = 0;
	iCOM = 1;
	iMAPPED = iARRAY = iCONST = 0;
	if (opt & D_GX_OPT_SET_ARRAY) iARRAY = 1;
	if (opt & D_GX_OPT_SET_MAPPED) {
		iARRAY = iMAPPED = 1;
	}
	if (opt & D_GX_OPT_SET_CONST) iCONST = D_AUX1_PROTECTED;
	iARRAY0 = iARRAY;
	disp = 0;
	while ((vnlen=akxtgwnsl(line,pos_var_end,&ssp,gsep,0x41)) > 0) {
		is = ssp.sp - vnlen;
		memnzcpy(wrk,ssp.wd,vnlen,sizeof(wrk)-1);
		varnam = wrk;

printf("%s: disp=%d is=%d ssp.sp=%d vnlen=%d varnam=[%s]\n",argv[0],disp,is,ssp.sp,vnlen,varnam);

DEBUGOUTL5(170,"%s 0: is=%d ssp.sp=%d vnlen=%d varnam=[%s]",argv[0],is,ssp.sp,vnlen,varnam);

		iSKIP = 0;
		c = *varnam;
		if (!disp) {
			p = varnam;
			if (c == ',') {
				ERROROUT1(FORMAT(458),argv[0]);	/* %s: ϐ͏ȗł܂B */
				return ECL_EX_DEFINE;
			}
			else if ((instrchar("+-*/&|",c)>0 && (*(line+ssp.sp) == '=')) ||
			    !stricmp(varnam,"AS") || c=='=') {
				ERROROUT3(FORMAT(540),argv[0],FORMAT(474),varnam);	/* %s: %s܂B(at %s) J} */
				return ECL_EX_DEFINE;
			}
			else if (c=='$' || c=='%' || c=='#') {
				clpeeksl(line,pos_var_end,&ssp,gsep,0x41);
				if (*ssp.wd == '(') {
					len = akxnskipin(varnam,vnlen,"$%#");
					if (len >= vnlen) {
						iSKIP = 1;
						ssp.sp = is;
						if (len=cl_skip_to_delm(line,pos_var_end,"()",&ssp,gsep,0)) {
							ERROROUT1(FORMAT(433),argv[0]);	/* %s: JbRĂ܂B */
							return ECL_SCRIPT_ERROR;
						}
					}
					memnzcpy(wrk,line+is,ssp.sp-is,sizeof(wrk)-1);
					varnam = wrk;
					vnlen = strlen(varnam);
				}
			}
			else if (cl_chk_name(varnam, vnlen)) {
				ERROROUT2(FORMAT(125),argv[0],varnam);	/* %s: [%s]Ă܂B*/
				return ECL_EX_DEFINE;
			}

printf("%s 1: pos=%d vnlen=%d varnam=[%s]\n",argv[0],pos,vnlen,varnam);

DEBUGOUTL3(170,"%s 1: vnlen=%d varnam=[%s]",argv[0],vnlen,varnam);

			cl_im_expand(CLcList.mcat_obj,iob+13,&obj);
			cl_im_expand(CLcList.mcat_da,ida+2,&da);

			/* ϐ̎擾 */
			npr++;
			obj[ipr_pos] = iob;
			obj[iob++] = 3;	/* hcϐ擾̏ */
			ipr_pos = iob++;
			c = *varnam;
			obj[iob++] = ida;
			ida_nam = ida;
			da[ida++] = NULL;	/*clstrdup(varnam,0);*/
			/* z񖼂ɕϐw\Ƃ */
			obj[iob] = ida;	/*-1; 2020.10.28 */
			da[ida] = NULL;
			da[ida_nam] = clstrdup(varnam,0);

printf("%s 2: ida_nam=%d vnlen=%d varnam=[%s] ssp.sp=%d\n",argv[0],ida_nam,vnlen,varnam,ssp.sp);

			nvar++;
			ida++;
			iob++;

			disp = 1;
		}
		else if (disp == 1) {
			npr++;
			obj[ipr_pos] = iob;
			obj[iob++] = 2;	/* hcz`擾̏ */
			ipr_pos = iob++;

			pos = ssp.sp;
			iARRAY = iARRAY0;
			if (!(opt & D_GX_OPT_REDEFINE) && proc && !iARRAY && !type) {
				clpeeksl(line,line_len,&ssp,gsep,0x41);
				if (*ssp.wd == '[') iARRAY = -1;	/* zvfƌȂ */
			}
			obj[iob++] = iARRAY;	/* z` */

			if (c == ',') {
				disp = 0;
			}
			else if (instrchar("+-*/&|",c) > 0) {
				if (*(line+ssp.sp) == '=') disp = 99;
			}
			else if (!stricmp(varnam,"AS") || c=='=') disp = 99;
			else {

			n = 0;
			if (iARRAY >= 0) {
				/* z`̎擾 */
				n = cl_get_array_def_parm(line,pos_var_end,",=",&ssp,gsep,MAX_ARRAY_DIM,qprmp,NULL);
				if (n < 0) return n;
				else if (n) iARRAY = 1;	/* z` */
				else {
					if (iARRAY) {
						if (proc) iARRAY = 2;	/* defineł͂ȂāAarray */
					}
					else iARRAY = -1;	/* arrayz`Ȃ==>ϐ̒`܂͎ */

printf("%s: n=%d iARRAY=%d\n",argv[0],n,iARRAY);

				}
				if (iARRAY==2 && (iCLEAR || iCONST || iParm[0]/* || (opt & D_GX_OPT_SET_SCOPE)*/)) iARRAY = 1;
				/* defineł͂ȂāAarrayAclearconstw肳Ă */
				/* ARRAY=1: zϐ̒` */
				/* ARRAY=2: zϐւ̃f[^ݒ */
				if (iARRAY==1 && (type & 0x10) && type!=D_AUX0_TYPE_STRUCT) {
							/* %s: ϐ[%s]̔z`łȂ(%d)łB */
					ERROROUT3(FORMAT(473),argv[0],varnam,type);
					return ECL_EX_DEFINE;
				}
				obj[iob++] = ida;	/* z` */
				obj[iob++] = n;
				iob_ary = iob;
			/*	if (iARRAY > 0) iARRAY |= iMAPPED;	*/
				obj[iob++] = iARRAY;

				cl_im_expand(CLcList.mcat_da,ida+n,&da);

				for (i=0;i<n;i++) {
					cl_im_parmcpy(D_OPT_ALC_LEAF,&da[ida++],qprmp[i]);
				}
				memcpy(qprmp,&da[ida-n],sizeof(parmList *)*n);
				if (!n) ssp.sp = pos;
			}
			else {
				/* z`ǂݔ΂ */
				rc = cl_get_array_def_parm(line,pos_var_end,",=",&ssp,gsep,0,NULL,NULL);
				if (rc < 0) return n;
			}
/*
printf("%s: n=%d iARRAY=%d\n",argv[0],n,iARRAY);
*/
DEBUGOUTL3(170,"%s: n=%d iARRAY=%d",argv[0],n,iARRAY);

			}
			npr++;
			obj[ipr_pos] = iob;
			obj[iob++] = 4;	/* hcϐ`/Ē` */
			ipr_pos = iob++;

			if (!disp) continue;
			else if (disp==99) break;
			disp = 2;
		}
		else if (disp == 2) {
			if (c == ',') {
				disp = 0;
				continue;
			}
			else if ((instrchar("+-*/&|",c)>0 && (*(line+ssp.sp) == '=')) ||
			    !stricmp(varnam,"AS") || c=='=') break;
			else {
				ERROROUT3(FORMAT(540),argv[0],FORMAT(474),varnam);	/* %s: %s܂B(at %s) J} */
				return ECL_EX_DEFINE;
			}
		}
/*
printf("%s: sp=%d\n",argv[0],ssp.sp);
*/
	}
/*
printf("%s: nvar=%d iARRAY=%d iCOM=%d\n",argv[0],nvar,iARRAY,iCOM);
*/
	if (iCOM) {
		ERROROUT1(FORMAT(458),argv[0]);	/* %s: ϐ͏ȗł܂B */
		return ECL_EX_DEFINE;
	}
	else if (!nvar) {
		ERROROUT2(FORMAT(111),argv[0],FORMAT(329));	/* %s: %sKvłB*/ /* ϐ */
		return ECL_EX_DEFINE;
	}
/*
printf("%s: iob=%d ida=%d obj=%08x da=%08x\n",argv[0],iob,ida,obj,da);
*/
	cmdobj->nobj  = iob;
	cmdobj->nda   = ida;
	cmdobj->exobj = obj;
	cmdobj->da    = da;
	iParm[8] = npr;
	iParm[9] = ipr_pos;
	iParm[10] = nvar;
	iParm[11] = iARRAY;
	iParm[12] = iob_ary;
	return 0;
}
