+static int
+callsubr(pvp, reclevel, e)
+ char **pvp;
+ int reclevel;
+ ENVELOPE *e;
+{
+ char **rvp;
+ int subr;
+ int stat;
+ STAB *s;
+
+ for (; *pvp != NULL; pvp++)
+ {
+ if ((**pvp & 0377) == CALLSUBR && pvp[1] != NULL)
+ break;
+ }
+ if (*pvp == NULL)
+ return EX_OK;
+
+ if (tTd(21, 3))
+ printf("-----callsubr %s\n", pvp[1]);
+
+ s = stab(pvp[1], ST_RULESET, ST_FIND);
+ if (s == NULL)
+ subr = atoi(pvp[1]);
+ else
+ subr = s->s_ruleset;
+
+ /*
+ ** Take care of possible inner calls.
+ */
+
+ stat = callsubr(&pvp[2], reclevel, e);
+ if (stat != EX_OK)
+ return stat;
+
+ /*
+ ** Move vector up over calling opcode.
+ */
+
+ for (rvp = &pvp[2]; *rvp != NULL; rvp++)
+ rvp[-2] = rvp[0];
+ rvp[-2] = NULL;
+
+ /*
+ ** Call inferior ruleset.
+ */
+
+ stat = rewrite(pvp, subr, reclevel, e);
+ return stat;
+}
+\f/*
+** CALLSUBR -- call subroutines in rewrite vector
+**
+** Parameters:
+** pvp -- pointer to token vector.
+**
+** Returns:
+** none.
+**
+** Side Effects:
+** pvp is modified.
+*/
+