|
|
1.1 root 1: SUBROUTINE SETCOM(PP, K)
2: LOGICAL SYSERR, ERR, ABORT, BLANK
3: INTEGER PLAT, DSA, SYMLEN, PP, PDSA, COM, PCOM, R(5), S(3),
4: * FINDND, ST, SS(1), FINDCM
5: INTEGER ZERO(1)
6: COMMON /FACTS/ NAME, NOST, ITYP, IASF
7: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
8: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
9: COMMON /DETECT/ ERR, SYSERR, ABORT
10: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
11: COMMON /COMS/ LCOM, PCOM, COM(300)
12: C
13: C COM ENTRY
14: C WORD 1.....PACKED CHARACTERS OF COMMON-NAME
15: C WORD 2....TOTAL LENGTH OF COMMON BLOCK
16: C WORD 3.....1 IF COMMON INITIALIZED BY BLOCK DATA SUBPGM
17: C 0 IF NOT
18: C WORDS 4-8...TOTAL LENGTHS OF COMPLEX, DOUBLE PRECIS,
19: C REAL, INTEGER, LOGICAL DATA TYPES RESPECTIVELY
20: C WORD 9.....INDEX IN LAT OF ENTRY OF P.U. WHICH CONTAINS
21: C THIS DEFN OF THE COMMON BLOCK
22: C
23: C FINDS COMMON BLOCK ENTRY IN COM- ELSE CREATES AND INITIALIZES NEW
24: C ENTRY. CHECKS NEW ENTRY BLOCK NOT ALREADY A SUBPGM NAME.
25: C GATHERS INFO ON ORDER, TYPE, LENGTH OF ENTRIES IN THE COMMON-
26: C CHECKS FOR VARIABLY DIMENSIONED ARRAYS.
27: C FORMS COMMONLIST ENTRY FOR BLOCK OFF SUBPGM AT LAT(PP)
28: C IF FOUND COMMON IN COM, COMPARES OLD DEFN TO NEW FOR ORDER, LEN,
29: C TYPE OF ENTRIES; FLAGS INCONSISTENCIES; NOTES IF COMMON IN
30: C TWO BLOCK DATA PGMS. COMMON IS AT DSA(K)
31: C
32: DATA R(1), R(4) /2*1/, R(2), R(3), R(5) /3*2/, ST /1H*/
33: DATA ZERO(1) /0/
34: C
35: C CHECK ISNT IN NODE AS PROCEDURE NAME
36: C
37: IF (FINDND(DSA(K+4),KK)) 20, 20, 10
38: 10 CALL ERROR2(41H COMMON BLOCK HAS SAME NAME AS SUBPROGRAM, 41,
39: * DSA(K+4), 1, 1, 1)
40: C
41: C CHECK IF IN COM ALREADY
42: C
43: 20 KK = FINDCM(DSA(K+4))
44: IF (KK) 30, 30, 60
45: C
46: C CREATE NEW ENTRY
47: C
48: 30 IF (PCOM+SYMLEN+5.GT.LCOM) GO TO 260
49: DO 40 I=1,SYMLEN
50: L = PCOM + I - 1
51: LL = K + I + 3
52: COM(L) = DSA(LL)
53: 40 CONTINUE
54: C
55: C MARK COMMON SET WHEN IT IS CREATED BY A BLOCK-DATA
56: C SUBPROGRAM WHICH SET IT
57: C
58: DO 50 I=1,4
59: LL = L + I
60: COM(LL) = 0
61: 50 CONTINUE
62: COM(LL+1) = PP
63: IF (IGATT1(NAME,8).EQ.11 .AND. IGATT1(K,2).EQ.1) COM(L+2) = 1
64: KK = PCOM
65: PCOM = PCOM + SYMLEN + 5
66: C
67: C GATHER INFO ABT LENGTH,TYPE,ORDER OF ELEMENTS
68: C
69: 60 L = 0
70: S(1) = 0
71: S(2) = 0
72: S(3) = 0
73: I = DSA(K+2)
74: 70 IF (I) 130, 130, 80
75: C
76: C READING LIST OF ELEMENTS IN COMMON-CHECK TYPE,STRUCTURE
77: C
78: 80 K1 = IGATT1(DSA(I),1)
79: K2 = IGATT1(DSA(I),7)
80: K1 = MOD(K1,8)
81: IF (K1.EQ.5) K1 = 2
82: C
83: C R(I) CONTAINS PROPER ORDER OF TYPE I IN DEFN OF COMMON
84: C
85: LL = R(K1+1)
86: IF (LL.LT.L) GO TO 120
87: IF (K2) 90, 90, 100
88: 90 S(LL) = S(LL) + 1
89: GO TO 110
90: 100 K2 = DSA(I)
91: K2 = DSA(K2+2)
92: S(LL) = S(LL) + DSA(K2)
93: 110 I = DSA(I+1)
94: L = LL
95: GO TO 70
96: C
97: C ACCUMULATE COUNTS OF TYPES-NOTE TYPES OUT OF ORDER CAUSES
98: C TRUNCATION OF THE DEFINITION
99: C
100: 120 CALL ERROR2(41H ILLEGAL ORDERING OF DATA-TYPES IN COMMON, 41,
101: * COM(KK), 1, 1, 0)
102: CALL ERROR2(1H1, 0, ZERO(1), -1, 0, 1)
103: 130 S(3) = S(1) + S(2)
104: C
105: C HANG COMMONLIST ENTRY OFF PP NODE, IF NOT ALREADY THERE FROM SET
106: C
107: L = PP + SYMLEN + 2
108: I = MATCH(LAT(L),2,-K)
109: IF (I.GT.0) GO TO 140
110: I = MATCH(LAT(L),2,KK)
111: IF (I.LE.0) GO TO 150
112: 140 LAT(I) = KK
113: GO TO 160
114: C
115: C CREATE NEW ENTRY
116: C
117: 150 IF (PLAT+3.GT.LLAT) GO TO 280
118: LAT(PLAT) = KK
119: LAT(PLAT+1) = 0
120: LAT(PLAT+2) = LAT(L)
121: LAT(L) = PLAT
122: PLAT = PLAT + 3
123: 160 I = KK + SYMLEN
124: IF (COM(I)) 170, 170, 190
125: C
126: C NEW DEFN
127: C
128: 170 COM(I) = S(3)
129: COM(I+2) = S(1)
130: COM(I+3) = S(2)
131: 180 RETURN
132: C
133: C COMPARE LENGTHS OF EACH TYPE
134: C
135: 190 L = KK + SYMLEN + 2
136: BLANK = .FALSE.
137: CALL S5UNPK(COM(KK), SS(1), 1)
138: IF (SS(1).EQ.ST) BLANK = .TRUE.
139: IBR = 0
140: IF (COM(L+1).NE.S(2)) IBR = 1
141: IF (COM(L).NE.S(1)) IBR = -1
142: C BLANK COMMON DEFNS MATCH
143: IF (IBR.EQ.0 .AND. BLANK) GO TO 180
144: C NAMED COMMON DEFNS MATCH
145: IF (IBR.EQ.0 .AND. .NOT.BLANK) GO TO 210
146: C BLANK COMMON DONT MATCH
147: IF (IBR.NE.0 .AND. BLANK) GO TO 230
148: C NAMED COMMONS DONT MATCH -- ERROR
149: 200 CALL ERROR2(25H INCOMPATIBLE COMMON DEFN, 25, COM(KK), 1, 1,
150: * 0)
151: K1 = KK + SYMLEN + 4
152: K1 = COM(K1)
153: CALL ERROR2(3H IN, 3, LAT(K1), 1, 0, 0)
154: CALL ERROR2(4H AND, 4, LAT(PP), 1, 0, 1)
155: IF (BLANK) GO TO 180
156: C
157: C CHECK DOUBLE SETTING OF BLOCK
158: C
159: 210 IF (IGATT1(K,2).NE.1 .OR. IGATT1(NAME,8).NE.11) GO TO 180
160: IF (COM(L-1).NE.1) GO TO 220
161: CALL ERROR2(
162: * 53H COMMON BLOCK INITIALIZED IN TWO BLOCK DATA SUBPGMS , 53,
163: * COM(KK), 1, 1, 1)
164: GO TO 180
165: 220 COM(L-1) = 1
166: GO TO 180
167: C
168: C CHECK ARE LENGTHENING BLANK COMMON OFF THE END
169: C
170: 230 IF(IBR.EQ.(-1)) GOTO 250
171: C ARE LENGTHENING OFF END
172: C KEEP LONGEST DEFN
173: IF (COM(L+1).GT.S(2)) GO TO 180
174: 240 COM(L+1) = S(2)
175: LL = SYMLEN + KK
176: COM(LL) = S(3)
177: COM(LL+4) = PP
178: GO TO 180
179: C SEE ARE REALLY LENGTHENING OFF END IF
180: C DEFNS DIFFER IN FIRST DATA TYPE AREAS
181: 250 IF (S(1).LT.COM(L) .AND. S(2).EQ.0) GO TO 180
182: IF (.NOT.(S(1).GT.COM(L) .AND. COM(L+1).EQ.0)) GO TO 200
183: COM(L) = S(1)
184: GO TO 240
185: 260 CALL ERROR1(33H IN SETCOM, TABLE OVERFLOW OF COM, 33)
186: 270 SYSERR = .TRUE.
187: GO TO 180
188: 280 CALL ERROR1(33H IN SETCOM, TABLE OVERFLOW OF LAT, 33)
189: GO TO 270
190: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.