Metropoli BBS
VIEWER: execnexu.c MODE: TEXT (ASCII)
/* Copyright (C) 1996 by Thomas Glen Smith.	All Rights Reserved. */
/* execnexu APL2 V1.0.0 ************************************************
* called by execnexs.                                                  *
***********************************************************************/
#define INCLUDES APLCB+APLCHDEF+APLTOKEN+STDIO+TREE
#include "includes.h"
int execnexu(pfun,parg,pwrk,varcnt,pnoexit,varsw)
Apltoken *pfun; /* w/b = next function token, or null. */
Apltoken *parg; /* w/b = next argument token, or null. */
Apltoken *pwrk; /* work stack. */
int *varcnt;	 /* w/b > 0 if simple variable name list. */
int *pnoexit;	 /* Initialized. */
int varsw;	 /* Initialized. */
{
	Axistest; Execexee; Execindx; Execpop; Lifo; Pop; Popnest;
	extern Treelist treehdr;
	extern int aplerr;
	Apltoken op,tck,tok;

	if (*pnoexit && *pwrk != NULL)
		for (;;) {
			if ( varcnt == NULL &&
				(NULL != (tck = treehdr->avltokhd)) &&
				tck->token_code == LEFT_PAREN) break;
			if (0 == (*pnoexit = execexee(pfun,&op))) break;
			if (op == NULL) break;
			while (axistest(treehdr->avlexec->avloprst)) {
				varsw = 0; /* not common variable name list */
				op = execindx(op); /* handle indexing */
			}
			if (varcnt != NULL && varsw) {
				if (op->token_code != OPERAND_TOKEN) varsw = 0;
				else (*varcnt)++; /* count of names in list */
			}
			op = lifo(pwrk,op); /* push on holding stack */
		}
	if (*pfun != NULL) {
		varsw = 0; /* it is not name list */
		*pnoexit = 1;
		tok = lifo(&(treehdr->avltokhd),*pfun); /* return to input */
		*pfun = NULL;
		if (axistest(treehdr->avlexec->avloprst))
			tok = lifo(&(treehdr->avltokhd),
				pop(&(treehdr->avlexec->avloprst)));
	}
	if (aplerr) { execpop(pwrk); return(0); /* all done */ }
	if (varsw)
		*parg = *pwrk; /* return stack of variable names */
	else {
		if (*pwrk != NULL) { /* did execexee find any operands? */
			*parg = popnest(pwrk); /* handle vector notation */
			if (aplerr)
				execpop(pwrk);
		}
		if (varcnt != NULL) *varcnt = 0;
	}
	return(varsw);
}
[ RETURN TO DIRECTORY ]