SUBROUTINE PROC(IP, IM, IIM, OK) C C P.U. AT LAT(IP) CALLS P.U. AT LAT(IM) (NODE(IIM)) C PROC COLLECTS ACTUAL PROC TEMPLATE(S) FROM THE CALL IF IT CAN C CHECKS FOR MISSING SUBPGMS AND STORES TEMPLATES OFF PGM UNIT C AT LAT(IM), THEM PROC CALLS ASLEV TO READJUST LEVELS OF ACTUALS C SENT TO LAT(IM) VS LEVEL (IM) C LOGICAL ERR, SYSERR, ABORT, OK INTEGER STACK, SYMLEN, PDSA, DSA, REF, PREF, PNODE, PLAT, FINDND, * FIND, SS(120), KBR(1) COMMON /CEXPRS/ LSTACK, STACK(620) COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6 COMMON /CTABL/ LDSA, PDSA, DSA(5000) COMMON /CREF/ LREF, PREF, REF(100) COMMON /HEAD/ LNODE, PNODE, NODE(500) COMMON /SCR1/ LINODE, INODE(500) COMMON /GRAPH/ LLAT, PLAT, LAT(6000) COMMON /DETECT/ ERR, SYSERR, ABORT EQUIVALENCE (SS(1),STACK(501)) DATA KBR(1) /0/ LSS = 501 C ARE THERE ARGS IN THIS REF IF (REF(1).NE.0) GO TO 20 10 RETURN C CYCLE THROUGH REF ARGS C JJ IS LAST ENTRY IN REF FOR ARGS C IS PTS TO FIRST FREE WD IN STACK C MAX IS 1 IF NO DUMMY PROCS IN REF, ELSE IS EQUAL TO THE C NUMBER OF ACTUAL PROCS SUBSTITUTABLE FOR THE DUMMY PROCS 20 JJ = REF(1) + 4 IS = 1 MAX = 0 DO 90 I=5,JJ,2 C SKIP OVER EXPR AS ACTUAL ARGS AND ALL ACTUALS BUT PROC ARGS IF (REF(I).EQ.0) GO TO 90 IF (REF(I+1).NE.6) GO TO 90 C SEE IF ACTUAL ARG IS DUMMY PROC ARG AT LAT(IP) C OR ACTUAL PROCEDURE IF (IGATT1(REF(I),4).EQ.1) GO TO 40 C HAVE AN ACTUAL PROCEDURE L = REF(I) L = FINDND(DSA(L+4),K) IF (L.NE.0) GO TO 30 C IF, AS GATHERING ACTUAL PROCS MATCHED TO DUMMY PROC ARGS C PROC FINDS A MISSING SUBPROGM, PROCESSING OF THIS REF CEASES L = REF(I) CALL ERROR2(20H MISSING SUBPROGRAM , 20, DSA(L+4), 1, 1, 0) CALL ERROR2(1H1, 0, REF(3), -1, 0, 1) GO TO 10 30 IF (IS+2.GT.LSS) GO TO 200 C 2 WD STACK ENTRY FOR AN ACTUAL PROC AS AN ACTUAL ARG C IS FIRST WD - 1, 2ND WD - LAT INDEX OF ACTUAL PROC STACK(IS) = 1 STACK(IS+1) = L IF (MAX.EQ.0) MAX = 1 IS = IS + 2 GO TO 90 C HAVE A DUMMY PROC CHECK OUT NO OF ACTUALS C MATCHED TO IT AND STACK THOSE WITH COUNTER ON TOP 40 L = IP + SYMLEN + 5 L = LAT(L) IF (L.NE.0) GO TO 50 IF (.NOT.OK) GOTO 10 CALL ERROR2(26H MISSING ACTUAL PROCEDURES ,26, KBR(1), -1,1,1) OK = .FALSE. GO TO 10 C COLLECT ACTUALS CORRESPONDING TO THIS PROC ARG C K IS REL POSIT OF PROC ARG AMONG ALL ARGS AT LAT(IP) C L PTS TO TEMPLATE AT LAT(IP) 50 K = REF(I) K = DSA(K+2) C J POINTS TO FIRST ELEMENT ON ARGLIST J = IP + SYMLEN + 1 J = LAT(J) IF (K.LE.1) GO TO 70 DO 60 LL=2,K J = LAT(J+3) 60 CONTINUE C K IS REL POSIT OF PROC ARG AMONG PROC ARGS IN LAT(IP) C THAT IS IT IS OFFSET NECESS TO READ CORRESP ACTUAL C PROCS OFF TEMPLATES AT LAT(IP) C J POINTS TO DUMMY PROC ARG ENTRY IN LAT (IP) 70 K = LAT(J+1) IF (IS+1.GE.LSS) GO TO 200 C J POINTS TO POSITION IN STACK OF COUNT OF HOW MANY C ACTUALS ARE MATCHED TO THIS DUMMY J = IS STACK(IS) = 0 IS = IS + 1 80 IF (IS+1.GE.LSS) GO TO 200 C N WD STACK ENTRY FOR DUMMY PROC ARGS USED AS ACTUAL ARGS IN REF C WD 1 CONTAINS NO OF ACTUAL PROCS MATCHED TO THE DUMMY C WDS 2 - N CONTAIN THE LAT INDICES OF EACH ACTUAL PROC STACK(J) = STACK(J) + 1 LL = K + L STACK(IS) = LAT(LL) IS = IS + 1 L = LAT(L) + L L = LAT(L) IF (L.NE.0) GO TO 80 IF (STACK(J).GT.MAX) MAX = STACK(J) 90 CONTINUE C HAVE COLLECTED ALL PROC ACTUALS CORRESP TO THE PROC C ARGS IN THE REF, NOTE MAX IS NO OF TEMPLATES RESULTING FROM C THIS REF TO BE PASSED TO LAT(IM) AS LONG AS THEIR DUPS C ARE NOT THERE ALREADY C BUILD EACH TEMPLATE IN LOOP AND CHECK FOR DUPLICATION C IF NOT THERE COPY INTO LAT OFF LAT(IM) AND CHECK LEVEL OF ACTUALS C PASSED DOWN VS LEVEL OF LAT(IM) IF (MAX.EQ.0) GO TO 10 DO 190 I=1,MAX C CREATE PROC INDICES PORTION OF TEMPLATE IN SS K = 1 ISS = 1 100 IF (K.GE.IS) GO TO 110 L = 1 IF (STACK(K).GT.1) L = I IF (ISS+1.GE.120) GO TO 200 J = K + L SS(ISS) = STACK(J) K = K + STACK(K) + 1 ISS = ISS + 1 GO TO 100 C HAVE TEMPLATE IN SS(1) THROUGH SS(ISS-1) C SEE IF IT HAS A DUPLICATE AT LAT(IM) 110 K = IM + SYMLEN + 5 K = LAT(K) IST = ISS - 1 120 IF (K.EQ.0) GO TO 150 DO 130 L=1,IST J = K + L IF (LAT(J).NE.SS(L)) GO TO 140 130 CONTINUE C FOUND DUPLICATE GO TO 190 C HAVENT FOUND A DUPLICATE YET C SEE IF THERE ARE MORE TEMPLATES TO COMPARE 140 K = LAT(K) + K K = LAT(K) GO TO 120 C NOT A DUPLICATE WILL ADD IT ON 150 IF (PLAT+IST+2.LE.LLAT) GO TO 160 CALL ERROR1(32H IN PROC, TABLE OVERFLOW OF LAT , 32) SYSERR = .TRUE. GO TO 10 C MAKE AN ENTRY CONSISTING OF 1ST WORD - NO OF PROCS+1, SUBSEQUENT C WORDS - PROCS LAT INDICES, LAST WORD - PTR C TO NEXT SUCH TEMPLATE 160 DO 170 L=1,IST J = PLAT + L LAT(J) = SS(L) 170 CONTINUE LAT(PLAT) = IST + 1 L = PLAT PLAT = PLAT + IST + 2 J = IM + SYMLEN + 5 LAT(PLAT-1) = LAT(J) LAT(J) = L C CHECK LEVELS DO 180 L=1,IST J = FIND(SS(L)) C FIND HEAD OF GREEN LINKS LIST AT LAT(IM) JR = IM + SYMLEN + 3 JLR = -SS(L) 210 IF(LAT(JR+1) .LE. 0) GOTO 220 JR = LAT(JR+1) GOTO 210 C HAVE TOP OF GREEN LINKS LIST AT LAT(JR) 220 IF(LAT(JR+1) .EQ. 0) GOTO 230 JR = IABS( LAT(JR+1) ) C LOOK FOR DUPLICATE ENTRY ON GREEN LINKS LIST IF(LAT(JR) .EQ. JLR) GOTO 240 GOTO 220 C ADD ON ENTRY TO GREEN LINKS LIST 230 IF(PLAT + 2 .GT. LLAT) GOTO 250 LAT(PLAT) = JLR LAT(PLAT+1) = 0 LAT(JR+1) = -PLAT PLAT = PLAT+2 240 IF((-1).EQ.INODE(J) .OR. (-2).EQ.INODE(J) .OR. * INODE(J).GT.INODE(IIM)) GOTO 180 INODE(J) = INODE(IIM) + 1 CALL ASLEV (-J) IF (SYSERR .OR. ABORT) GO TO 10 180 CONTINUE 190 CONTINUE GO TO 10 200 SYSERR = .TRUE. CALL ERROR1(33H IN PROC, TABLE OVERFLOW OF STACK, 33) GO TO 10 250 SYSERR = .TRUE. CALL ERROR1(31H IN PROC, TABLE OVERFLOW OF LAT,31) GOTO 10 END