/*Copyright (C) 1992, 1996 by Thomas Glen Smith. All Rights Reserved.*/ /* execqncs APL2 V1.0.0 ************************************************ * Called by aplerase, execqex and execqnc, this is mainline for expunge* * and name class. Callers pass entry to do unique to their function. * ***********************************************************************/ #define INCLUDES APLCB+APLMEM+APLTOKEN+TREE #include "includes.h" Aplcb execqncs(oper,rite) int (*oper)(); /* Subroutine to do processing unique to function. */ Aplcb rite; { Aplquae; Chrcopy; Errinit; Errstop; Getcb; Intcopy; Namelen; Treenode; #include "quadext.h" char *cp,*s,*t,*wrk; int code,datacnt,i,*ip,j,k,nameok,rank; Avlnode p; Aplcb out; if (errinit()) return(errstop(0,NULL,rite,NULL)); if ((APLCHAR != rite->aplflags & APLMASK || rite->aplrank > 2)) return(errstop(110,NULL,rite,NULL)); /* bad input */ if (rite->aplcount) { if (rite->aplrank == 2) { /* matrix? */ datacnt = *(rite->apldim); /* output data count */ rank = 1; /* vector output */ j = *(rite->apldim + 1); /* max namelen */ } else { /* input must be vector or scalar */ datacnt = 1; /* single name is input */ rank = 0; /* scalar output */ j = rite->aplcount; /* max namelen */ } out = getcb(NULL,datacnt,APLTEMP+APLINT,rank,NULL); } else out = getcb(NULL,0,APLTEMP+APLINT,0,NULL); /* empty output */ if (out->aplcount) { wrk = malloc(j+1); /* name buffer */ if (wrk == NULL) return(errstop(0,NULL,rite,out)); /*outofmemory*/ for (i = 0; i < out->aplcount; i++) { if (0 == (k = namelen(rite->aplptr.aplchar,j,i,&s))) { nameok = 0; /* invalid name */ p = NULL; } else { nameok = 1; /* name is well formed */ cp = chrcopy(wrk,s,k,1); /* copy name */ *cp = '\0'; /* delimit */ t = wrk; /* Point to start of name. */ switch(aplquae(&t,cp)) { case QUAD_AV: t = quadav; break; case QUAD_CT: t = quadct; break; case QUAD_IO: t = quadio; break; case QUAD_LX: t = quadlx; break; default: t = wrk; } p = treenode(t); } *(out->aplptr.aplint+i) = (*oper)(nameok,p); /*result*/ } free(wrk); } return(errstop(0,NULL,rite,out)); }