Metropoli BBS
VIEWER: dottran.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.	All Rights Reserved. */
/* dottran - APL2 V1.0.0 ***********************************************
* x49.eptok is set by funinit (see funassgo.h) to point to dottran.	 *
* Called from execexee via "noexit = fun->eptok(tok)".				 *
* Transforms a dot token into a derived function.					 *
***********************************************************************/
#define INCLUDES APLCHDEF+APLTOKEN+FUNSTRUC+APLDERIV+APLCB
#include "includes.h"
int dottran(tok)
Apltoken tok; /* token for dieresis */
{
	Execdot; Execfree; Execfun; Execjot; Execjot2; Execnext;
	Newderiv; Pickdyad; Slasherr;
	extern int aplerr;
	Apltoken axistok,funtok,op;
	Aplderiv dp;
	int code, noexit=1;
	void *lfun,*rfun;

	code = execfun(&rfun); /* pop rite operator/function */
	if (aplerr) return(noexit);
	dp = newderiv(NULL,NULL,NULL);
	if (aplerr) return(noexit);
	dp->deriv_rite.sdp = pickdyad(rfun); /* pick dyadic scalar */
	dp->deriv_rite.fun = rfun;
	dp->deriv_rite.funcode = code;
	noexit = execnext(&funtok,&axistok,&op,NULL); /* get left func */
	if (funtok == NULL || op || axistok)
		aplerr = 63; /* missing operator */
	if (aplerr) {
		slasherr(funtok,op,axistok,dp);
		return(noexit);
	}
	dp->deriv_left.fun = lfun = funtok->token_ptr.token_function;
	dp->deriv_left.funcode = funtok->token_code;
	execfree(funtok); /* funtok, op, axistok have now all been freed */
	if (((Codes *)lfun)->funky_code == APL_NULL)
		if (dp->deriv_rite.sdp == NULL) {
			dp->deriv_func = execjot2;
			if (DERIVED_FUNCTION == dp->deriv_rite.funcode) {
				dp->deriv_rite.type = DRV;
				dp->deriv_rite.func.drv =
		          	((Aplderiv)(dp->deriv_rite.fun))->deriv_func;
		     }
			else dp->deriv_rite.type = execdyas(dp->deriv_rite.fun,
				&(dp->deriv_rite.sdp),&(dp->deriv_rite.func));
		}
		else dp->deriv_func = execjot;
	else {
		dp->deriv_func = execdot;
		dp->deriv_left.sdp = pickdyad(lfun); /* pick dyadic scalar */
	}
	tok->token_code = DERIVED_FUNCTION;
	tok->token_ptr.token_function = dp;
	return(noexit);
}
[ RETURN TO DIRECTORY ]