|
|
1.1 root 1: #include <stdio.h>
2: #include "trace.h"
3: #include "trace.d"
4:
5: extern int *globvars;
6: extern int nrprocs, nrrefs, nrvars;
7: extern struct PROCSTACK **procstack;
8: extern struct VARPARS *procpars;
9:
10: char *Realloc(), *Emalloc(), *Smalloc();
11:
12: struct TEMPLATE **templates;
13: int nrtemplates = 0, tbound = 0;
14:
15: growttable()
16: { int nsz = tbound + 32;
17:
18: if (nsz == 32)
19: templates = (struct TEMPLATE **)
20: Emalloc(nsz * sizeof(struct TEMPLATE *));
21: else
22: templates = (struct TEMPLATE **)
23: Realloc(templates, nsz * sizeof(struct TEMPLATE *));
24:
25: tbound = nsz;
26:
27: }
28:
29: struct TEMPLATE *
30: Tinsert()
31: { struct TEMPLATE *try;
32: register int i;
33:
34: if (nrtemplates >= tbound)
35: growttable();
36:
37: try = (struct TEMPLATE *)
38: Smalloc(sizeof(struct TEMPLATE));
39: try->l_vars = (struct LOCVARS **)
40: Smalloc(nrprocs * sizeof(struct LOCVARS *));
41: try->g_vars = (short *)
42: Smalloc(nrvars * sizeof(short));
43:
44: for (i = 0; i < nrvars; i++)
45: try->g_vars[i] = (short) globvars[i];
46:
47: if (nrrefs > 0)
48: try->traceback = (struct PROCSTACK **)
49: Smalloc(nrprocs * sizeof(struct PROCSTACK *));
50:
51: for (i = 0; i < nrprocs; i++)
52: { try->l_vars[i] = (struct LOCVARS *)
53: Smalloc(sizeof(struct LOCVARS));
54:
55: cpylvars(try->l_vars[i], &(procpars[i]));
56:
57: if (nrrefs > 0)
58: { if (procstack[i] == NULL)
59: { try->traceback[i] = NULL;
60: continue;
61: }
62: try->traceback[i] = (struct PROCSTACK *)
63: Smalloc(sizeof(struct PROCSTACK));
64: cpystacks(try->traceback[i], procstack[i]);
65: } }
66:
67: templates[nrtemplates] = try;
68: nrtemplates++;
69:
70: return try;
71: }
72:
73: struct TEMPLATE *
74: inTtable()
75: { register int i;
76:
77: for (i = 0; i < nrtemplates; i++)
78: if (sametempl(templates[i]))
79: return templates[i];
80:
81: return Tinsert();
82: }
83:
84: sametempl(at)
85: struct TEMPLATE *at;
86: { register int i;
87:
88: for (i = 0; i < nrprocs; i++)
89: { if (cmplvars(at->l_vars[i], &(procpars[i])) == 0 ||
90: (nrrefs > 0 && cmpstacks(at->traceback[i], procstack[i]) == 0))
91: return 0;
92: }
93:
94: for (i = 0; i < nrvars; i++)
95: if (at->g_vars[i] != (short) globvars[i])
96: return 0;
97:
98: return 1;
99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.