|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.