/*Copyright (C) 1992, 1995 by Thomas Glen Smith. All Rights Reserved.*/
/* execqfxd APL2 V1.0.0 ************************************************
* Called from execqfxl to scan the function header, determining type, *
* e.g. niladic, monadic, etc. Returns a function name token pointer. *
***********************************************************************/
#define INCLUDES APLCB+APLCHDEF+APLFUNCI+APLTOKEN
#include "includes.h"
Apltoken execqfxd(fp)
struct aplfunc *fp; /* function definition structure */
{
Execqfxe; Execqfxg; Execqfxh; Fifo;
extern int aplerr;
Apltoken curtok,curvar=NULL,lastok,nametok=NULL,tokhdr;
int tokcnt;
tokcnt = *(fp->functokc); /* count of tokens in header */
tokhdr = *(fp->functokp); /* head of token list */
curtok = execqfxe(tokhdr + --tokcnt,OPERAND_TOKEN,93);
if (aplerr) return(NULL); /* didn't get token type expected */
if (tokcnt > 1 && (curtok - 1)->token_code == LEFT_ARROW) {
tokcnt--; /* less 1 for LEFT_ARROW */
fp->functype = RETVAL; /* function has a result */
curvar = fifo(&(fp->funcvars),curvar,curtok); /* result var */
curtok = execqfxe(tokhdr + --tokcnt,OPERAND_TOKEN,93);
}
if (aplerr) return(NULL); /* didn't get token type expected */
if (tokcnt < 2) /* no localized names to process */
return(execqfxg(fp,curtok,tokcnt,curvar));
nametok = curtok; /* save either left opnd or function name */
if ((curtok - 1)->token_code == SEMICOLON)
fp->functype += NILAD; /* form = ... F ; ... */
else { /* it cannot be niladic in form */
curtok = execqfxe(tokhdr + --tokcnt,OPERAND_TOKEN,93);
if (NULL == curtok) return(NULL); /* bad syntax */
if ((curtok - 1)->token_code == SEMICOLON)
fp->functype += MONAD; /* form = ... F b ; ?... */
else { /* must be dyadic */
fp->functype += DYAD; /* form = ... a F b ?... */
curvar = fifo(&(fp->funcvars),curvar,nametok); /* left */
nametok = curtok; /* save function name */
curtok = execqfxe(tokhdr + --tokcnt,OPERAND_TOKEN,93);
if (NULL == curtok) return(NULL); /* bad syntax */
}
curvar = fifo(&(fp->funcvars),curvar,curtok); /* right */
}
execqfxh(fp,tokhdr,curtok,tokcnt,curvar); /* do locals */
if (aplerr) return(NULL);
return(nametok);
}