4.3BSD/usr/contrib/icon/operators/sect.c

Compare this file to the similar file:
Show the results in this format:

#include "../h/rt.h"

/*
 * x[i:j] - form a substring or list section of x.
 */

sect(nargs, arg1v, arg3, arg2, arg1, arg0)
int nargs;
struct descrip arg1v, arg3, arg2, arg1, arg0;
   {
   register int i, j;
   int t, typ1;
   char sbuf[MAXSTRING];
   long l1, l2;
   extern char *alcstr();

   SetBound;
   hneed(sizeof(struct b_tvsubs));              /* check heap */

   if (cvint(&arg2, &l1) == NULL)
      runerr(101, &arg2);
   if (cvint(&arg3, &l2) == NULL)
      runerr(101, &arg3);

   arg1v = arg1;
   DeRef(arg1)

   if (!QUAL(arg1) && TYPE(arg1) == T_LIST) {
      i = cvpos(l1, BLKLOC(arg1)->list.cursize);
      j = cvpos(l2, BLKLOC(arg1)->list.cursize);
      if (i > j) {
         t = i;
         i = j;
         j = t;
         }
      cplist(&arg1, &arg0, i, j);
      ClearBound;
      return;
      }

   if ((typ1 = cvstr(&arg1, sbuf)) == NULL)
      runerr(110, &arg1);

   i = cvpos(l1, STRLEN(arg1));
   j = cvpos(l2, STRLEN(arg1));
   if (i > j) {				/* convert section to substring */
      t = i;
      i = j;
      j = t - j;
      }
   else
      j = j - i;

   if (typ1 == 1) {			/* if string was created, */
      sneed(j);				/*   just return a string */
      STRLEN(arg0) = j;
      STRLOC(arg0) = alcstr(STRLOC(arg1)+i-1, j);
      }
   else					/* else make a substring tv */
      mksubs(&arg1v, &arg1, i, j, &arg0);
   ClearBound;
   }

Opblockx(sect,4,":",3)