Annotation of researchv10no/cmd/pfort/LOOKUP.f, revision 1.1.1.1

1.1       root        1:       INTEGER FUNCTION LOOKUP(K1, LABEL)
                      2: C
                      3: C     STMT(PSTMT)-STMT(K2-1) TO BE ENTERED IN DSA
                      4: C     LABEL IS TRUE IF SYMBOL IS A LABEL.  ROUTINE
                      5: C     RETURNS VALUE OF INDEX OF SYMBOL IN DSA, CREATING
                      6: C     A NEW ENTRY ID NESESSARY.  IT ENTERS SYMBOL INTO
                      7: C     SYMBOL OR LABEL CHAIN AND CREATES A CROSSREFERENCE
                      8: C     ENTRY FOR THE CURRENT STATMT NUMBER
                      9: C
                     10:       INTEGER PSTMT, SYMLEN, DSA, HASH, L(6), LL(6)
                     11:       INTEGER BLANK, SYMHD, STMT, OUTUT, BNEXT, Q(70)
                     12:       INTEGER PDSA, OUTUT2, OUTUT3, OUTUT4
                     13:       LOGICAL LABEL, ERR, P1ERR, OPT, SYSERR, ABORT
                     14:       COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
                     15:      *    OUTUT4
                     16:       COMMON /DETECT/ ERR, SYSERR, ABORT
                     17:       COMMON /FACTS/ NAME, NOST, ITYP, IASF
                     18:       COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
                     19:       COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
                     20:       COMMON /CTABL/ LDSA, PDSA, DSA(5000)
                     21:       COMMON /CHASH/ LHASH, HASH(401)
                     22:       COMMON /TRANS/ Q
                     23:       COMMON /OPTNS/ OPT(5), P1ERR
                     24:       DATA BLANK /1H /
                     25:       K = K1 - PSTMT
                     26:       IF (K.LE.6) GO TO 10
                     27:       CALL ERROR1(39H IDENTIFIER TOO LONG, WILL BE TRUNCATED, 39)
                     28:       K = 6
                     29:    10 KK = K
                     30:       DO 20 I=1,K
                     31:         II = PSTMT + I - 1
                     32:         J = STMT(II) + 1
                     33:         LL(I) = Q(J)
                     34:    20 CONTINUE
                     35:       DO 30 I=1,SYMLEN
                     36:         L(I) = BLANK
                     37:    30 CONTINUE
                     38:       CALL S5PACK(LL, L, K)
                     39: C
                     40: C     HAVE PACKED SYMBOL;NOW CALCULATE HASH
                     41: C     HASH IS(PRODUCT OF FIRST AND THIRD LETTERS PLUS SECOND) MOD 257
                     42: C
                     43:       IF (KK.LT.3) GO TO 50
                     44:       IHASHS = STMT(PSTMT)*STMT(PSTMT+2) + STMT(PSTMT+1)
                     45:    40 IHASHS = MOD(IHASHS,LHASH)
                     46:       ISAVE = IHASHS
                     47:       IHASH = IHASHS + 1
                     48:       GO TO 80
                     49:    50 IHASHS = STMT(PSTMT)
                     50:       GO TO (60, 70), KK
                     51:    60 IHASHS = IHASHS*69 + 69
                     52:       GO TO 40
                     53:    70 IHASHS = IHASHS*69 + STMT(PSTMT+1)
                     54:       GO TO 40
                     55:    80 IF (HASH(IHASH).EQ.0) GO TO 140
                     56: C
                     57: C     IF TABLE EMPTY, CREATE ENTRY, SEND BACK INDEX OF FIRST WORD IN DSA
                     58: C     ELSE COMPARE SYMBOL TO ID AND RETURN INDEX OF PROPER ENTRY IN HASH
                     59: C     TABLE  AFTER RESOLVING COLLISION
                     60: C
                     61:       DO 90 J=1,SYMLEN
                     62:         II = HASH(IHASH) + 3 + J
                     63:         IF (L(J).NE.DSA(II)) GO TO 100
                     64:    90 CONTINUE
                     65:       LOOKUP = HASH(IHASH)
                     66:       IF (DSA(LOOKUP+1)) 190, 190, 200
                     67: C
                     68: C     RESOLVE CONFLICTS BY LINEAR CONGRUENCE
                     69: C
                     70:   100 IHASHS = MOD(IHASHS+1,LHASH)
                     71:       IF (IHASHS.EQ.ISAVE) GO TO 110
                     72:       IHASH = IHASHS + 1
                     73:       GO TO 80
                     74:   110 CALL ERROR1(34H IN LOOKUP, TABLE OVERFLOW OF HASH, 34)
                     75:   120 SYSERR = .TRUE.
                     76:       RETURN
                     77:   130 CALL ERROR1(33H IN LOOKUP, TABLE OVERFLOW OF DSA, 33)
                     78:       GO TO 120
                     79: C
                     80: C     CREATE NEW SYMBOL TABLE ENTRY; ZERO ITS CROSSREF TAIL PTR
                     81: C
                     82:   140 HASH(IHASH) = NEXT
                     83:       IF (NEXT+6+SYMLEN.GE.BNEXT) GO TO 130
                     84:       LOOKUP = NEXT
                     85: C
                     86: C*****DSA
                     87: C     1ST WORD..... ATTRIBUTE WORD
                     88: C     FIELD 1
                     89: C
                     90: C     BITS 0-2*TYPE (FOR SYMBOL) 0 DOUBLE PRECISION, 1 REAL, 2 INT,
                     91: C      3 COMPLEX,4 LOGICAL, 5 HOLLERITH
                     92: C      TYPE (FOR LABEL) 1 EXECUTABLE STMT, 2 NONEXEC. STMT,
                     93: C      3 FORMAT STMT
                     94: C     BIT 3****EXPLICITLY TYPED 1, IMPLICITLY 0
                     95: C     FIELD 2
                     96: C     BIT 4****(FOR SYMBOL) IN COMMON 1, NOT IN COMMON 0
                     97: C      (FOR LABEL) DEFINED 1, REFERENCED 0
                     98: C      (FOR COMMON-NAME) INITIALIZED IN BLOCK DATA SUBPGM
                     99: C     FIELD 3
                    100: C     BIT 5****EQUIVALENCED 1
                    101: C     FIELD 4
                    102: C     BIT 6****DUMMY SUBROUTINE/FUNCTION ARGUMENT 1
                    103: C     FIELD 5
                    104: C     BIT 7****VALUE SET BY P.U. 1
                    105: C     FIELD 6
                    106: C     BIT 8****VARIABLE USED AS DIMENSION IN VARIABLY DIMENSIONED ARRAY
                    107: C     FIELD 7
                    108: C     BIT 9-10*SCALAR 0, NUMBER OF ARRAY BOUNDS 1,2,3
                    109: C     FIELD 8
                    110: C     BITS 11-15**USAGE--UNSET 0, ASF ARG 1, ASF FCN 2, CURRENT P. U.=
                    111: C     SUBR 3, CURRENT P.U.=FCN 4, EXTERNAL FCN 5, EXTERNAL SUBR 6,
                    112: C     COMMON-NAME 7, ASSIGN/GOTO VARIABLE 8,LABEL 9, VARIABLE 10,
                    113: C     CURRENT P.U.=BLOCK DATA 11, CURRENT P.U.=MAIN 12, EXTERNAL ENTITY
                    114: C     13, INTRINSIC FCN 14
                    115: C     BITS 5-8 ARE 0 IF ENTRY CORRESPONDS TO ENTITY WITHOUT THE
                    116: C     ATTRIBUTE MENTIONED
                    117: C
                    118: C     2ND WD..... XREF LIST TAIL POINTER
                    119: C     3D WORD.....EXTRA INFO POINTER
                    120: C
                    121: C     FOR A VARIABLE, 3D WORD POINTS TO A 2 WORD BLOCK, FIRST WORD
                    122: C     CONTAINING STORAGE UNIT LENGTH OF THE VARIABLE (-1 IF VARIABLY
                    123: C     DIMENSIONED ARRAY);  SECOND WORD CONTAINING INDEX OF COMMON
                    124: C     ENTRY IN DSA;
                    125: C     FOR A LABEL, 3D WORD CONTAINS POINTER TO 2 WORD BLOCK ; AFTER
                    126: C     LABEL DEFINED, FIRST WORD CONTAINS STMT NUMBER OF FIRST STMT
                    127: C     IN CURRENT DO NESTING LEVEL; SECOND WORD CONTAINS NEGATIVE THE
                    128: C     NESTING LEVEL;  WHEN END OF THIS NESTING LEVEL IS ENCOUNTERED
                    129: C     ALL 2ND WORDS FOR THAT LEVEL ARE UPDATED TO CONTAIN STMT NUMBER
                    130: C     OF LAST STMT AT THAT NESTING LEVEL;
                    131: C     FOR A COMMON-NAME, 3D WORD POINTS TO HEAD OF LINEAR LINKED LIST
                    132: C     OF INDICES OF DSA ENTRIES FOR ORDERED ELEMENTS IN THAT COMMON;
                    133: C     FOR THE CURRENT P.U. IF ITS A SUBR OR FCN, 3D WORD CONTAINS
                    134: C     A LINEAR LINKED LIST OF INDICES IN DSA OF ENTRIES FOR ORDERED
                    135: C     DUMMIES OF THAT SUBPGM;
                    136: C
                    137: C     4TH WORD..... CHAIN POINTER TO ENTRY IN DSA FOR LAST SYMBOL
                    138: C     OR LABEL FOR WHICH A NEW ENTRY WAS CREATED
                    139: C     5-7TH WORD.....PACKED CHARACTERS OF SYMBOL OR LABEL
                    140: C
                    141:       J = NEXT + 2
                    142:       DO 150 I=NEXT,J
                    143:         DSA(I) = 0
                    144:   150 CONTINUE
                    145:       J = J + 1
                    146:       DO 160 I=1,SYMLEN
                    147:         II = I + J
                    148:         DSA(II) = L(I)
                    149:   160 CONTINUE
                    150: C
                    151: C     SETONE OF THE CHAIN POINTERS TO PUT THIS SYMBOL ON CHAIN
                    152: C
                    153:       IF (LABEL) GO TO 170
                    154:       DSA(J) = SYMHD
                    155:       SYMHD = NEXT
                    156:       GO TO 180
                    157:   170 DSA(J) = LABHD
                    158:       LABHD = NEXT
                    159:   180 NEXT = 4 + SYMLEN + NEXT
                    160: C
                    161: C     BEGINNEW XREF LIST
                    162: C
                    163:   190 IF (.NOT.LABEL .AND. .NOT.OPT(2)) GO TO 210
                    164:       IF (NEXT+2.GE.BNEXT) GO TO 130
                    165:       DSA(BNEXT-1) = NOST
                    166:       DSA(LOOKUP+1) = BNEXT - 1
                    167:       DSA(BNEXT) = BNEXT - 1
                    168:       BNEXT = BNEXT - 2
                    169:       GO TO 210
                    170: C
                    171: C     XREF LIST UPDATE; CHECK TO SEE IF STATEMENT NUMBER IS ALREADY
                    172: C     THERE
                    173: C
                    174:   200 IF (.NOT.LABEL .AND. .NOT.OPT(2)) GO TO 210
                    175:       IF (NEXT+2.GE.BNEXT) GO TO 130
                    176:       J = DSA(LOOKUP+1)
                    177:       IF (DSA(J).EQ.NOST) GO TO 210
                    178:       DSA(BNEXT) = DSA(J+1)
                    179:       DSA(J+1) = BNEXT - 1
                    180:       DSA(LOOKUP+1) = BNEXT - 1
                    181:       DSA(BNEXT-1) = NOST
                    182:       BNEXT = BNEXT - 2
                    183:   210 RETURN
                    184:       END

unix.superglobalmegacorp.com

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