|
|
1.1 root 1: SUBROUTINE SCAN(MAINND)
2: INTEGER PLAT, SYMLEN, PNODE, STACK
3: LOGICAL ERR, SYSERR, ABORT
4: COMMON /DETECT/ ERR, SYSERR, ABORT
5: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7: COMMON /CEXPRS/ LSTACK, STACK(620)
8: COMMON /HEAD/ LNODE, PNODE, NODE(500)
9: COMMON/ SCR1/ LINODE, INODE(500)
10: COMMON /SCR2/ LICOM, ICOM(500)
11: C
12: C SUBROUTINE PERCOLATES SETTING INFO ABOUT ARGUMENTS AND COMMON
13: C UP THE LATTICE---IN ORDER THAT UNSAFE REFS CAN BE CHECKED
14: C
15: C
16: C STACK(1)-(LSTACK) KEEPS TRACK OF PATH FROM CURRENT TERMINAL NODE
17: C TO SUPEROOT NODE
18: C INODE(J) IS 0 IF A NODE IS UNVISITED SO FAR ON ALL PATHS
19: C 1 IF A NODE HAS BEEN VISITED ON AT LEAST ONE PATH
20: C SYSERR IS SET BY SCAN
21: C
22: DO 10 I=1,PNODE
23: INODE(I) = 0
24: 10 CONTINUE
25: INODE(MAINND) = 1
26: MAIN = NODE(MAINND)
27: NUM = 0
28: C
29: C CYCLE THROUGH ALL TERMINAL NODES
30: C
31: 20 NUM = NUM + 1
32: IF (NUM.GT.PNODE-1) GO TO 240
33: C
34: C CHECK IF AN NODE IS ASF OR IF IT HAS DESC
35: C OR IF IT HAS NO PARENTS
36: C
37: IF (NODE(NUM).LE.0) GO TO 20
38: I = NODE(NUM) + SYMLEN + 4
39: C
40: C NO PARENTS
41: C
42: IF (LAT(I-1).EQ.0) GO TO 20
43: C
44: C TEST DESC FOR BEING ALL ASFS
45: C
46: IF (LAT(I).EQ.0) GO TO 40
47: L = LAT(I)
48: 30 K = LAT(L) + SYMLEN + 6
49: IF (MOD(LAT(K),8).NE.4) GO TO 20
50: L = LAT(I+1)
51: IF (L) 40, 40, 30
52: C
53: C HAVE A TERMINAL NODE;NOW CAN START RECURSIVE TRAVERSE OF ALL
54: C PATHS UPWARDS FROM IT TO ROOT
55: C ILEN--POINTER TO TOP OF CURRENT PATH
56: C JNODE--CURRENT NODE
57: C
58: 40 INODE(NUM) = 1
59: ILEN = 2
60: STACK(2) = NODE(NUM)
61: STACK(1) = 0
62: C
63: C STACK ENTRY IS 1ST WORD-POINTER TO NODE ON LIST OF PARS OFPREV
64: C NODE; 2ND WORD-NODE INDEX
65: C PROCESS NODE
66: C 1. CHECK EACH ARG. IF NOT SET OR IF PARENTS ARGLINKS NONEXISTANT
67: C SKIP TO NEXT ARG (IF NO ARGS GOTO 2); ELSE MARK EACH PARENT
68: C ARGLIST ENTRY AS SET FOR A SET ARG.
69: C 2. ADD EACH COMMON REGION TO PARENTS' LIST OF COMMON REGIONS
70: C 3. GET NEW NODE
71: C
72: 50 J = STACK(ILEN) + SYMLEN + 1
73: C
74: C ARG PROCESSING
75: C
76: J = LAT(J)
77: 60 IF (J.EQ.0) GO TO 90
78: I = IGATT2(J,5)
79: IF (I.NE.1 .OR. LAT(J+2).EQ.0) GO TO 80
80: L = LAT(J+2)
81: 70 IF (L.EQ.0) GO TO 80
82: C
83: C SET PARENT ARGS
84: C
85: CALL SATT2(LAT(L), 5, 1)
86: L = LAT(L+1)
87: GO TO 70
88: C
89: C GO ON TO NEXT ARG
90: C
91: 80 J = LAT(J+3)
92: GO TO 60
93: C
94: C COMMON PROCESSING
95: C
96: 90 J = STACK(ILEN) + SYMLEN + 2
97: II = 0
98: J = LAT(J)
99: C
100: C ACCUMULATE COMMON REGIONS
101: C
102: 100 IF (J.EQ.0) GO TO 110
103: ICOM(II+1) = LAT(J)
104: IF (LAT(J+1).NE.0) ICOM(II+1) = -ICOM(II+1)
105: II = II + 1
106: J = LAT(J+2)
107: GO TO 100
108: 110 IF (II.EQ.0) GO TO 150
109: C
110: C GET PARENT NODE AND ADD COMMON REGIONS TO IT
111: C
112: K = STACK(ILEN) + SYMLEN + 3
113: K = LAT(K)
114: 120 L = LAT(K) + SYMLEN + 2
115: DO 140 I=1,II
116: LL = MATCH(LAT(L),2,IABS(ICOM(I)))
117: IF (LL.EQ.0) GO TO 130
118: IF (ICOM(I).LT.0) LAT(LL+1) = 1
119: GO TO 140
120: C
121: C COPY COMMONNODE ENTRIES ONTO PARENTS LIST
122: C
123: 130 IF (PLAT+3.GT.LLAT) GO TO 270
124: LAT(PLAT+2) = LAT(L)
125: LAT(PLAT+1) = 0
126: LAT(PLAT) = IABS(ICOM(I))
127: IF (ICOM(I).LT.0) LAT(PLAT+1) = 1
128: LAT(L) = PLAT
129: PLAT = PLAT + 3
130: 140 CONTINUE
131: C
132: C GOONTO NEW PARENT
133: C
134: K = LAT(K+1)
135: IF (K.NE.0) GO TO 120
136: C
137: C FIND A PARENT OF THIS NODE AND TRY TO VISIT IT NEXT
138: C I CONTAINS POINTER TO PARENT LIST POSITION OF THE PARENT;
139: C J CONTAINS PARENTS INDEX IN LAT
140: C IF NO MORE PARENTS, MUST BACKUP A LEVEL
141: C
142: 150 I = STACK(ILEN) + SYMLEN + 3
143: 160 IF (LAT(I).EQ.0) GO TO 200
144: I = LAT(I)
145: 170 J = LAT(I)
146: C
147: C CHECK THAT NEW ENTRY HAS PARENTS
148: C AND THAT IT IS NOT THE SUPEROOT
149: C
150: K = J + SYMLEN + 3
151: IF (LAT(K).GT.0) GO TO 210
152: C
153: C IF THIS PARENT UNACCEPTIBLE GO ONTO NEXT PARENT
154: C MARK UNACCEPTIBLE AS VISITED SO WONT BE RECURSIVE
155: C
156: LL = PNODE - 1
157: DO 180 L=1,LL
158: IF (J.NE.NODE(L)) GO TO 180
159: INODE(L) = 1
160: GO TO 190
161: 180 CONTINUE
162: 190 I = I + 1
163: GO TO 160
164: C
165: C MUST BACK DOWN THE PATH TO THE NEXT JUNCTURE WITH
166: C AN UNTRIED PATH; CHECK FIRST FOR DONE WITH ENTIRE PATH
167: C
168: 200 IF (STACK(ILEN-1).EQ.0) GO TO 20
169: ILEN = ILEN - 2
170: J = STACK(ILEN+1)
171: IF (LAT(J+1).EQ.0) GO TO 200
172: C
173: C FOUND AN UNTRIED PATH ON THE STACK
174: C
175: I = LAT(J+1)
176: GO TO 170
177: C
178: C MARK ENTRY AS VISITED
179: C
180: 210 LL = PNODE - 1
181: DO 220 L=1,LL
182: IF (J.NE.NODE(L)) GO TO 220
183: INODE(L) = 1
184: GO TO 230
185: 220 CONTINUE
186: C
187: C ENTER ON STACK
188: C
189: 230 IF (ILEN+2.GT.LSTACK) GO TO 260
190: STACK(ILEN+1) = I
191: STACK(ILEN+2) = J
192: ILEN = ILEN + 2
193: GO TO 50
194: 240 RETURN
195: 250 SYSERR = .TRUE.
196: GO TO 240
197: 260 CALL ERROR1(33H IN SCAN, TABLE OVERFLOW OF STACK, 33)
198: GO TO 250
199: 270 CALL ERROR1(31H IN SCAN, TABLE OVERFLOW OF LAT, 31)
200: GO TO 250
201: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.