/*Copyright (C) 1992, 1995 by Thomas Glen Smith. All Rights Reserved.*/
/* execqnls APL2 V1.0.0 ************************************************
* Called from execqnl. System function quad_nl, name list subroutine. *
***********************************************************************/
#define INCLUDES APLCB+APLMEM+STRING+TREE
#include "includes.h"
#include "execqnli.h"
void execqnls(node,p)
Avlnode node; /* points to node of binary tree */
Nlparm p; /* structure for passing during recursion */
{
#include "quadext.h"
Execqnlt; Imax; Lifo; Quadname;
Aplcb wrk;
Nlq op;
int i,j;
char *qn,*rn;
if (node == NULL) return;
execqnls(node->rite_child,p); /* do right branch, if any */
for (;;) { /* Allows use of break. */
wrk = node->avlleaf; /* do this leaf, if any */
if (wrk == NULL)
break; /* no leaf */
if (0 == strcmp(node->avlname,quadfc)) break; /* Skip Lfc. */
qn = quadname(node->avlname); /* Transform Q-names. */
if (!execqnlt(qn,p->delim))
break; /* bad name */
if (!( p->lab != 0 && wrk->aplflags & APLLABEL
|| p->fun != 0 && wrk->aplflags & APLFUNC
|| p->var != 0 &&
!(wrk->aplflags & (APLLABEL | APLFUNC))))
break; /* no match of type */
j = strlen(qn); /* Length of new name. */
p->outrows += 1; /* add name count */
p->outcols = imax(p->outcols,j);
i = sizeof(struct nlq) + ((qn == node->avlname) ? 0 : (j+1));
op = lifo(&(p->nlphdr),malloc(i));
if (op == NULL)
return; /* out of memory */
if (qn == node->avlname)
op->nlstr = node->avlname; /* point to name */
else { /* must copy Q-name buffer. */
op->nlstr = rn = sizeof(Nlq) + (char*)op;
strcpy(rn,qn); /* Copy transformed Q-name. */
}
break;
}
execqnls(node->left_child,p); /* do left branch, if any */
}