/* 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); }