1: #define ASSERT(P,R) {if (!(P)) {fprintf(stderr,"failed assertion in routine R: P\n"); abort();}} 2: 3: extern int routnum, routerr; 4: extern long rtnbeg; /* number of chars up to beginnine of curernt routing */ 5: extern int **graph, nodenum; 6: extern int stopflg; /* turns off generation of stop statements */ 7: 8: #define TRUE 1 9: #define FALSE 0 10: #define LOGICAL int 11: #define VERT int 12: #define DEFINED(v) (v >= 0) 13: #define UNDEFINED -1 14: 15: /* node types */ 16: #define STLNVX 0 17: #define IFVX 1 18: #define DOVX 2 19: #define IOVX 3 20: #define FMTVX 4 21: #define COMPVX 5 22: #define ASVX 6 23: #define ASGOVX 7 24: #define LOOPVX 8 25: #define WHIVX 9 26: #define UNTVX 10 27: #define ITERVX 11 28: #define THENVX 12 29: #define STOPVX 13 30: #define RETVX 14 31: #define DUMVX 15 32: #define GOVX 16 33: #define BRKVX 17 34: #define NXTVX 18 35: #define SWCHVX 19 36: #define ACASVX 20 37: #define ICASVX 21 38: 39: #define TYPENUM 22 40: 41: 42: extern int hascom[TYPENUM]; /* FALSE for types with no comments, 2 otherwise */ 43: extern int nonarcs[TYPENUM]; /* number of wds per node other than arcs */ 44: extern VERT *arc(), *lchild(); 45: extern int *vxpart(), *negpart(), *predic(), *expres(), *level(), *stlfmt(); 46: /* node parts */ 47: #define FIXED 4 /* number of wds needed in every node */ 48: #define NTYPE(v) graph[v][0] 49: #define BEGCOM(v) graph[v][1] 50: #define RSIB(v) graph[v][2] 51: #define REACH(v) graph[v][3] 52: #define LCHILD(v,i) *lchild(v,i) 53: #define CHILDNUM(v) childper[NTYPE(v)] 54: #define ARC(v,i) *arc(v,i) 55: #define ARCNUM(v) *((arcsper[NTYPE(v)] >= 0) ? &arcsper[NTYPE(v)]: &graph[v][-arcsper[NTYPE(v)]]) 56: 57: /* STLNVX, FMTVX parts */ 58: #define BEGCODE(v) *stlfmt(v,0) /* 1st char of line on disk or address of string */ 59: #define ONDISK(v) *stlfmt(v,1) /* FALSE if in core,# of lines on disk otherwise */ 60: #define CODELINES(v) *vxpart(v,STLNVX,2) /* # of statements stored in node */ 61: 62: /* IOVX parts */ 63: #define FMTREF(v) *vxpart(v,IOVX,0) /* FMTVX associated with i/o statememt */ 64: #define PRERW(v) *vxpart(v,IOVX,1) /* string occurring in i/o statement before parts with labels */ 65: #define POSTRW(v) *vxpart(v,IOVX,2) /* string occurring in i/o statement after parts wih labels */ 66: #define ENDEQ 1 /* arc number associated with endeq */ 67: #define ERREQ 2 /* arc number associated wth erreq */ 68: 69: /* ITERVX parts */ 70: #define NXT(v) *vxpart(v,ITERVX,0) /* THENVX containing condition for iteration for WHILE or UNTIL */ 71: #define FATH(v) *vxpart(v,ITERVX,1) /* father of v */ 72: #define LPRED(v) *vxpart(v,ITERVX,2) /* loop predicate for WHILE, UNTIL */ 73: 74: /*DOVX parts */ 75: #define INC(v) *vxpart(v,DOVX,0) /* string for iteration condition of DO */ 76: 77: /* IFVX,THENVX parts */ 78: #define PRED(v) *predic(v) /* string containing predicate */ 79: #define NEG(v) *negpart(v) /* TRUE if predicate negated */ 80: #define THEN 0 /* arc number of true branch */ 81: #define ELSE 1 /* arc number of false branch */ 82: 83: /* miscellaneous parts */ 84: #define EXP(v) *expres(v) /* expression - ASVX, COMPVX, ASGOVX, SWCHVX, ICASVX */ 85: #define LABREF(v) *vxpart(v,ASVX,1) /* node referred to by label in ASSIGN statement */ 86: 87: 88: /* BRKVX, NXTVX parts */ 89: #define LEVEL(v) *level(v) 90: 91: /* also COMPVX, ASGOVX, SWCHVX, and DUMVX contain wd for number of arcs */ 92: /* location of this wd specified by negative entry in arcsper */ 93: extern int arcsper[TYPENUM]; 94: 95: /* also nodes contain wds for children as specified by childper */ 96: extern childper[TYPENUM]; 97: 98: 99: /* switches */ 100: extern int intcase, arbcase, whiloop, invelse, exitsize, maxnode, 101: maxhash, progress, labinit, labinc, inputform, debug,levbrk,levnxt,mkunt; 102: 103: /* arrays */ 104: extern int *after; 105: extern char *typename[]; 106: 107: struct list { 108: VERT elt; 109: struct list *nxtlist; 110: }; 111: struct list *append(), *consl(); 112: extern VERT retvert, stopvert; /* specifies unique return and stop vertices */ 113: extern VERT START; 114: extern int progtype; /* type of program - main or sub or blockdata */ 115: #define sub 1 116: #define blockdata 2 117: 118: extern FILE *infd, *debfd, *outfd;