V10/cmd/pret/pret9.c

#include <stdio.h>
#include "pret.h"

#define MAXACTUALS	(MANY)

 struct ACTUALS {
	int typefs[MAXACTUALS];		/* queue mesg or pvar */
	int index [MAXACTUALS];		/* qid,  if mesg      */
	struct ACTUALS *nxtcall;
	int nractuals;
	int whattask;			/* id of task called  */
 };

 struct ACTUALS *calls;		/* procedure call data   */
 int nrcalls;			/* nr of procedure calls */

 extern pid, rid, linenumber;

newcalltable()
{	nrcalls = 0;
	calls = NULL;
}

scrapcalltable()
{ struct ACTUALS *tmp;
  struct ACTUALS *hook = calls;
  int i;

	for (i = 0; i < nrcalls; i++)
	{	tmp = hook;
		hook = hook->nxtcall;
		free(tmp);
	}
}

newcall(ofwhat)
{ int i, j;
  struct ACTUALS *new, *old;

	new = ( struct ACTUALS *)
		Emalloc( sizeof(struct ACTUALS) );
	new->nractuals = 0;
	new->whattask = ofwhat;

	if ((j = nrcalls++) == 0)
		calls = new;
	else
	{	old = calls;
		for (i = 1; i < j; i++)
			old = old->nxtcall;
		old->nxtcall = new;
	}
	return nrcalls-1;
}

putcalls(tb)
	FILE *tb;
{ struct ACTUALS *hook;
  int j, k, a, b;
  int maxm = 0;
  int maxv = 0;

	fprintf(tb, "FCT_CALLS %d\n",  nrcalls);
	for (j = 0, hook = calls; j < nrcalls; j++)
	{
		for (k = a = b = 0; k < hook->nractuals; k++)
		{	if (hook->typefs[k] == ISM)
				a++;
			else if (hook->typefs[k] == ISV)
				b++;
		}
		if (a > maxm) maxm = a;
		if (b > maxv) maxv = b;

		fprintf(tb, "%d-%d/%d:", hook->whattask, a, b);
		for (k = 0; k < hook->nractuals; k++)
		{	if (hook->typefs[k] != ISQ)
			fprintf(tb, " %d/%d", hook->typefs[k], hook->index[k]);
		}
		putc('\n', tb);
		hook = hook->nxtcall;
	}
	fprintf(tb, "PARS %d/%d\n",  maxm, maxv);
}

callentry(x, val)
{ int i;
  struct ACTUALS *hook = calls;

	for (i = 1; i < nrcalls; i++)
		hook = hook->nxtcall;

	if ((i = hook->nractuals++) >= MAXACTUALS)
		whoops("too many parameters");
	hook->typefs[i] = x;
	hook->index[i] = val;
}