Metropoli BBS
VIEWER: apledit.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1995 by Thomas Glen Smith.  All Rights Reserved.*/
/* apledit APL2 V1.0.0 *************************************************
* Called from funcsusq.                                                *
* The APL function editor.  Process commands beginning with a DEL.     *
***********************************************************************/
#define MAXLINE 1024
#define INCLUDES APLCB+APLCHDEF+APLED+APLFUNCI+APLTOKEN
#include "includes.h"
Aplcb apledit(rite,cp,cpend)
Aplcb rite;	/* Aplcb for command text.				*/
char *cp;			/* Pointer to char immediately after DEL.	*/
char *cpend;		/* Pointer to end of command text.			*/
{	Apledfr;Apledfx;Aplediu;Aplediv;Endoper;Execfree;Execmsg;Execpars;
	Execpop;Execqfxa;Execqfxj;Execqfxk;Execqfxl;Expunge;Pop;
	struct apledst e;
	extern int aplerr;
	void *v;
	Apltoken nametok,tokhdr;
	int stmtlen;

	e.edhdr = e.edlst = e.cured = NULL;
	e.fp = NULL;
	e.delptr = NULL;
	e.aplstinc = 1.0; /* statement increment */
	stmtlen = cpend - cp;
	tokhdr = execpars(cp,stmtlen); /* tokenize initial input */
	if (aplerr == 0) {
		while (tokhdr != NULL) { /* while allows break to be used */
			if (tokhdr->token_code == DEL)
				e.delptr = pop(&tokhdr); /* pop DEL token */
			e.fp = execqfxa(NULL); /* go initialize function struct */
			if (aplerr) break; /* probably a memory problem */		
			e.fp->funcstmt = 1; /* lie: function is 1 statement */
			execqfxj(e.fp); /* initialize arrays dep. on stmtcnt */
			if (aplerr) break; /* probably a memory problem */
			*(e.fp->functokp) = tokhdr; /* potential function hdr */
			tokhdr = NULL;
			execqfxk(e.fp); /* count tokens,transform to contig. blk */
			nametok = execqfxl(e.fp); /* function name */
			if (aplerr == 27) break; /* memory problem */
			if (aplerr || e.fp->functype & NILAD && 1 == e.fp->functotl)
				aplediu(&e,cp,stmtlen); /* not header, probably */
			else aplediv(&e);
			if (aplerr == 0)
				apledfx(&e); /* go fix function */
		}
		if (aplerr)
			execmsg(cp,stmtlen,0,NULL); /* print error message */
	}
	apledfr(&e); /* free apled list */
	v = expunge(e.fp); /* free temporary function definition */
	execpop(&tokhdr); /* pop/free any tokens on stack */
	execfree(e.delptr); /* free terminating DEL token */
	endoper(rite); /* free rite */
	return(NULL);
}
[ RETURN TO DIRECTORY ]