Metropoli BBS
VIEWER: eachtran.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* eachtran - APL2 V1.0.0 **********************************************
* x48.eptok is set by funinit (see funassgo.h) to point to eachtran.   *
* Called from execexee via "noexit = fun->eptok(tok)".                 *
* Transforms an EACH token to a derived function.                      *
***********************************************************************/
#define INCLUDES APLCHDEF+APLTOKEN+FUNSTRUC+APLDERIV+APLCB+FUNCODES
#include "includes.h"
int eachtran(tok)
Apltoken tok; /* token for dieresis */
{
     Chrcopy; Each; Execaxit; Execfree; Execnext; Getcode; Newderiv;
     Slasherr;
     extern int aplerr;
     Apltoken axistok=NULL,funtok=NULL,op=NULL;
     Aplderiv dp;
     int code,i,noexit;
     void *funhold; /* hold area for funstruc ptr set by getcode */
     Aplcb axcb;

     for (;;) { /* lets me use break */
          noexit = execnext(&funtok,&axistok,&op,NULL);
          if (aplerr) break;
          if (funtok == NULL || op)
               { aplerr = 63; /* missing operator */ break; }
          code = getcode(&funhold, funtok);
          if (aplerr) break;
          if (axistok)
               axcb = execaxit(axistok);
          else axcb = NULL;
          dp = newderiv(axcb,NULL,NULL);
          if (aplerr) break;
          execfree(funtok);
          dp->deriv_func = each;
          dp->deriv_left.funcode = code;
          dp->deriv_left.fun = funhold;
          tok->token_code = DERIVED_FUNCTION;
          tok->token_ptr.token_function = dp;
          return(noexit);
     }
     slasherr(funtok,op,axistok,dp);
     return(noexit);
}
[ RETURN TO DIRECTORY ]