Metropoli BBS
VIEWER: pick.c MODE: TEXT (ASCII)
/* Copyright (C) 1993 by Thomas Glen Smith.  All Rights Reserved. */
/* pick APL2 V1.0.0 ****************************************************
* Selects item of rite specified by indices in left.                   *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
Aplcb pick(left,rite,new)
Aplcb left,     /* Indices directing the pick operation.            */
      rite,     /* Variable to pick from, or selective assign to.   */
      new;      /* Replacement variable if selective specification. */
{
     Aplcopy; Endoper; Errinit; Errstop; Getcb; Imin; Integer;
     Temp;
     Aplcb pickit(Aplcb, Aplcb, Aplcb**, Aplcb, int);
     extern int aplerr;
     Aplcb lw, out=NULL, *riteptr=NULL, rw;
     int i, ltype;
     void *vp;

     for(;;) {
          if (errinit()) break;
          if (left->aplcount == 0)
               return(errstop(0,left,rite,temp(aplcopy(rite))));
          if (left->aplrank > 1) { aplerr = 124; break; }
          rw = rite;
          ltype = left->aplflags & (APLMASK + APLAPL);
          if (ltype == APLAPL) {
               for (i = 0; aplerr == 0; i++) {
                    lw = *(left->aplptr.aplapl + i);
                    if ((left->aplcount - i) == 1) break;
                    rw = pickit(lw,rw,&riteptr,new,0);
               }
               if (aplerr) break;
               out = pickit(lw,rw,&riteptr,new,1);
          }
          else {
               if (ltype != APLINT) left = integer(left);
               if (aplerr) break;
               lw = getcb(NULL, 1, APLINT + APLTEMP, 0, NULL);
               if (aplerr) break;
               for (i = 0; aplerr == 0; i++) {
                    *(lw->aplptr.aplint) = *(left->aplptr.aplint + i);
                    if ((left->aplcount - i) == 1) break;
                    rw = pickit(lw,rw,&riteptr,new,0);
               }
               if (aplerr) break;
               out = pickit(lw,rw,&riteptr,new,1);
               endoper(lw);
          }
          break;
     }
     return(errstop(0,left,rite,out));
}
[ RETURN TO DIRECTORY ]