File:  [Research Unix] / researchv10no / cmd / pfort / PROC.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 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

unix.superglobalmegacorp.com

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