/* Copyright (C) 1992 by Thomas Glen Smith. All Rights Reserved. */
/* funcinit APL2 V1.0.0 ************************************************
* Called from funcmain to initialize the local variable tree. *
***********************************************************************/
#define INCLUDES APLMEM+APLCB+APLTOKEN+APLFUNCI+TREE
#include "includes.h"
void funcinit(fp,left,rite)
Aplfunc fp; /* Function definition structure. */
Aplcb left,rite; /* Operands, or may be NULL. */
{
#include "quadext.h"
Aplcopy; Avladd; Getcb; Perm;
extern int aplerr; extern Treelist treehdr;
Apltoken tok; Avlnode pav,*phd; Aplcb out; char *nameptr;
tok = fp->funcvars; /* list of local variables */
if (fp->functype & RETVAL) { /* Now localize return value name */
phd = &(treehdr->avlhdr);
pav = avladd(phd,tok->token_ptr.token_string,NULL);
tok = tok->token_queue.token_next_ptr; /* next local name */
}
if (fp->functype & DYAD) { /* Now localize left operand */
if (left != NULL)
if (left->aplflags & APLTEMP)
left->aplflags -= APLTEMP;
else left = perm(aplcopy(left));
phd = &(treehdr->avlhdr);
pav = avladd(phd,tok->token_ptr.token_string,left);
tok = tok->token_queue.token_next_ptr; /* next local name */
}
if (fp->functype & (DYAD + MONAD)) {
if (rite != NULL)
if (rite->aplflags & APLTEMP)
rite->aplflags -= APLTEMP;
else rite = perm(aplcopy(rite)); /* localize */
phd = &(treehdr->avlhdr);
pav = avladd(phd,tok->token_ptr.token_string,rite);
tok = tok->token_queue.token_next_ptr; /* next local name */
}
while (tok != NULL) { /* localize other variables */
switch (tok->token_code) {
case QUAD_CT: nameptr=quadct; treehdr->fuzzsave=1; break;
case QUAD_IO: nameptr=quadio; treehdr->indxsave=1; break;
default: nameptr=tok->token_ptr.token_string;
}
phd = &(treehdr->avlhdr);
pav = avladd(phd, nameptr, NULL);
tok = tok->token_queue.token_next_ptr; /* next local name */
}
/* Now localize labels */
for (tok=fp->funclabs;tok!=NULL;tok=tok->token_queue.token_next_ptr) {
out = getcb(NULL,1,APLINT+APLLABEL,0,NULL);
if (aplerr) break;
*(out->aplptr.aplint) = tok->token_offset;
phd = &(treehdr->avlhdr);
pav = avladd(phd,tok->token_ptr.token_string,out);
}
}