Metropoli BBS
VIEWER: funcexef.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1994 by Thomas Glen Smith.  All Rights Reserved.*/
/* funcexef APL2 V1.0.0 ************************************************
* Called by funcexee after stop control has been handled to execute    *
* the next function statement.                                         *
***********************************************************************/
#define INCLUDES APLCB+APLCHDEF+APLFUNCI+APLTOKEN+TREE
#include "includes.h"
int funcexef(trace,stmtno,fp,out,gotok)
Aplcb trace;			/* Trace control vector.					*/
int stmtno;			/* Next statement to be executed.			*/
Aplfunc fp;			/* Function definition.					*/
Aplcb out;			/* Output from current statement.			*/
Apltoken gotok;		/* Not NULL if this is a branch statement.	*/
{
	Funcgoto; Funcmsg; Funcsusp; Functrac; Functrgo; Quadout;
	extern Treelist treehdr;
	extern int aplerr;
	int brstmt;

	if (aplerr == 0 && gotok != NULL) {
		brstmt = stmtno;
		stmtno = funcgoto(fp,out,stmtno); /* branch */
		out = NULL; /* funcgoto will have freed */
		if (trace != NULL)
			functrgo(fp,trace,stmtno,brstmt); /* trace goto */
	}
	if (aplerr)
		switch (aplerr) {
			case 997: /* clear state indicator stack */
				if (treehdr->treeflag & SUSPNDED) {
					aplerr = 0; /* at prior suspended function */
					stmtno = funcsusp(); /* interact with terminal */
				}
				else
					stmtno = fp->funcstmt; /* get out */
				break;
			case 998: /* EOF - get out */
				stmtno = fp->funcstmt;
				break;
			default: /* all other errors */
				funcmsg(fp,treehdr->avloff,stmtno); /* Print msg */
				stmtno = funcsusp(); /* interact with terminal */
				break;
		} /* end switch */
	else if (gotok == NULL) {
		if (out != NULL && treehdr->lastfun != LEFT_ARROW)
			out = quadout(out); /* print result */
		if (trace != NULL)
			functrac(fp,trace,stmtno,out); /* trace, maybe */
	}
	endoper(out);
	return(stmtno);
}
[ RETURN TO DIRECTORY ]