File:  [Research Unix] / researchv10no / cmd / pfort / INVOKE.f
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

      SUBROUTINE INVOKE
C
C      PGM UNIT STEPS THROUGH NODES IN INVOCATION ORDER
C      PUSHING ACTUAL PROC ARGS DOWN LATTICE WHERE NECESSARY
C      AND READJUSTING LEVEL IF NECESSARY
C
      INTEGER PNODE, PLAT, PDSA, DSA, SYMLEN, PREF, REF, FIND, CHK1,
     *  ZERO(1), FINDND
      LOGICAL ERR, SYSERR, ABORT, OK, AOK
      COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
      COMMON /DETECT/ ERR, SYSERR, ABORT
      COMMON /HEAD/ LNODE, PNODE, NODE(500)
      COMMON /SCR1/ LINODE, INODE(500)
      COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
      COMMON /CTABL/ LDSA, PDSA, DSA(5000)
      COMMON /CREF/ LREF, PREF, REF(100)
      COMMON /FACTS/ NAME, NOST, ITYPE, IASF
      DATA ZERO(1)/0/
C      NC IS CURRENT NODE, NP IS PREVIOUS NODE PROCESSED
      NC = 0
   10 NP = NC
      OK = .TRUE.
      AOK = .TRUE.
C
C      SEARCH FOR NEXT NODE TO DO, NODE WITH LOWEST POSIT LEVEL IN INODE
C      UPON ENTRY TO INVOKE, SUPEROOT IS -1, ASFS AND BLOCK DATA
C      ARE -2. IF CANT FIND A POSITIVE LEVEL ARE DONE
C
      L = PNODE - 1
      DO 20 I=1,L
        IF (INODE(I).LT.0) GO TO 20
        NC = I
        GO TO 40
   20 CONTINUE
   30 RETURN
   40 J = NC
      DO 50 I=J,L
        IF (INODE(I).GE.0 .AND. INODE(I).LT.INODE(NC)) NC = I
   50 CONTINUE
C      READ IN SYMBOL TABLE FOR NODE(NC) AND POSITION REFS CORRECTLY
      CALL RDSYM(NC, NP)
   60 IF (INREF(I6)) 140, 140, 70
C      HAVE A REFERENCE TO PROCESS
   70 IF (IGATT1(REF(2),4).EQ.1) GO TO 80
C      PROCESSING A DIRECT REFERENCE
C      NEED ONLY PROCESS REF TEMPLATE IF ANY PROC ACTUAL ARGS IN REF
      L = REF(2)
      L = FINDND(DSA(L+4),K)
      CALL PROC(NODE(NC), L, K, AOK)
      IF (SYSERR .OR. ABORT) GO TO 30
      GO TO 60
C      PROCESSING AN INDIRECT REF
   80 K = NODE(NC) + SYMLEN + 5
      K = LAT(K)
      IF (K.EQ.0) GO TO 150
C      K PTS TO A TEMPLATE OF ACTUALS AT LAT(NODE(NC))
C      L GIVES REL POSIT AMONG PROC DUMMIES IN LAT(NODE(NC))
C      OF PROC DUMMY BEING CALLED
      L = REF(2)
      L = DSA(L+2)
      I = NODE(NC) + SYMLEN + 1
      I = LAT(I)
      IF (L.EQ.1) GO TO 100
      DO 90 M=2,L
        I = LAT(I+3)
   90 CONTINUE
C
C      I PTS TO DUMMY PROC ARG ENTRY IN LAT
C
  100 M = LAT(I+1) + K
      M = LAT(M)
C      M PTS TO ACTUAL SUBSTITUTABLE FOR I
      L = FIND(M)
C      RECURSION DUE TO INDIRECT REF COMPLETING THE LOOP
      IF (-1.NE.INODE(L)) GO TO 110
      ABORT = .TRUE.
      CALL ERROR2(26H RECURSIVE LOOP INVOLVING , 26, DSA(NAME+4), 1,1,0)
      CALL ERROR2(14H AND POSSIBLY , 14, LAT(M), 1, 0, 1)
      GO TO 30
C      NOTE NEED NOT WORRY ABOUT MISSING SUBPGM SINCE
C      THEN ITS LAT INDEX COULDNOT BE IN TEMPLATE
  110 IF (CHK1(NODE(NC),M).EQ.0) GO TO 130
C      PROCESSED A LEGAL INDIRET REF
      CALL SETPD(M, NODE(NC))
      IF (SYSERR) GO TO 30
      IF (-2.EQ.INODE(L) .OR. INODE(NC).LT.INODE(L)) GO TO 120
      INODE(L) = INODE(NC) + 1
      CALL ASLEV(L)
      IF (ABORT .OR. SYSERR) GO TO 30
C      LOOK FOR MORE ACTUALS
 120  CALL PROC(NODE(NC), M, L, AOK)
      IF (SYSERR .OR. ABORT) GO TO 30
  130 K = LAT(K) + K
      K = LAT(K)
      IF (K) 60, 60, 100
C      MARK CURRENT NODE DONE
  140 INODE(NC) = -1
      GO TO 10
  150 IF (.NOT.OK) GO TO 60
      K = NODE(NC)
      CALL ERROR2(20H NO ACTUAL PROCS IN ,20, LAT(K), 1, 1, 0)
      CALL ERROR2(28H CANNOT PROCESS FORMAL REFS , 28,
     *  ZERO, -3, 0, 1)
      OK = .FALSE.
      GO TO 60
      END

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.