4.3BSD/usr/contrib/icon/functions/move.c

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

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

/*
 * move(i) - move &pos by i, return substring of &subject spanned.
 *  Reverses effects if resumed.
 */
Xmove(nargs, oldsubj, arg1, arg0)
int nargs;
struct descrip oldsubj, arg1, arg0;
   {
   register int i, j;
   long l;
   int oldpos;

   /*
    * i must be a (non-long) integer.
    */
   switch (cvint(&arg1, &l)) {
      case T_INTEGER:  j = (int)l; break;
#ifdef LONGS
      case T_LONGINT:  fail();
#endif LONGS
      default:         runerr(101, &arg1);
      }

   /*
    * Save old &subject and &pos.  Local variable i holds &pos
    *  before the move.
    */
   oldsubj = k_subject;
   oldpos = i = k_pos;

   /*
    * If attempted move is past either end of the string, fail.
    */
   if (i + j <= 0 || i + j > STRLEN(k_subject) + 1)
      fail();

   /*
    * Set new &pos.
    */
   k_pos += j;

   /*
    * Make sure j >= 0.
    */
   if (j < 0) {
      i += j;
      j = -j;
      }

   /*
    * Suspend substring of &subject that was moved over.
    */
   STRLEN(arg0) = j;
   STRLOC(arg0) = STRLOC(k_subject) + i - 1;
   suspend();

   /*
    * If move is resumed, restore the old subject and position
    *  and fail.
    */
   k_subject = oldsubj;
   k_pos = oldpos;
   fail();
   }

Procblock(move,2)