|
|
1.1 root 1: #include <stdio.h>
2: #
3: /* find forward in-arcs for each node, pretending that arcs which jump into a loop
4: jump to the head of the largest such loop instead, based on the
5: depth first search tree */
6: #include "def.h"
7: #include "2.def.h"
8:
9: getinarc(inarc,head) /* construct array "inarc" containing in arcs for each node */
10: struct list **inarc;
11: VERT *head;
12: {
13: VERT v,adj,x;
14: int i, j;
15:
16: for (v=0; v < nodenum; ++v) inarc[v] = 0;
17:
18: /* fill in inarc nodes */
19:
20: for (i = 0; i < accessnum; ++i)
21: {
22: v = after[i];
23: for (j = 0; j < ARCNUM(v); ++j)
24: {
25: adj = ARC(v,j);
26: if (!DEFINED(adj))
27: continue;
28: if (ntoaft[adj] > ntoaft[v]) /* not a back edge */
29: /* if edge jumps into loop, pretend jumps to head of
30: largest loop jumped into */
31: {
32: x = maxentry(v,adj,head);
33: if (!DEFINED(x)) x = adj;
34: else x = FATH(x);
35:
36: inarc[x] = consls(v,inarc[x]); /* insert v in list inarc[x] */
37: }
38: }
39: }
40: }
41:
42:
43:
44: maxentry(x,y,head) /* return z if z is ITERVX of largest loop containing y but not x, UNDEFINED otherwise */
45: VERT x,y, *head;
46: {
47: if (head[y] == UNDEFINED) return(UNDEFINED);
48: if (loomem(x,head[y], head)) return (UNDEFINED);
49: y = head[y];
50: while (head[y] != UNDEFINED)
51: {
52: if (loomem(x,head[y],head)) return(y);
53: y = head[y];
54: }
55: return(y);
56: }
57:
58:
59:
60: loomem(x,y,head) /* return TRUE if x is in loop headed by y, FALSE otherwise */
61: VERT x,y, *head;
62: {
63: VERT w;
64: if (!DEFINED(y)) return(TRUE);
65: ASSERT(NTYPE(y) == ITERVX, loomem);
66: for (w = (NTYPE(x) == ITERVX) ? x : head[x]; DEFINED(w); w = head[w])
67: if (w == y) return (TRUE);
68: return(FALSE);
69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.