1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)0.parts.c	4.2 (Berkeley) 04/16/91";
7 #endif /* not lint */
8 
9 #include <stdio.h>
10 #include "def.h"
11 
12 char *typename[TYPENUM]	= {"STLNVX",	"IFVX",		"DOVX",		"IOVX",	"FMTVX",
13 			"COMPVX",	"ASVX",		"ASGOVX",	"LOOPVX",	"WHIVX",
14 			"UNTVX",	"ITERVX",	"THENVX",	"STOPVX",	"RETVX",
15 			"DUMVX",	"GOVX",		"BRKVX",	"NXTVX",	"SWCHVX",
16 			"ACASVX",	"ICASVX"
17 	};
18 int hascom[TYPENUM]	= {2,		2,		2,		2,		2,
19 			2,		2,		2,		0,		0,
20 			0,		0,		2,		0,		0,
21 			0,		0,		0,		0,		2,
22 			2,		0
23 			};
24 
25 int nonarcs[TYPENUM]  	= {FIXED+3,   	FIXED+4,	FIXED+2,	FIXED+3, 	FIXED+2,
26 			FIXED+2,	FIXED+2,	FIXED+2,	FIXED+1,	FIXED+1,
27 			FIXED+1,	FIXED+4,	FIXED+3,	FIXED,		FIXED,
28 			FIXED+2,	FIXED+1,	FIXED + 1,	FIXED + 1,	FIXED+3,
29 			FIXED+4,	FIXED+2
30 			};
31 
32 int childper[TYPENUM]	= {0,	2,	1,	0,	0,
33 			0,	0,	0,	1,	1,
34 			1,	1,	1,	0,	0,
35 			1,	0,	0,	0,	1,
36 			2,	1
37 			};
38 
39 int arcsper[TYPENUM]	= {1,		2,		2,	3,	0,
40 			-(FIXED+1),	1,	-(FIXED+1),	1,	1,
41 			1,		1,		2,	0,	0,
42 			-FIXED,		1,	1,		1,	-(FIXED+1),
43 			2,		1
44 			};
45 
46 VERT *arc(v,i)
47 VERT v;
48 int i;
49 	{
50 	ASSERT(DEFINED(v),arc);
51 	ASSERT(0 <= i && i < ARCNUM(v), arc);
52 	return(&graph[v][nonarcs[NTYPE(v)] + i ]);
53 	}
54 
55 VERT *lchild(v,i)
56 VERT v; int i;
57 	{
58 	ASSERT(DEFINED(v),lchild);
59 	ASSERT(0 <= i && i < childper[NTYPE(v)],lchild);
60 	return(&graph[v][nonarcs[NTYPE(v)]-i-1]);
61 	}
62 
63 int *vxpart(v,type,j)
64 VERT v;
65 int type,j;
66 	{
67 	ASSERT((NTYPE(v) == type) && (0 <= j) && (j < nonarcs[type] - FIXED), vxpart);
68 	return(&graph[v][FIXED+j]);
69 	}
70 
71 int *expres(v)
72 VERT v;
73 	{
74 	int ty;
75 	ty = NTYPE(v);
76 	ASSERT(ty == COMPVX || ty == ASGOVX || ty == ASVX || ty == SWCHVX || ty == ICASVX,expres);
77 	return(&graph[v][FIXED]);
78 	}
79 
80 int *negpart(v)
81 VERT v;
82 	{
83 	ASSERT(NTYPE(v) == IFVX || NTYPE(v) == ACASVX,negpart);
84 	return(&graph[v][FIXED+1]);
85 	}
86 
87 int *predic(v)
88 VERT v;
89 	{
90 	ASSERT(NTYPE(v) == IFVX || NTYPE(v) == ACASVX, predic);
91 	return(&graph[v][FIXED]);
92 	}
93 
94 int *level(v)
95 VERT v;
96 	{
97 	ASSERT(NTYPE(v) == GOVX || NTYPE(v) == BRKVX || NTYPE(v) == NXTVX, level);
98 	return(&graph[v][FIXED]);
99 	}
100 int *stlfmt(v,n)
101 VERT v;
102 int n;
103 	{
104 	ASSERT(NTYPE(v) == STLNVX || NTYPE(v) == FMTVX,stlfmt);
105 	return(&graph[v][FIXED + n]);
106 	}
107 
108 create(type,arcnum)
109 int type, arcnum;
110 	{
111 	int i, *temp, wds;
112 	if (nodenum >= maxnode)
113 		{
114 		maxnode += 100;
115 		temp=realloc(graph,maxnode*sizeof(*graph));
116 		free(graph);
117 		graph=temp;
118 		}
119 	wds = nonarcs[type] + arcnum;
120 	graph[nodenum] = galloc(sizeof(*graph) * wds);
121 	for (i = 0; i < wds; i++)  graph[nodenum][i] = 0;
122 	NTYPE(nodenum) = type;
123 	if (arcsper[type] < 0)
124 		ARCNUM(nodenum) = arcnum;
125 
126 	return(nodenum++);
127 	}
128 
129