Metropoli BBS
VIEWER: funcsusp.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1996 by Thomas Glen Smith.  All Rights Reserved.*/
/* funcsusp APL2 V1.0.0 ************************************************
* Called by APL mainline, funcexec, and funcexee, funcsusp gets	       *
* terminal input, and executes APL statements until a branch resumes   *
* execution of a suspended function, or )off is entered.	       *
***********************************************************************/
#define INCLUDES APLCB+APLDEBUG+APLDOS+APLFUNCI+APLTOKEN+STDIO+TREE
#include "includes.h"
int funcsusp()
{
#include "aplwkcd.h"
	Apledit; Aplmsg; Aplnewl; Aplputch; Aplscan; Aplwksp;
	Execterm; Getchrv;
#if APL_DOS
	extern size_t aplstack; /* used to check stack */
#endif
	extern Treelist treehdr;
	extern int aplerr, aplwkcd, errno;
	extern Aplcb aplwkcb;
	Aplcb out;
	int i,loop=1,stmtno=0;
#if APL_DEBUG
	void mem_check(void);
#endif

	if (treehdr->avlfun != NULL) {
		treehdr->treeflag |= SUSPNDED;
		printf("%s[%d]", treehdr->avlfname, treehdr->avlstmt);
		aplnewl(); /* Start a new output line. */
	}
	while (loop && aplerr != 998 &&
		!(aplerr == 997 && !(treehdr->treeflag & SUSPNDED))) {
#if APL_DEBUGQ
		mem_check();
#endif
		aplerr = errno = 0; /* reset any prior error */
		out = getchrv("apl>"); /* get APL statement */
		if (aplerr) {
			fprintf(stderr,"%s\n",aplmsg(aplerr));
			exit(aplerr);
		}
		if (out->aplcount == 0) {
			aplerr = 998; /* indicate eoj */
			aplwkcb = out; /* save for later */
			aplwkcd = OFF; /* defer )OFF processing */
			loop = 0; /* An empty line signals end of file */
		}
		else
			loop = funcsusq(out,&stmtno); /* process this statement */
#if APL_DOS
		if (aplstack > _chkstack()) {
			aplerr = 121; /* Remaining stack too small. */
			break; /* get out */
		}
#endif
	}
	if (treehdr->treeflag & SUSPNDED) treehdr->treeflag -= SUSPNDED;
	return(stmtno);
}
[ RETURN TO DIRECTORY ]