#define ASSERT(P,R) {if (!(P)) {fprintf(stderr,"failed assertion in routine R: P\n"); abort();}} extern int routnum, routerr; extern long rtnbeg; /* number of chars up to beginnine of curernt routing */ extern int **graph, nodenum; extern int stopflg; /* turns off generation of stop statements */ #define TRUE 1 #define FALSE 0 #define LOGICAL int #define VERT int #define DEFINED(v) (v >= 0) #define UNDEFINED -1 /* node types */ #define STLNVX 0 #define IFVX 1 #define DOVX 2 #define IOVX 3 #define FMTVX 4 #define COMPVX 5 #define ASVX 6 #define ASGOVX 7 #define LOOPVX 8 #define WHIVX 9 #define UNTVX 10 #define ITERVX 11 #define THENVX 12 #define STOPVX 13 #define RETVX 14 #define DUMVX 15 #define GOVX 16 #define BRKVX 17 #define NXTVX 18 #define SWCHVX 19 #define ACASVX 20 #define ICASVX 21 #define TYPENUM 22 extern int hascom[TYPENUM]; /* FALSE for types with no comments, 2 otherwise */ extern int nonarcs[TYPENUM]; /* number of wds per node other than arcs */ extern VERT *arc(), *lchild(); extern int *vxpart(), *negpart(), *predic(), *expres(), *level(), *stlfmt(); /* node parts */ #define FIXED 4 /* number of wds needed in every node */ #define NTYPE(v) graph[v][0] #define BEGCOM(v) graph[v][1] #define RSIB(v) graph[v][2] #define REACH(v) graph[v][3] #define LCHILD(v,i) *lchild(v,i) #define CHILDNUM(v) childper[NTYPE(v)] #define ARC(v,i) *arc(v,i) #define ARCNUM(v) *((arcsper[NTYPE(v)] >= 0) ? &arcsper[NTYPE(v)]: &graph[v][-arcsper[NTYPE(v)]]) /* STLNVX, FMTVX parts */ #define BEGCODE(v) *stlfmt(v,0) /* 1st char of line on disk or address of string */ #define ONDISK(v) *stlfmt(v,1) /* FALSE if in core,# of lines on disk otherwise */ #define CODELINES(v) *vxpart(v,STLNVX,2) /* # of statements stored in node */ /* IOVX parts */ #define FMTREF(v) *vxpart(v,IOVX,0) /* FMTVX associated with i/o statememt */ #define PRERW(v) *vxpart(v,IOVX,1) /* string occurring in i/o statement before parts with labels */ #define POSTRW(v) *vxpart(v,IOVX,2) /* string occurring in i/o statement after parts wih labels */ #define ENDEQ 1 /* arc number associated with endeq */ #define ERREQ 2 /* arc number associated wth erreq */ /* ITERVX parts */ #define NXT(v) *vxpart(v,ITERVX,0) /* THENVX containing condition for iteration for WHILE or UNTIL */ #define FATH(v) *vxpart(v,ITERVX,1) /* father of v */ #define LPRED(v) *vxpart(v,ITERVX,2) /* loop predicate for WHILE, UNTIL */ /*DOVX parts */ #define INC(v) *vxpart(v,DOVX,0) /* string for iteration condition of DO */ /* IFVX,THENVX parts */ #define PRED(v) *predic(v) /* string containing predicate */ #define NEG(v) *negpart(v) /* TRUE if predicate negated */ #define THEN 0 /* arc number of true branch */ #define ELSE 1 /* arc number of false branch */ /* miscellaneous parts */ #define EXP(v) *expres(v) /* expression - ASVX, COMPVX, ASGOVX, SWCHVX, ICASVX */ #define LABREF(v) *vxpart(v,ASVX,1) /* node referred to by label in ASSIGN statement */ /* BRKVX, NXTVX parts */ #define LEVEL(v) *level(v) /* also COMPVX, ASGOVX, SWCHVX, and DUMVX contain wd for number of arcs */ /* location of this wd specified by negative entry in arcsper */ extern int arcsper[TYPENUM]; /* also nodes contain wds for children as specified by childper */ extern childper[TYPENUM]; /* switches */ extern int intcase, arbcase, whiloop, invelse, exitsize, maxnode, maxhash, progress, labinit, labinc, inputform, debug,levbrk,levnxt,mkunt; /* arrays */ extern int *after; extern char *typename[]; struct list { VERT elt; struct list *nxtlist; }; struct list *append(), *consl(); extern VERT retvert, stopvert; /* specifies unique return and stop vertices */ extern VERT START; extern int progtype; /* type of program - main or sub or blockdata */ #define sub 1 #define blockdata 2 extern FILE *infd, *debfd, *outfd;