Metropoli BBS
VIEWER: apleddl.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1995 by Thomas Glen Smith.  All Rights Reserved.*/
/* apleddl APL2 V1.0.0 *************************************************
* Called from aplediy to delete a statement.  Items must be:           *
* LEFT_BRACKET DELTA NUM RIGHT_BRACKET                                 *
***********************************************************************/
#define INCLUDES APLCB+APLCHDEF+APLED+APLFUNCI+APLMEM+APLTOKEN+STRING+TREE
#include "includes.h"
void apleddl(e,cp,stmtlen,tokcnt)
Apledst e;		/* Edit common area.					*/
char *cp;				/* Pointer to current input.				*/
int stmtlen;			/* Length of current input.				*/
int tokcnt;			/* Tokens remaining to process.			*/
{
	Apledno; Codechar; Dequeue; Execmsg; Expungf; Value; Vector;
	extern int aplerr;
	Apltoken tok,tokhdr;
	Apled ed;
	double delno;
	int delta_len,in_len,ok,tempsave;
	char *delta_ptr,*in,*in_end;

	tokhdr = *(e->fp->functokp); /* token list from temp. hdr. */
	delta_len = strlen(delta_ptr = codechar(DELTA));
	in_len = strlen(in = (tokhdr + tokcnt - 2)->token_ptr.token_string);
	for (;;) { /* Allows use of break. */
		ok = (0 == memcmp(in,delta_ptr,delta_len));
		if (!ok) break;
		if (in_len > delta_len) { /* e.g. [H23] or [H23.1] */
			in += delta_len; /* Bump past delta. */
			in_end = in + in_len - delta_len; /* End string. */
			delno = value(vector(&in,in_end,0)); /* Get e.g. 23 */
			ok = (aplerr == 0 && delno >= 0.0);
			if (!ok) break;
		}
		else delno = 0.0;
		if (tokcnt == 3) break; /* Break if e.g. [H23]. */
		ok = (tokcnt == 4);
		if (!ok) break; /* Too many tokens. */
		delno += apledno(tokhdr + tokcnt - 3, cp, stmtlen);
		break; /* end for(;;) */
	}
	if (!ok) {
		execmsg(cp,stmtlen,0,"Bad syntax for DEL delete.");
		return;
	}
	for (ed = e->edhdr; ed != NULL && delno != ed->apledst;
		ed = ed->aplednxt);
	if (ed == NULL) {
		execmsg(cp,stmtlen,0,"Statement to delete not found.");
		return;
	}
	e->aplstinc = (NULL == (e->cured = ed->aplednxt)) ? 1.0 : 0.0;
	dequeue(e,ed); /* remove from list */
	if (ed->apledtm)
		expungf(ed->apledhd, ed->apledcn); /* free old tokens */
	free(ed->apledch); /* free statement text */
	free(ed); /* free apled structure */
}
[ RETURN TO DIRECTORY ]