Metropoli BBS
VIEWER: execspet.c MODE: TEXT (ASCII)
/* Copyright (C) 1995 by Thomas Glen Smith.	All Rights Reserved. */
/* execspet APL2 V1.0.0 ************************************************
* Called by execsper.                                                	 *
***********************************************************************/
#define INCLUDES APLCHDEF+APLDERIV+APLTOKEN+APLCB+TREE
#include "includes.h"
int execspet(hit,op,nametok,tok,axistok,cb,cbn)
int hit;
Apltoken op,nametok,tok,axistok;
Aplcb cb,cbn;
{	Execfree;Execspef;Execspeg;Execspek;Execspel;Execspez;Execterm;Lifo;
	extern Treelist treehdr;
	extern int aplerr;
	Apltoken wrk;
	int	exec_sw=1,iw,nwa=0;
	Aplcb out=NULL;

	for (;;) { /* lets me use break */
		if (NULL != (wrk = treehdr->avltokhd) &&
			wrk->token_code != LEFT_PAREN)
			hit = execspel(&tok,&axistok);
				/* Execspel does some tests to see if it is selective */
				/* specification, and returns these values: */
				/*  0 == Not selective specification. */
				/* -1 == ? */
				/* funky_code: It is selective specification. */
		if (hit == -1) break;
		switch(hit) {
			case 0:	/* Execspeg completes the assignment, which is */
					/* not selective specification. */
				out = execspeg(tok, axistok, op, &iw);
				break;
			case SLOPE:
			case SLOPE_BAR: /* e.g. (1 0 1 0 1)\m)#I5 gives 1 3 5. */
				hit = execspek(hit,tok,axistok,op);
				break;
			default: /* It is selective specification. */
				out = execspez(tok,axistok,op,cb,cbn,&nwa);
				tok = axistok = NULL; /* Don't free twice. */
				if (aplerr) break;
				exec_sw = 0; /* Indicate execterm invoked. */
				execterm();
				op = execspef(op,cb,cbn,out,nwa); /* Finish sel. asgn. */
				out = NULL; /* freed by execspef */
				if (op != NULL) {
					hit = 1; /* Indicate specification handled. */
					op = lifo(&(treehdr->avlexec->avloprst),op);
					op = NULL; /* don't free twice */
				}
				break;
		} /* end switch */
		tok = axistok = op = NULL; /* don't free twice */
		break;
	}
	if (exec_sw) execterm(); /* Call if appropriate. */
	execfree(tok); execfree(axistok); execfree(op);
	return(hit); /* indicate selective specification handled */
}

[ RETURN TO DIRECTORY ]