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