Metropoli BBS
VIEWER: execexee.c MODE: TEXT (ASCII)
/* Copyright (C) 1996 by Thomas Glen Smith.	All Rights Reserved. */
/* execexee APL2 V1.0.0 ************************************************
* Called by execnext to see if operand c/b derived from current token. *
* If so, *ptop set to op. tok. ptr, *pfun set to NULL.	Else pfun points*
* to func/operator.  Returns 0 if niladic w/o return is executed, or if*
* any other condition that should cause execexed to quit processing.   *
***********************************************************************/
#define INCLUDES STDIO+APLCHDEF+APLTOKEN+APLCB+TREE+FUNCODES+FUNSTRUC
#include "includes.h"
int execexee(pfun,ptop)
Apltoken pfun[]; /* current input token */
Apltoken ptop[]; /* argument pointer */
{
	Execexef; Execexeg; Execexei; Execfree; Execoptk; Lifo; Pop;
	extern Treelist treehdr;
	extern int aplerr;
	Apltoken op,tok,wrk;
	Codes *cp;
	Oper *fun;
	int noexit=1,ret=1;

	*ptop = *pfun = NULL; /* initialize */
	if ( aplerr || (NULL == (wrk = treehdr->avltokhd))
		|| (wrk->token_code == LEFT_BRACKET)
		|| (wrk->token_code == SEMICOLON) ) return(0);
	*pfun = tok = execexeg(); /* Get input, handle brackets, identify */
	if (aplerr) return(0);	 /* functions, operators. */
	tok->token_work = NULL; /* initialize work pointers */
	if (tok->token_code == FUNCTION_TOKEN) {
		cp = (Codes *) fun = tok->token_ptr.token_function;
		if ((cp->funky_flags & OPER) && (cp->funky_code != APL_NULL))
			noexit = fun->eptok(tok); /* operator transform */
		ret = noexit & (aplerr == 0);
	}
	else if (tok->token_code == LEFT_PAREN) {
		execfree(tok);
		*pfun = tok = NULL;
		ret = 0;
	}
	else {
		op = execexef(tok); /* try quad input */
		if (op != NULL) *pfun = tok = op; /* substitute terminal input */
		if (tok->token_code == OPERAND_TOKEN)
			ret = execexei(pfun,ptop,tok); /* defined function check */
		else {
			*ptop = execoptk(pfun); /* test for operand */
			ret = (aplerr == 0); /* ok to continue processing */
		}
	}
	if (aplerr == 0 && NULL != (wrk = treehdr->avltokhd)
		&& wrk->token_code == DOT) {
		if (tok == NULL) /* tok s/b an operator or function. */
			aplerr = 63; /* Missing operator or function. */
		else {
			tok = lifo(&(treehdr->avlexec->avlfunst),tok); /* stack */
			*pfun = tok = execexeg(); /* Get input (DOT) */
			cp = (Codes *) fun = tok->token_ptr.token_function;
			noexit = fun->eptok(tok); /* operator transform */
		}
		ret = noexit & (aplerr == 0);
	}
	return(ret);
}
[ RETURN TO DIRECTORY ]