V10/cmd/trace/trace8.c

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

#include <stdio.h>
#include "trace.h"
#include "trace.d"

 extern int *globvars;
 extern int nrprocs, nrrefs, nrvars;
 extern struct PROCSTACK **procstack;
 extern struct VARPARS *procpars;

 char *Realloc(), *Emalloc(), *Smalloc();

 struct TEMPLATE **templates;
 int nrtemplates = 0, tbound = 0;

growttable()
{ int nsz = tbound + 32;

	if (nsz == 32)
		templates = (struct TEMPLATE **)
			Emalloc(nsz * sizeof(struct TEMPLATE *));
	else
		templates = (struct TEMPLATE **)
			Realloc(templates, nsz * sizeof(struct TEMPLATE *));
	
	tbound = nsz;

}

struct TEMPLATE *
Tinsert()
{ struct TEMPLATE *try;
  register int i;

	if (nrtemplates >= tbound)
		growttable();

	try = (struct TEMPLATE *)
		Smalloc(sizeof(struct TEMPLATE));
	try->l_vars = (struct LOCVARS **)
		Smalloc(nrprocs * sizeof(struct LOCVARS *));
	try->g_vars = (short *)
		Smalloc(nrvars * sizeof(short));

	for (i = 0; i < nrvars; i++)
		try->g_vars[i] = (short) globvars[i];

	if (nrrefs > 0)
		try->traceback = (struct PROCSTACK **)
			Smalloc(nrprocs * sizeof(struct PROCSTACK *));

	for (i = 0; i < nrprocs; i++)
	{	try->l_vars[i] = (struct LOCVARS *)
			Smalloc(sizeof(struct LOCVARS));

		cpylvars(try->l_vars[i], &(procpars[i]));

		if (nrrefs > 0)
		{	if (procstack[i] == NULL)
			{	try->traceback[i] = NULL;
				continue;
			}
			try->traceback[i] = (struct PROCSTACK *)
				Smalloc(sizeof(struct PROCSTACK));
			cpystacks(try->traceback[i], procstack[i]);
	}	}

	templates[nrtemplates] = try;
	nrtemplates++;

	return try;
}

struct TEMPLATE *
inTtable()
{ register int i;

	for (i = 0; i < nrtemplates; i++)
		if (sametempl(templates[i]))
			return templates[i];

	return Tinsert();
}

sametempl(at)
	struct TEMPLATE *at;
{ register int i;

	for (i = 0; i < nrprocs; i++)
	{	if (cmplvars(at->l_vars[i], &(procpars[i])) == 0 ||
		   (nrrefs > 0 && cmpstacks(at->traceback[i], procstack[i]) == 0))
			return 0;
	}

	for (i = 0; i < nrvars; i++)
		if (at->g_vars[i] != (short) globvars[i])
			return 0;

	return 1;
}