Metropoli BBS
VIEWER: slashtra.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* slashtra APL2 V1.0.0 ************************************************
* Called from execexee when the current token is either a slash,       *
* slash bar, slope, or slope bar to transform the token into a         *
* DERIVED_FUNCTION token.                                              *
***********************************************************************/
#define INCLUDES APLTOKEN+APLTOKCD+FUNSTRUC+APLDERIV+APLCB+TREE+FUNCODES
#include "includes.h"
int slashtra(tok)
Apltoken tok; /* token for slash, slash bar, slope, slope bar */
{
     Axistest;Execaxis;Execfree;Execgetp;Execnext;Newderiv;Slasherr;
     extern int aplerr,indxorg;
     extern Treelist treehdr;
     int noexit;
     Aplderiv dp=NULL;
     Apltoken axistok,funtok,op;
     Aplcb axcb=NULL, lcb=NULL;

     if (axistest(treehdr->avlexec->avloprst))
          axcb = execaxis(&(treehdr->avlexec->avloprst));
     treehdr->lastfun = 0; /* for execnext processing */
     noexit = execnext(&funtok,&axistok,&op,NULL);
     for (;;) { /* So I can use break. */
          if (op) { /* compress/expand */
               lcb = execgetp(op); /* save left opnd */
			op = NULL;
			if (lcb == NULL) break; /* m/b error. */
		}
          dp = newderiv(axcb, lcb, NULL);
          if (aplerr) break;
          dp->deriv_op = /* identifies slash or slope, and default axis */
               tok->token_ptr.token_function;
          if (lcb != NULL) /* compress/expand */
               slashtrb(tok,funtok,axistok,dp); /* compress/expand */
          else { /* reduce/scan */
               if (axistok) {
                    aplerr = 89; /* axis out of place */
                    break;
               }
               slashtrc(tok,funtok,dp);
          }
          return(noexit);
     }
     slasherr(funtok,axistok,op,dp);
     return(noexit);
}
[ RETURN TO DIRECTORY ]