|
|
1.1 root 1: C XXXXXBLOCKDATA0.f
2: BLOCK DATA
3: C
4: C
5: C
6: C
7: C
8: C
9: C
10: C
11: C
12: C
13: C
14: C
15: C
16: C
17: C
18: C
19: C
20: C
21: C PFORT VERIFIER
22: C
23: C B. G. RYDER
24: C A. D. HALL
25: C
26: C BELL LABORATORIES, MURRAY HILL, NEW JERSEY 07974
27: C
28: C
29: C COPYRIGHT C 1978, BELL TELEPHONE LABORATORIES, INCOR-
30: C PORATED. GENERAL PERMISSION IS GRANTED TO MAKE AND
31: C DISTRIBUTE UNMODIFIED COMPLETE COPIES OF THIS COMPUTER
32: C PROGRAM, BUT NOT FOR PROFIT, PROVIDED THAT THIS COPYRIGHT
33: C NOTICE AND STATEMENT ARE INCLUDED.
34: C
35: C
36: C
37: C
38: C
39: C
40: C
41: C
42: C
43: C
44: C
45: C
46: C
47: C
48: C
49: C
50: C
51: C
52: INTEGER Z
53: COMMON /INTS/ Z(346)
54: DATA Z(1) /3/
55: DATA Z(2) /1HA/
56: DATA Z(3) /1HB/
57: DATA Z(4) /1HS/
58: DATA Z(5) /201/
59: DATA Z(6) /4/
60: DATA Z(7) /1HI/
61: DATA Z(8) /1HA/
62: DATA Z(9) /1HB/
63: DATA Z(10) /1HS/
64: DATA Z(11) /210/
65: DATA Z(12) /4/
66: DATA Z(13) /1HD/
67: DATA Z(14) /1HA/
68: DATA Z(15) /1HB/
69: DATA Z(16) /1HS/
70: DATA Z(17) /192/
71: DATA Z(18) /4/
72: DATA Z(19) /1HA/
73: DATA Z(20) /1HI/
74: DATA Z(21) /1HN/
75: DATA Z(22) /1HT/
76: DATA Z(23) /201/
77: DATA Z(24) /3/
78: DATA Z(25) /1HI/
79: DATA Z(26) /1HN/
80: DATA Z(27) /1HT/
81: DATA Z(28) /202/
82: DATA Z(29) /5/
83: DATA Z(30) /1HI/
84: DATA Z(31) /1HD/
85: DATA Z(32) /1HI/
86: DATA Z(33) /1HN/
87: DATA Z(34) /1HT/
88: DATA Z(35) /194/
89: DATA Z(36) /4/
90: DATA Z(37) /1HA/
91: DATA Z(38) /1HM/
92: DATA Z(39) /1HO/
93: DATA Z(40) /1HD/
94: DATA Z(41) /329/
95: DATA Z(42) /3/
96: DATA Z(43) /1HM/
97: DATA Z(44) /1HO/
98: DATA Z(45) /1HD/
99: DATA Z(46) /338/
100: DATA Z(47) /5/
101: DATA Z(48) /1HA/
102: DATA Z(49) /1HM/
103: DATA Z(50) /1HA/
104: DATA Z(51) /1HX/
105: DATA Z(52) /1H0/
106: DATA Z(53) /273/
107: DATA Z(54) /5/
108: DATA Z(55) /1HA/
109: DATA Z(56) /1HM/
110: DATA Z(57) /1HA/
111: DATA Z(58) /1HX/
112: DATA Z(59) /1H1/
113: DATA Z(60) /265/
114: DATA Z(61) /4/
115: DATA Z(62) /1HM/
116: DATA Z(63) /1HA/
117: DATA Z(64) /1HX/
118: DATA Z(65) /1H0/
119: DATA Z(66) /274/
120: DATA Z(67) /4/
121: DATA Z(68) /1HM/
122: DATA Z(69) /1HA/
123: DATA Z(70) /1HX/
124: DATA Z(71) /1H1/
125: DATA Z(72) /266/
126: DATA Z(73) /5/
127: DATA Z(74) /1HD/
128: DATA Z(75) /1HM/
129: DATA Z(76) /1HA/
130: DATA Z(77) /1HX/
131: DATA Z(78) /1H1/
132: DATA Z(79) /256/
133: DATA Z(80) /5/
134: DATA Z(81) /1HA/
135: DATA Z(82) /1HM/
136: DATA Z(83) /1HI/
137: DATA Z(84) /1HN/
138: DATA Z(85) /1H0/
139: DATA Z(86) /273/
140: DATA Z(87) /5/
141: DATA Z(88) /1HA/
142: DATA Z(89) /1HM/
143: DATA Z(90) /1HI/
144: DATA Z(91) /1HN/
145: DATA Z(92) /1H1/
146: DATA Z(93) /265/
147: DATA Z(94) /4/
148: DATA Z(95) /1HM/
149: DATA Z(96) /1HI/
150: DATA Z(97) /1HN/
151: DATA Z(98) /1H0/
152: DATA Z(99) /274/
153: DATA Z(100) /4/
154: DATA Z(101) /1HM/
155: DATA Z(102) /1HI/
156: DATA Z(103) /1HN/
157: DATA Z(104) /1H1/
158: DATA Z(105) /266/
159: DATA Z(106) /5/
160: DATA Z(107) /1HD/
161: DATA Z(108) /1HM/
162: DATA Z(109) /1HI/
163: DATA Z(110) /1HN/
164: DATA Z(111) /1H1/
165: DATA Z(112) /256/
166: DATA Z(113) /5/
167: DATA Z(114) /1HF/
168: DATA Z(115) /1HL/
169: DATA Z(116) /1HO/
170: DATA Z(117) /1HA/
171: DATA Z(118) /1HT/
172: DATA Z(119) /209/
173: DATA Z(120) /4/
174: DATA Z(121) /1HI/
175: DATA Z(122) /1HF/
176: DATA Z(123) /1HI/
177: DATA Z(124) /1HX/
178: DATA Z(125) /202/
179: DATA Z(126) /4/
180: DATA Z(127) /1HS/
181: DATA Z(128) /1HI/
182: DATA Z(129) /1HG/
183: DATA Z(130) /1HN/
184: DATA Z(131) /329/
185: DATA Z(132) /5/
186: DATA Z(133) /1HI/
187: DATA Z(134) /1HS/
188: DATA Z(135) /1HI/
189: DATA Z(136) /1HG/
190: DATA Z(137) /1HN/
191: DATA Z(138) /338/
192: DATA Z(139) /5/
193: DATA Z(140) /1HD/
194: DATA Z(141) /1HS/
195: DATA Z(142) /1HI/
196: DATA Z(143) /1HG/
197: DATA Z(144) /1HN/
198: DATA Z(145) /320/
199: DATA Z(146) /3/
200: DATA Z(147) /1HD/
201: DATA Z(148) /1HI/
202: DATA Z(149) /1HM/
203: DATA Z(150) /329/
204: DATA Z(151) /4/
205: DATA Z(152) /1HI/
206: DATA Z(153) /1HD/
207: DATA Z(154) /1HI/
208: DATA Z(155) /1HM/
209: DATA Z(156) /338/
210: DATA Z(157) /4/
211: DATA Z(158) /1HS/
212: DATA Z(159) /1HN/
213: DATA Z(160) /1HG/
214: DATA Z(161) /1HL/
215: DATA Z(162) /193/
216: DATA Z(163) /4/
217: DATA Z(164) /1HR/
218: DATA Z(165) /1HE/
219: DATA Z(166) /1HA/
220: DATA Z(167) /1HL/
221: DATA Z(168) /217/
222: DATA Z(169) /5/
223: DATA Z(170) /1HA/
224: DATA Z(171) /1HI/
225: DATA Z(172) /1HM/
226: DATA Z(173) /1HA/
227: DATA Z(174) /1HG/
228: DATA Z(175) /217/
229: DATA Z(176) /4/
230: DATA Z(177) /1HD/
231: DATA Z(178) /1HB/
232: DATA Z(179) /1HL/
233: DATA Z(180) /1HE/
234: DATA Z(181) /200/
235: DATA Z(182) /5/
236: DATA Z(183) /1HC/
237: DATA Z(184) /1HM/
238: DATA Z(185) /1HP/
239: DATA Z(186) /1HL/
240: DATA Z(187) /1HX/
241: DATA Z(188) /331/
242: DATA Z(189) /5/
243: DATA Z(190) /1HC/
244: DATA Z(191) /1HO/
245: DATA Z(192) /1HN/
246: DATA Z(193) /1HJ/
247: DATA Z(194) /1HG/
248: DATA Z(195) /219/
249: DATA Z(196) /3/
250: DATA Z(197) /1HE/
251: DATA Z(198) /1HX/
252: DATA Z(199) /1HP/
253: DATA Z(200) /713/
254: DATA Z(201) /4/
255: DATA Z(202) /1HD/
256: DATA Z(203) /1HE/
257: DATA Z(204) /1HX/
258: DATA Z(205) /1HP/
259: DATA Z(206) /704/
260: DATA Z(207) /4/
261: DATA Z(208) /1HC/
262: DATA Z(209) /1HE/
263: DATA Z(210) /1HX/
264: DATA Z(211) /1HP/
265: DATA Z(212) /731/
266: DATA Z(213) /4/
267: DATA Z(214) /1HA/
268: DATA Z(215) /1HL/
269: DATA Z(216) /1HO/
270: DATA Z(217) /1HG/
271: DATA Z(218) /713/
272: DATA Z(219) /4/
273: DATA Z(220) /1HD/
274: DATA Z(221) /1HL/
275: DATA Z(222) /1HO/
276: DATA Z(223) /1HG/
277: DATA Z(224) /704/
278: DATA Z(225) /4/
279: DATA Z(226) /1HC/
280: DATA Z(227) /1HL/
281: DATA Z(228) /1HO/
282: DATA Z(229) /1HG/
283: DATA Z(230) /731/
284: DATA Z(231) /6/
285: DATA Z(232) /1HA/
286: DATA Z(233) /1HL/
287: DATA Z(234) /1HO/
288: DATA Z(235) /1HG/
289: DATA Z(236) /1H1/
290: DATA Z(237) /1H0/
291: DATA Z(238) /713/
292: DATA Z(239) /6/
293: DATA Z(240) /1HD/
294: DATA Z(241) /1HL/
295: DATA Z(242) /1HO/
296: DATA Z(243) /1HG/
297: DATA Z(244) /1H1/
298: DATA Z(245) /1H0/
299: DATA Z(246) /704/
300: DATA Z(247) /3/
301: DATA Z(248) /1HS/
302: DATA Z(249) /1HI/
303: DATA Z(250) /1HN/
304: DATA Z(251) /713/
305: DATA Z(252) /4/
306: DATA Z(253) /1HD/
307: DATA Z(254) /1HS/
308: DATA Z(255) /1HI/
309: DATA Z(256) /1HN/
310: DATA Z(257) /704/
311: DATA Z(258) /4/
312: DATA Z(259) /1HC/
313: DATA Z(260) /1HS/
314: DATA Z(261) /1HI/
315: DATA Z(262) /1HN/
316: DATA Z(263) /731/
317: DATA Z(264) /3/
318: DATA Z(265) /1HC/
319: DATA Z(266) /1HO/
320: DATA Z(267) /1HS/
321: DATA Z(268) /713/
322: DATA Z(269) /4/
323: DATA Z(270) /1HD/
324: DATA Z(271) /1HC/
325: DATA Z(272) /1HO/
326: DATA Z(273) /1HS/
327: DATA Z(274) /704/
328: DATA Z(275) /4/
329: DATA Z(276) /1HC/
330: DATA Z(277) /1HC/
331: DATA Z(278) /1HO/
332: DATA Z(279) /1HS/
333: DATA Z(280) /731/
334: DATA Z(281) /4/
335: DATA Z(282) /1HT/
336: DATA Z(283) /1HA/
337: DATA Z(284) /1HN/
338: DATA Z(285) /1HH/
339: DATA Z(286) /713/
340: DATA Z(287) /4/
341: DATA Z(288) /1HS/
342: DATA Z(289) /1HQ/
343: DATA Z(290) /1HR/
344: DATA Z(291) /1HT/
345: DATA Z(292) /713/
346: DATA Z(293) /5/
347: DATA Z(294) /1HD/
348: DATA Z(295) /1HS/
349: DATA Z(296) /1HQ/
350: DATA Z(297) /1HR/
351: DATA Z(298) /1HT/
352: DATA Z(299) /704/
353: DATA Z(300) /5/
354: DATA Z(301) /1HC/
355: DATA Z(302) /1HS/
356: DATA Z(303) /1HQ/
357: DATA Z(304) /1HR/
358: DATA Z(305) /1HT/
359: DATA Z(306) /731/
360: DATA Z(307) /4/
361: DATA Z(308) /1HA/
362: DATA Z(309) /1HT/
363: DATA Z(310) /1HA/
364: DATA Z(311) /1HN/
365: DATA Z(312) /713/
366: DATA Z(313) /5/
367: DATA Z(314) /1HD/
368: DATA Z(315) /1HA/
369: DATA Z(316) /1HT/
370: DATA Z(317) /1HA/
371: DATA Z(318) /1HN/
372: DATA Z(319) /704/
373: DATA Z(320) /5/
374: DATA Z(321) /1HA/
375: DATA Z(322) /1HT/
376: DATA Z(323) /1HA/
377: DATA Z(324) /1HN/
378: DATA Z(325) /1H2/
379: DATA Z(326) /841/
380: DATA Z(327) /6/
381: DATA Z(328) /1HD/
382: DATA Z(329) /1HA/
383: DATA Z(330) /1HT/
384: DATA Z(331) /1HA/
385: DATA Z(332) /1HN/
386: DATA Z(333) /1H2/
387: DATA Z(334) /832/
388: DATA Z(335) /4/
389: DATA Z(336) /1HD/
390: DATA Z(337) /1HM/
391: DATA Z(338) /1HO/
392: DATA Z(339) /1HD/
393: DATA Z(340) /832/
394: DATA Z(341) /4/
395: DATA Z(342) /1HC/
396: DATA Z(343) /1HA/
397: DATA Z(344) /1HB/
398: DATA Z(345) /1HS/
399: DATA Z(346) /729/
400: END
401: C XXXXXBLOCKDATA1.f
402: BLOCK DATA
403: INTEGER EX(4,4), PT, PB, AO(4,4), RO(3,3)
404: COMMON /EXPRS/ PT, PB, AO, RO, EX
405: DATA AO(1,1), AO(1,2), AO(2,1) /3*0/, AO(1,3), AO(1,4), AO(3,1),
406: * AO(3,2), AO(4,1), AO(4,3) /6*-1/, AO(2,2) /1/, AO(3,3) /2/,
407: * AO(4,4), AO(2,4), AO(4,2) /3*3/, AO(3,4), AO(2,3) /2*-1/
408: DATA RO(1,1), RO(1,2), RO(2,1), RO(2,2), RO(3,3) /5*4/, RO(1,3),
409: * RO(2,3), RO(3,1), RO(3,2) /4*-1/
410: DATA EX(1,1) /0/, EX(1,2) /0/, EX(1,3) /0/, EX(1,4) /-1/, EX(2,1)
411: * /0/, EX(2,2) /1/, EX(2,3) /1/, EX(2,4) /-1/, EX(3,1) /-1/,
412: * EX(3,2) /-1/, EX(3,3) /2/, EX(3,4) /-1/, EX(4,1) /-1/,
413: * EX(4,2) /-1/, EX(4,3) /3/, EX(4,4) /-1/
414: END
415: C XXXXXBLOCKDATA2.f
416: BLOCK DATA
417: C
418: COMMON /TRANS/ Q(70)
419: INTEGER Q
420: C
421: DATA Q(1) /1H0/, Q(2) /1H1/, Q(3) /1H2/, Q(4) /1H3/, Q(5) /1H4/
422: DATA Q(6) /1H5/, Q(7) /1H6/, Q(8) /1H7/, Q(9) /1H8/, Q(10) /1H9/
423: C
424: DATA Q(31) /1HA/, Q(32) /1HB/, Q(33) /1HC/, Q(34) /1HD/, Q(35) /
425: * 1HE/
426: DATA Q(36) /1HF/, Q(37) /1HG/, Q(38) /1HH/, Q(39) /1HI/, Q(40) /
427: * 1HJ/
428: DATA Q(41) /1HK/, Q(42) /1HL/, Q(43) /1HM/, Q(44) /1HN/, Q(45) /
429: * 1HO/
430: DATA Q(46) /1HP/, Q(47) /1HQ/, Q(48) /1HR/, Q(49) /1HS/, Q(50) /
431: * 1HT/
432: DATA Q(51) /1HU/, Q(52) /1HV/, Q(53) /1HW/, Q(54) /1HX/, Q(55) /
433: * 1HY/
434: DATA Q(56) /1HZ/
435: C
436: DATA Q(61) /1H+/, Q(62) /1H-/, Q(63) /1H)/, Q(64) /1H=/, Q(65) /
437: * 1H./
438: DATA Q(66) /1H(/, Q(67) /1H*/, Q(68) /1H//, Q(69) /1H,/, Q(70) /
439: * 1H /
440: END
441: C XXXXXBLOCKDATA3.f
442: BLOCK DATA
443: INTEGER K(186), KI(30), KT(30)
444: COMMON /STS/ K, KI, KT
445: DATA K(1) /33/, K(2) /44/, K(3) /50/, K(4) /31/, K(5) /41/, K(6)
446: * /34/, K(7) /45/, K(8) /47/, K(9) /34/, K(10) /32/, K(11)
447: * /38/, K(12) /48/, K(13) /38/, K(14) /44/, K(15) /43/
448: DATA K(16) /47/, K(17) /34/, K(18) /30/, K(19) /41/
449: DATA K(20) /38/, K(21) /43/, K(22) /49/, K(23) /34/, K(24) /36/,
450: * K(25) /34/, K(26) /47/
451: DATA K(27) /32/, K(28) /44/, K(29) /42/, K(30) /45/, K(31) /41/,
452: * K(32) /34/, K(33) /53/, K(34) /41/, K(35) /44/, K(36) /36/,
453: * K(37) /38/, K(38) /32/, K(39) /30/, K(40) /41/
454: DATA K(41) /34/, K(42) /53/, K(43) /49/, K(44) /34/, K(45) /47/,
455: * K(46) /43/, K(47) /30/, K(48) /41/, K(49) /33/, K(50) /38/,
456: * K(51) /42/, K(52) /34/, K(53) /43/, K(54) /48/, K(55) /38/,
457: * K(56) /44/, K(57) /43/, K(58) /32/, K(59) /44/, K(60) /42/,
458: * K(61) /42/, K(62) /44/, K(63) /43/, K(64) /48/, K(65) /50/,
459: * K(66) /31/, K(67) /47/, K(68) /44/, K(69) /50/, K(70) /49/,
460: * K(71) /38/, K(72) /43/, K(73) /34/
461: DATA K(74) /35/, K(75) /50/, K(76) /43/, K(77) /32/, K(78) /49/,
462: * K(79) /38/, K(80) /44/, K(81) /43/, K(82) /31/, K(83) /41/,
463: * K(84) /44/, K(85) /32/, K(86) /40/, K(87) /33/, K(88) /30/,
464: * K(89) /49/, K(90) /30/, K(91) /34/, K(92) /46/, K(93) /50/,
465: * K(94) /38/, K(95) /51/, K(96) /30/, K(97) /41/, K(98) /34/,
466: * K(99) /43/, K(100) /32/, K(101) /34/, K(102) /33/, K(103)
467: * /30/, K(104) /49/, K(105) /30/
468: DATA K(106) /30/, K(107) /48/, K(108) /48/, K(109) /38/, K(110)
469: * /36/, K(111) /43/, K(112) /36/, K(113) /44/, K(114) /49/,
470: * K(115) /44/, K(116) /47/, K(117) /34/, K(118) /49/, K(119)
471: * /50/, K(120) /47/, K(121) /43/
472: DATA K(122) /32/, K(123) /44/, K(124) /43/, K(125) /49/, K(126)
473: * /38/, K(127) /43/, K(128) /50/, K(129) /34/, K(130) /32/,
474: * K(131) /30/, K(132) /41/, K(133) /41/, K(134) /48/, K(135)
475: * /49/, K(136) /44/, K(137) /45/, K(138) /38/, K(139) /35/,
476: * K(140) /33/, K(141) /44/, K(142) /45/, K(143) /30/, K(144)
477: * /50/, K(145) /48/, K(146) /34/
478: DATA K(147) /47/, K(148) /34/, K(149) /30/, K(150) /33/, K(151)
479: * /52/, K(152) /47/, K(153) /38/, K(154) /49/, K(155) /34/,
480: * K(156) /47/, K(157) /34/, K(158) /52/, K(159) /38/, K(160)
481: * /43/, K(161) /33/, K(162) /34/, K(163) /43/, K(164) /33/,
482: * K(165) /35/, K(166) /38/, K(167) /41/, K(168) /34/, K(169)
483: * /31/, K(170) /30/, K(171) /32/, K(172) /40/, K(173) /48/,
484: * K(174) /45/, K(175) /30/, K(176) /32/, K(177) /34/, K(178)
485: * /34/, K(179) /43/, K(180) /33/
486: DATA K(181) /35/, K(182) /44/, K(183) /47/, K(184) /42/, K(185)
487: * /30/, K(186) /49/
488: DATA KI(1) /15/, KI(2) /4/, KI(3) /7/, KI(4) /7/, KI(5) /7/,
489: * KI(6) /8/, KI(7) /9/, KI(8) /6/, KI(9) /10/, KI(10) /8/,
490: * KI(11) /9/, KI(12) /11/, KI(13) /4/, KI(14) /6/, KI(15) /4/,
491: * KI(16) /6/, KI(17) /8/, KI(18) /4/, KI(19) /4/, KI(20) /2/,
492: * KI(21) /2/, KI(22) /5/, KI(23) /4/, KI(24) /5/, KI(25) /6/,
493: * KI(26) /7/, KI(27) /9/, KI(28) /3/, KI(29) /6/, KI(30) /0/
494: DATA KT(1), KT(2), KT(3), KT(4), KT(5), KT(6), KT(7), KT(8)
495: * /8*1/, KT(9), KT(10), KT(11) /3*0/, KT(12) /2/, KT(13) /3/,
496: * KT(14), KT(15), KT(16), KT(17), KT(18), KT(19), KT(20),
497: * KT(21), KT(22), KT(23), KT(24), KT(25), KT(26), KT(27)
498: * /14*5/, KT(29), KT(30) /2*5/, KT(28) /6/
499: END
500: C XXXXXMAIN0.f
501: INTEGER STMT, PSTMT, SYMLEN, OUTUT, SYMHD, BNEXT, HASH, DSA,
502: * STACK, DOLIST, DOPT, OUTUT2, OUTUT3, PDSA, OUTUT4, REF, PREF,
503: * PNODE, PLAT, PCOM, COM
504: LOGICAL ERR, SYSERR, OPT, P1ERR, ABORT, P2
505: LOGICAL SW, QBR
506: COMMON /SWS/ SW(10)
507: C*****SWS
508: C SW(1) (LOG) IF TRUE, CAN USE END= OPTION IN READ STMTS
509: C
510: COMMON /OPTNS/ OPT(5), P1ERR
511: C
512: C*****OPTNS
513: C OPT(1) (LOG) IF TRUE, SYMBOL TABLE PRINTED FOR EACH P. U.
514: C OPT(2) (LOG) IF TRUE, CROSS REFERENCES PRINTED FOR EACH SYMBOL
515: C OPT(3) (LOG) IF TRUE, PASS 2 IS EXECUTED
516: C OPT(4) (LOG) IF TRUE, LISTING PRINTED FOR EACH P. U.
517: C OPT(5) (LOG) IF TRUE, FORTRAN PGM COMPILED AFTER VERIFIER
518: C RUN; IF ANY OF THESE ARE FALSE THE CORRESPONDING ACTION IS NOT TA
519: C P1ERR (LOG) SET TO TRUE IF INFO NORMALLY SAVED FOR PASS 2 IS
520: C SUPPRESSED FOR THIS P. U.
521: C
522: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
523: C
524: C*****INPUT
525: C NSTMT (INT) INDEX OF END-OF-INPUT-STMT CHARACTER IN STMT
526: C PSTMT (INT) POINTS TO CURRENT POSITION IN STMT (EXCEPT IN LEXICAL
527: C SUBPGMS WHERE IT IS UPDATED IN CALLING SUBPGM AFTER A TOKEN IS
528: C FOUND)
529: C STMT (INT) ENCODED FORM OF DEBLANKED INPUT STMT
530: C
531: COMMON /CEXPRS/ LSTACK, STACK(620)
532: C
533: C*****CEXPRS
534: C LSTACK (INT) LENGTH OF STACK
535: C STACK(*), (INT) ARRAY USED IN EXPR AS A STACK; ALSO FOR AUXILLARY
536: C STORAGE AND OUTPUT
537: C
538: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
539: * OUTUT4
540: C
541: C*****PARAMS
542: C INUT (INT) LOGICAL INPUT NUMBER FOR THE HOST MACHINE
543: C OUTUT (INT) LOGICAL OUTPUT NUMBER FOR THE HOST MACHINE
544: C NOCHAR (INT) NUMBER OF CHARACTERS PER MACHINE WORD IN HOST
545: C SYMLEN (INT) NUMBER OF WORDS NECESSARY ON HOST TO STORE 6
546: C CHARACTERS (I.E. A FORTRAN SYMBOL)
547: C OUTUT2 (INT), OUTUT3(INT), OUTUT4(INT) LOGICAL OUTPUT NUMBERS
548: C FOR THE HOST MACHINE TO BE USED BY THE VERIFIER FOR INTERPASS
549: C COMMUNICATION
550: C
551: COMMON /FACTS/ NAME, NOST, ITYP, IASF
552: C
553: C*****FACTS
554: C NAME (INT) INDEX IN SYMBOL TABLE OF ENTRY FOR CURRENT P.U.
555: C NOST (INT) STMT NUMBER OF CURRENT STMT BEING PROCESSED
556: C ITYP (INT) TYPE OF STMT CURRENTLY BEING PROCESSED (SEE PU
557: C FOR FURTHER DOC)
558: C
559: COMMON /DETECT/ ERR, SYSERR, ABORT
560: C
561: C*****DETECT
562: C ERROR (LOG) SET TO TRUE IN VARIOUS SUBPGMS USUALLY TO CEASE PROCES
563: C OF CURRENT STMT
564: C SYSERR (LOG) IRRECOVERABLE ERROR IN SYSTEM; (E.G., TABLE OVERFLOW)
565: C IN PASS 1 CAUSES CURRENT P.U. TO HAVE AN END STMT SIMULATED AND
566: C EXECUTION PROCEDES TO NEXT P.U.; IN PASS 2 CAUSES PROCESSING
567: C OF PROGRAM TO CEASE.
568: C
569: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
570: C
571: C*****TABL
572: C NEXT (INT) POINTS TO NEXT FREE WORD IN DSA (COUNTING FROM DSA(1))
573: C LABHD (INT) POINTS TO HEAD OF LINEAR LINKED LIST IN DSA OF ALL
574: C LABELS IN P.U.
575: C SYMHD (INT) POINTS TO HEAD OF LINEAR LINKED LIST IN DSA OF ALL
576: C SYMBOLS IN P.U.
577: C BNEXT (INT) POINTS TO NEXT FREE WORD IN DSA (COUNTING FROM
578: C DSA(LDSA))
579: C
580: COMMON /CHASH/ LHASH, HASH(401)
581: C
582: C*****CHASH
583: C LHASH (INT) LENGTH OF HASH ARRAY
584: C HASH (*) (INT) HASH TABLE USED TO INDEX INTO DSA
585: C
586: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
587: C
588: C*****CTABL
589: C LDSA (INT) LENGTH OF DSA
590: C DSA(*) (INT) SYMBOL TABLE (SEE LOOKUP FOR MORE EXPLICIT DOC)
591: C
592: COMMON /DOS/ DOPT, LDO, DOLIST(192)
593: C
594: C*****DOS
595: C DOPT (INT) POINTER TO FIRST FREE WORD IN DOLIST
596: C LDO (INT) LENGTH OF DOLIST
597: C DOLIST (*) (INT) ARRAY USED AS STACK FOR NESTING OF DOS (USED
598: C TO TEST FOR LEGAL BRANCHING WITHIN P.U. (SEE DOSPEC FOR FURTHER
599: C DOC)
600: C
601: COMMON /LISTDO/ LPT, LEN, LS(64)
602: C
603: C*****LISTDO
604: C LPT (INT) POINTER TO FIRST FREE WORD IN LS
605: C LEN (INT) LENGTH OF LS
606: C LS (*) (INT) ARRAY USED AS STACK FOR NESTING OF IMPLIED
607: C DO'S IN INPUT/OUTPUT STMTS (SEE DOSPEC FOR FURTHER DOC)
608: C
609: COMMON /PASS/ P2, QBR
610: C
611: C*****PASS
612: C P2 (LOG) IF TRUE, VERIFIER IS IN PASS 2; ELSE VERIFIER IS IN PASS
613: C QBR (LOG) IF TRUE, VERIFIER IS TO PRINT ERROR MESSAGES
614: C ELSE IS NOT
615: C
616: COMMON /CREF/ LREF, PREF, REF(100)
617: C
618: C*****CREF
619: C LREF (INT) TOTAL LENGTH OF ARRAY REF
620: C PREF (INT) CURRENT LENGTH OF REF
621: C REF (*) (INT) ARRAY CONTAINING INFORMATION CONCERNING A SUBR/FCN
622: C REF (SEE SETREF FOR FURTHER DOC)
623: C
624: COMMON /HEAD/ LNODE, PNODE, NODE(500)
625: C
626: C*****HEAD
627: C LNODE (INT) LENGTH OF NODE
628: C PNODE (INT) POINTER TO NEXT FREE WORD IN NODE
629: C NODE (*) (INT) ARRAY OF INDICES OF P.U. ENTRIES IN LAT
630: C
631: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
632: C
633: C*****GRAPH
634: C LLAT (INT) LENGTH OF LAT
635: C PLAT (INT) POINTER TO NEXT FREE WORD IN LAT
636: C LAT (*) (INT) ARRAY WHOSE ENTRIES DESCRIBE EACH P.U. IN PGM
637: C AND THEIR INTER-RELNS (SEE SETNOD FOR FURTHER DOC)
638: C
639: COMMON /COMS/ LCOM, PCOM, COM(300)
640: C
641: C*****COMS
642: C LCOM (INT) LENGTH OF COM
643: C PCOM (INT) POINTER TO NEXT FREE WORD IN COM
644: C COM (*) (INT) ARRAY WHOSE ENTRIES DESCRIBE EACH COMMON BLOCK
645: C IN PGM (SEE SETCOM FOR FURTHER DOC)
646: COMMON /SCR1/ LINODE, INODE(500)
647: COMMON /SCR2/ LNNODE, NNODE(500)
648: C
649: C***SCR1,SCR2,SCR3
650: C INODE(INT), NNODE(INT) SCRATCH ARRAYS KEYED ON LENGTH NODE(*)
651: C LINNODE = LNNODE .GE. MAX( LNODE, LCOM/(SYMLEN+5) )
652: C
653: C THREE MORE BLOCK COMMON REGIONS ARE USED : STS -SEE TYPST
654: C TRANS - SEE MAPCHR EXPRS - SEE EXPR FOR FURTHER DOC
655: C
656: QBR = .FALSE.
657: NOCHAR = 4
658: INUT = 5
659: OUTUT = 6
660: OUTUT2 = 7
661: OUTUT3 = 8
662: OUTUT4 = 9
663: C NOCHAR WAS &, OUT2-4 was 12,13,14 in distribution tape
664: REWIND INUT
665: REWIND OUTUT2
666: REWIND OUTUT3
667: REWIND OUTUT4
668: LEN = 64
669: SYMLEN = (5/NOCHAR) + 1
670: P2 = .FALSE.
671: ERR = .FALSE.
672: ABORT = .FALSE.
673: SYSERR = .FALSE.
674: SW(1) = .FALSE.
675: PDSA = 1
676: LDSA = 5000
677: LHASH = 401
678: DO 10 I=1,LHASH
679: HASH(I) = 0
680: 10 CONTINUE
681: OPT(1) = .TRUE.
682: OPT(2) = .TRUE.
683: OPT(3) = .TRUE.
684: OPT(4) = .TRUE.
685: OPT(5) = .FALSE.
686: LSTACK = 620
687: LREF = 100
688: PREF = 1
689: LDO = 192
690: CALL OVRLAY(1)
691: CALL PU
692: IF (.NOT.OPT(3) .OR. SYSERR) GO TO 30
693: P2 = .TRUE.
694: IF (.NOT.OPT(4)) WRITE (OUTUT,99999)
695: 99999 FORMAT (1H1)
696: CALL OVRLAY(2)
697: LLAT = 6000
698: PLAT = 1
699: BNEXT = LDSA
700: NEXT = 1
701: LNODE = 500
702: PNODE = 1
703: LCOM = 300
704: PCOM = 1
705: LINODE = LNODE
706: LNNODE = LNODE
707: C
708: C PASS 1 CAN SUPPRESS PASS 2 PROCESSING FOR SPECIFIC P.U.
709: C BUT NEVER SHUTS OFF PASS 2 COMPLETELY; PASS 2 CAN CEASE
710: C PROCESSING FOR VARIOUS REASONS:
711: C 1. 2 SUBPRGMS WITH SAME NAME(IN SETNOD)
712: C 2. NO PROGRAM UNIT SUCCESSFULLY PASSED TO PASS 2
713: C (IN CONSTR)
714: C 3. RECURSION (IN ASLEV AND INVOKE)
715: C IF MISSING SUBPRGMS ARE DISCOVERED, PASS 2 CAN
716: C PROCEDE WITH INCOMPLETE PROCESSING, A MESSAGE
717: C IS PRINTED TO INFORM THE USER
718: C
719: REWIND OUTUT2
720: REWIND OUTUT3
721: REWIND OUTUT4
722: CALL CONSTR(IROOT)
723: C CAN RETURN FROM CONSTR IN ERROR CONDITION WITH FILES LACKING
724: C VERIFIER SOFTWARE END OF FILE
725: IF (ABORT .OR. SYSERR) GO TO 30
726: REWIND OUTUT4
727: REWIND OUTUT3
728: REWIND OUTUT2
729: CALL CHECKS(IROOT)
730: 20 REWIND INUT
731: CALL OVRLAY(3)
732: CALL COMPIL(.NOT.(ABORT.OR.SYSERR).AND.OPT(5))
733: STOP
734: 30 WRITE (OUTUT,99998)
735: 99998 FORMAT (47H1INTER-PROGRAM-UNIT COMMUNICATIONS NOT VERIFIED)
736: GO TO 20
737: END
738: C XXXXXCOMPIL.f
739: SUBROUTINE COMPIL(FLAG)
740: C
741: LOGICAL FLAG
742: C
743: RETURN
744: C
745: END
746: C XXXXXOVRLAY.f
747: SUBROUTINE OVRLAY(N)
748: C
749: RETURN
750: C
751: END
752: C XXXXXSATT1.f
753: SUBROUTINE SATT1(INDEX, FIELD, ATT)
754: C
755: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
756: C
757: INTEGER INDEX, FIELD, ATT
758: INTEGER LDSA, PDSA, DSA
759: INTEGER FWTH(8), FPOS(8)
760: C
761: DATA FWTH(1) /16/, FPOS(1) /1/
762: DATA FWTH(2) /2/, FPOS(2) /16/
763: DATA FWTH(3) /2/, FPOS(3) /32/
764: DATA FWTH(4) /2/, FPOS(4) /64/
765: DATA FWTH(5) /2/, FPOS(5) /128/
766: DATA FWTH(6) /2/, FPOS(6) /256/
767: DATA FWTH(7) /4/, FPOS(7) /512/
768: DATA FWTH(8) /32/, FPOS(8) /2048/
769: C
770: DSA(INDEX) = DSA(INDEX) + (ATT-MOD(DSA(INDEX)/FPOS(FIELD),
771: * FWTH(FIELD)))*FPOS(FIELD)
772: C
773: RETURN
774: C
775: END
776: C XXXXXIGATT1.f
777: INTEGER FUNCTION IGATT1(INDEX, FIELD)
778: C
779: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
780: C
781: INTEGER INDEX, FIELD
782: INTEGER LDSA, PDSA, DSA
783: INTEGER FWTH(8), FPOS(8)
784: C
785: DATA FWTH(1) /16/, FPOS(1) /1/
786: DATA FWTH(2) /2/, FPOS(2) /16/
787: DATA FWTH(3) /2/, FPOS(3) /32/
788: DATA FWTH(4) /2/, FPOS(4) /64/
789: DATA FWTH(5) /2/, FPOS(5) /128/
790: DATA FWTH(6) /2/, FPOS(6) /256/
791: DATA FWTH(7) /4/, FPOS(7) /512/
792: DATA FWTH(8) /32/, FPOS(8) /2048/
793: C
794: IGATT1 = MOD(DSA(INDEX)/FPOS(FIELD),FWTH(FIELD))
795: C
796: RETURN
797: C
798: END
799: C XXXXXEXCH.f
800: INTEGER FUNCTION EXCH(J1, J2, DSA, LDSA, HASH, LHASH, OFFSET)
801: INTEGER DSA(LDSA), HASH(LHASH), OFFSET
802: INTEGER OUTUT, SYMLEN, OUTUT2, OUTUT3, OUTUT4
803: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
804: * OUTUT4
805: C
806: C DSA(HASH(J1)+OFFSET) CONTAINS ELE TO BE COMPARED
807: C DSA(HASH(J2)+OFFSET) CONTAINS ELE TO BE COMPARED
808: C
809: JJ1 = HASH(J1) + OFFSET
810: JJ2 = HASH(J2) + OFFSET
811: DO 40 I=1,SYMLEN
812: K1 = JJ1 + I - 1
813: K2 = JJ2 + I - 1
814: IF (DSA(K1)) 10, 20, 20
815: 10 IF (DSA(K2)) 30, 50, 50
816: 20 IF (DSA(K2)) 70, 30, 30
817: 30 IF (DSA(K1)-DSA(K2)) 70, 40, 50
818: 40 CONTINUE
819: C
820: C COMPARISON SHOWS ELEMENTS IN PROPER ORDER
821: C
822: 50 EXCH = 0
823: 60 RETURN
824: C
825: C COMPARISON SHOWS NEED FOR EXCHANGE
826: C
827: 70 I = HASH(J1)
828: HASH(J1) = HASH(J2)
829: HASH(J2) = I
830: EXCH = -1
831: GO TO 60
832: END
833: C XXXXXSSORT.f
834: SUBROUTINE SSORT(EX, X, LX, Q, L, OFFSET)
835: INTEGER EX, X(LX), Q(L), OFFSET
836: EXTERNAL EX
837: C
838: C ENTRIES SPACED 1 APART IN HASH TABLE
839: C EX IS EXCHANGE ROUTINE--RETURNS<0 IF EXCHANGES ITEMS
840: C RETURNS >=0 IF DOESN'T
841: C L IS NUMBER OF THINGS TO BE SORTED, SPACING IS 1 HERE
842: C START SHELL SORT
843: C
844: M = 1
845: 10 IF (M.GE.L) GO TO 20
846: M = M*2
847: GO TO 10
848: 20 M = M/2
849: IF (M.LT.1) RETURN
850: K = L - M
851: C
852: C IN PASS1 ARE SORTING SYMBOL TABLE
853: C IN PASS 2 ARE SORTING LATTICE
854: C OR COMMON BLOCK DEFS
855: C
856: DO 50 J=1,K
857: I = J
858: 30 IF (EX(I+M,I,X,LX,Q,L,OFFSET)) 40, 50, 50
859: C
860: C BUBBLE SORT W/I SUBLIST
861: C
862: 40 I = I - M
863: IF (I.GE.1) GO TO 30
864: 50 CONTINUE
865: GO TO 20
866: END
867: C XXXXXERROR1.f
868: SUBROUTINE ERROR1(MESS, LMESS)
869: C
870: INTEGER MESS(20), LMESS
871: INTEGER ZERO(1)
872: C
873: DATA ZERO(1) /0/
874: C
875: CALL ERROR2(MESS, LMESS, ZERO(1), ZERO(1), 1, 1)
876: C
877: RETURN
878: C
879: END
880: C XXXXXERROR2.f
881: SUBROUTINE ERROR2( I, JJ, K, NN, SPBEF, SPAFT )
882: C
883: C PRINTS ERROR MESSAGES AND SYMBOLIC NAME
884: C I IS PACKED HOLLERITH STRING
885: C JJ IS NUMBER OF CHARACTERS TO BE PRINTED ( N = JJ)
886: C K CONTAINS INTEGER OR HOLLERITH INFO TO FOLLOW MESSAGE
887: C NN CONTROLS TYPE OF LINE TO BE PRINTED
888: C
889: C NN = 0 MEANS PRINT MESSAGE
890: C
891: C NN < 0 MEANS IF JJ=0 NO MESSAGE, ELSE PRINT MESSAGE
892: C ON NEXT LINE IF NN = -1 PRINT PGM UNIT AND/OR STMT NO
893: C (CONTROLLED BY CONTENTS OF K).
894: C ON NEXT LINE IF NN = -2 PRINT PARAMETER NUMBER IN K
895: C NN = -3 USED FOR SPACING CONTROL IN LONG MESSAGES
896: C
897: C NN > 0 MEANS PRINT MESSAGE FOLLOWED BY IDENTIFIER IN K
898: C SPBEF, SPAFT CONTROL LINE SPACING BEFORE AND AFTER MESSAGE
899: C IF = 1, BLANK LINE EMMITTED
900: C
901: INTEGER I(1), J(80), OUTUT, PDSA, DSA, M(6), K(6), W
902: INTEGER SPBEF, SPAFT
903: LOGICAL OPT, P1ERR, P2, QBR
904: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
905: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, I1, I2, I3, I4
906: COMMON /FACTS/ NAME, NOST, ITYP, IASF
907: COMMON /OPTNS/ OPT(5), P1ERR
908: COMMON /PASS/ P2, QBR
909: DATA W /1HW/, KK /1H-/
910: C
911: C ERROR IN P.U. DURING PROCESSING OF A HEADING STMT, SPECIFI STMT,
912: C EQUIV STMT, OR DATA STMT CAUSES PASS 2 TO BE SUPPRESSED FOR THAT
913: C P.U.
914: C
915: IF (QBR) GOTO 45
916: IF(SPBEF.EQ.1) WRITE(OUTUT, 99998)
917: N = JJ
918: IF (N.GT.72) N = 72
919: J(2) = KK
920: IF (N.GE.1) CALL S5UNPK(I, J, N)
921: IF (ITYP.LT.14 .AND. J(2).NE.W) P1ERR = .TRUE.
922: IF (NN) 50, 10, 30
923: C
924: C NN=0
925: C
926: 10 CONTINUE
927: WRITE (OUTUT,99997) (J(L),L=1,N)
928: IF(P2 .OR. OPT(4)) GOTO 40
929: CALL S5UNPK(DSA(NAME+4), J(1), 6)
930: WRITE (OUTUT,99999) NOST, (J(L),L=1,6)
931: 99999 FORMAT (16H *** AT STMT NO , I6, 13H IN PGM UNIT , 6A1)
932: 99998 FORMAT(1H )
933: GO TO 40
934: C
935: C NN>0
936: C
937: 30 CONTINUE
938: IF (N.GT.68) N = 68
939: CALL S5UNPK(K, J(73), 6)
940: WRITE (OUTUT,99997) (J(L),L=1,N), KK, KK, (J(L),L=73,78)
941: 99997 FORMAT (4H ***, 76A1)
942: 40 IF(SPAFT.EQ.1) WRITE(OUTUT, 99998)
943: 45 RETURN
944: C
945: C NN<0
946: C
947: 50 CONTINUE
948: IF (N.GE.1) WRITE (OUTUT,99997) (J(L),L=1,N)
949: IF( -2.EQ.NN ) GOTO 70
950: IF( -3.EQ.NN ) GOTO 40
951: CALL S5UNPK(DSA(NAME+4), M(1), 6)
952: C WRITE OUT STMT NO AND/OR PGM UNIT
953: IF (K(1).EQ.0) GO TO 60
954: WRITE (OUTUT,99996) K(1), (M(L),L=1,6)
955: 99996 FORMAT (16H *** AT STMT NO , I6, 1X, 13H IN PGM UNIT , 6A1)
956: GO TO 40
957: 60 WRITE (OUTUT,99995) (M(L),L=1,6)
958: 99995 FORMAT (17H *** IN PGM UNIT , 6A1)
959: GO TO 40
960: C WRITE OUT PARAMETER NO FOR PARAMETERLIST ERRORS
961: 70 WRITE(OUTUT,99994) K(1)
962: 99994 FORMAT(22H *** PARAMETER NUMBER ,I6)
963: GOTO 40
964: END
965: C XXXXXARDECL.f
966: LOGICAL FUNCTION ARDECL(K2, KK)
967: C
968: C K2 IS INDEX OF END OF ARRAY DECLARATOR IN STMT
969: C KK IS SYMBOL TABLE INDEX FOR THIS ARRAY
970: C PROCESSES ARRAY DECLARATOR AND DECLARATOR CONSTRUCTS.
971: C CAN EXPECT ARRAY DECLARATOR, ARRAY ELEMENT; ARRAY, VARIABLE.
972: C ENTERS INTO SYMBOL TABLE AND TYPES ID; SETS USAGE ON ARRAY
973: C DECLARATOR
974: C CHECKS SYNTAX OF BOUNDS; IF VARIABLY DIMENSIONED, BOUNDS
975: C VARIABLE AND ARRAY ITSELF MUST BE DUMMY ARGUMENTS.
976: C ACCUMULATES TOTAL LENGTH OF ARRAY WITH CONSTANT BOUNDS AND STORES
977: C IT OFF ARRAY SYMBOL TABLE ENTRY. -1 LENGTH INDICATES VARIABLE
978: C DIMENSION
979: C CALLED BY DIMENSION, TYPE, COMMON, EQUIVALENCE, DATA STMT.
980: C
981: C ARRY IS TRUE FOR ARRAY ELEMENTS/ARRAY DECLARATORS
982: C FALSE FOR ARRAYS AND VARIABLES
983: C CORNER IS TRUE FOR ARRAY ELEMENTS WITH (1,1,1)--NEEDED IN EQUIV.
984: C STMT ; IF SUCH AN ELEMENT IS RECOGNIZED KK IS SENT AS ITS
985: C NEGATIVE.
986: C
987: LOGICAL ERR, SYSERR, ABORT, TOKPNO, VAR, CORNER, ARRY, FLUSH
988: INTEGER STMT, PSTMT, PDSA, BNEXT, SYMHD, DSA
989: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
990: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
991: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
992: COMMON /FACTS/ NAME, NOST, ITYP, IASF
993: COMMON /DETECT/ ERR, SYSERR, ABORT
994: ERR = .FALSE.
995: FLUSH = .FALSE.
996: ARRY = .FALSE.
997: CORNER = .TRUE.
998: ARDECL = .FALSE.
999: C
1000: C CHECK NAME; CAN'T HAVE BEEN USED PREVIOUSLY AS A NONVAR;
1001: C CHECK TO SEE IF HAVE ARRAY ELEMENT/ARRAY DECLARATOR. IF SO
1002: C ARRY=.TRUE.
1003: C
1004: ICNT = 0
1005: CALL NEXTOK(PSTMT, K2, I1)
1006: IF (I1.EQ.0) GO TO 10
1007: CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
1008: ERR = .TRUE.
1009: GO TO 280
1010: 10 IF (STMT(K2).EQ.65) ARRY = .TRUE.
1011: KK = LOOKUP(K2,.FALSE.)
1012: IF (SYSERR) GO TO 70
1013: ARDECL = .TRUE.
1014: L = IGATT1(KK,8)
1015: IF (L.EQ.0 .OR. L.EQ.10) GO TO 30
1016: IF (ITYP.LT.6 .AND. L.EQ.13) GO TO 30
1017: 20 CALL ERROR1(45H ILLEGAL USE OF PREVIOUSLY DEFINED IDENTIFIER, 45)
1018: ERR = .TRUE.
1019: GO TO 280
1020: C
1021: C SET TYPE (EXPLICITLY FOR TYPE STMTS)
1022: C
1023: 30 I1 = IGATT1(KK,1)
1024: IF (ITYP.GE.6) GO TO 50
1025: C
1026: C TYPE EXPLICITLY
1027: C
1028: IF (I1.GE.8) GO TO 40
1029: CALL SATT1(KK, 1, ITYP+7)
1030: GO TO 60
1031: 40 CALL ERROR1(34H IDENTIFIER TYPED EXPLICITLY TWICE, 34)
1032: GO TO 60
1033: C
1034: C TYPE IMPLICITLY
1035: C
1036: 50 IF (I1.GT.0) GO TO 60
1037: I1 = 1
1038: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
1039: CALL SATT1(KK, 1, I1)
1040: C
1041: C IF NOT ARRAY ELEMENT/ARAY DECLARATOR--RECOGNITION COMPLETE
1042: C
1043: C CHECK NOT A DUMMY ARG IN COMMON, DATA, EQUIV STMT
1044: C
1045: 60 IF (ARRY) GO TO 80
1046: IF (IGATT1(KK,7).EQ.0) GO TO 65
1047: IF (ITYP.EQ.12)
1048: 1 CALL ERROR1(46H WARNING - ILLEGAL USE OF ARRAY IN EQUIVALENCE
1049: 2 , 46)
1050: IF (ITYP.EQ.13)
1051: 1 CALL ERROR1(39H WARNING - ILLEGAL USE OF ARRAY IN DATA, 39)
1052: 65 CONTINUE
1053: I1 = IGATT1(KK,4)
1054: IF (.NOT.(I1.EQ.1 .AND. (ITYP.EQ.8 .OR. ITYP.EQ.12 .OR.
1055: * ITYP.EQ.13))) GO TO 70
1056: ERR = .TRUE.
1057: CALL ERROR1(32H ILLEGAL USAGE OF DUMMY ARGUMENT, 32)
1058: 70 RETURN
1059: 80 ISIZ = 1
1060: VAR = .FALSE.
1061: IF (L.EQ.0) CALL SATT1(KK, 8, 10)
1062: C
1063: C LOOP TO FIND BOUNDS; CHECK THAT VARIABLE BOUNDS ARE DUMMY ARGS
1064: C SET ADJUSTIBLE DIMENSION VARIABLE BIT; SET TYPE IMPLICITLY IF NOT
1065: C ALREADY SET
1066: C ACCUMULATE LENGTH IF IN DIMENSION, COMMON, OR TYPE STMT.
1067: C CHECK FOR REPEAT DIMENSIONING IN THOSE STMTS
1068: C
1069: L = IGATT1(KK,7)
1070: IF (ITYP.EQ.13 .OR. ITYP.EQ.12) GO TO 90
1071: IF (L.EQ.0) GO TO 100
1072: CALL ERROR1(44H ILLEGAL USE OF PREVIOUSLY DIMENSIONED ARRAY, 44)
1073: ERR = .TRUE.
1074: GO TO 270
1075: 90 IF (L.EQ.0) CALL ERROR1(
1076: * 44H ILLEGAL USE OF ARRAY NOT PREVIOUSLY DEFINED, 44)
1077: 100 IF (K2+1.LT.NSTMT) GO TO 120
1078: 110 CALL ERROR1(28H ILLEGAL ARRAY BOUNDS SYNTAX, 28)
1079: GO TO 270
1080: C
1081: C CHECK FOR POSITIVE INTEGER BOUND
1082: C
1083: 120 PSTMT = K2 + 1
1084: IF (.NOT.TOKPNO(PSTMT,I1,LL)) GO TO 130
1085: IF (ITYP.EQ.7 .OR. ITYP.EQ.8 .OR. ITYP.LT.6) ISIZ = ISIZ*LL
1086: IF (ITYP.NE.12) GO TO 170
1087: IF (I1-K2.NE.2 .OR. STMT(PSTMT).NE.1) CORNER = .FALSE.
1088: GO TO 170
1089: C
1090: C SEEK A VARIABLE BOUND
1091: C
1092: 130 CALL NEXTOK(PSTMT, I1, L)
1093: IF (L.NE.0) GO TO 110
1094: IF (ITYP.LT.6 .OR. ITYP.EQ.7) GO TO 140
1095: CALL ERROR1(32H VARIABLE DIMENSION ILLEGAL HERE, 32)
1096: ERR = .TRUE.
1097: GO TO 270
1098: 140 VAR = .TRUE.
1099: L = LOOKUP(I1,.FALSE.)
1100: IF (SYSERR) GO TO 70
1101: N = IGATT1(L,8)
1102: IF (N.NE.0 .AND. N.NE.10) GO TO 20
1103: I2 = IGATT1(L,4)
1104: IF (I2.EQ.1) GO TO 150
1105: CALL ERROR1(42H ILLEGAL USAGE OF VARIABLE IN ARRAY BOUNDS, 42)
1106: ERR = .TRUE.
1107: GO TO 270
1108: 150 I2 = IGATT1(KK,4)
1109: IF (I2.EQ.1) GO TO 160
1110: CALL ERROR1(50H VARIABLY DIMENSIONED ARRAY MUST BE DUMMY ARGUMENT,
1111: * 50)
1112: ERR = .TRUE.
1113: GO TO 270
1114: 160 CALL SATT1(L, 6, 1)
1115: CALL SATT1(L, 8, 10)
1116: N = IGATT1(L,1)
1117: IF (N.GT.0) GO TO 170
1118: N = 1
1119: IF (STMT(K2+1).GE.38 .AND. STMT(K2+1).LE.43) N = 2
1120: CALL SATT1(L, 1, N)
1121: GO TO 170
1122: C
1123: C FIND "," AND ACCUMULATE LENGTH
1124: C
1125: 170 ICNT = ICNT + 1
1126: IF (ICNT.LE.3) GO TO 180
1127: ISIZ = ISIZ/LL
1128: CALL ERROR1(30H WARNING - TOO MANY SUBSCRIPTS, 30)
1129: ICNT = 3
1130: FLUSH = .TRUE.
1131: GO TO 190
1132: 180 K2 = I1
1133: IF (STMT(K2).EQ.68) GO TO 100
1134: C
1135: C FIND ")" STORE LENGTH OR -1 INTO ARRAY SYMBOL TABLE ELEMENT
1136: C
1137: IF (STMT(K2).NE.62) GO TO 110
1138: 190 IF (ITYP.EQ.13 .OR. ITYP.EQ.12) GO TO 260
1139: CALL SATT1(KK, 7, ICNT)
1140: C
1141: C STORE LENGTH OF ARRAY
1142: C
1143: IF (VAR) GO TO 240
1144: IF (DSA(KK+2).EQ.0) GO TO 200
1145: N = DSA(KK+2)
1146: DSA(N) = ISIZ
1147: GO TO 220
1148: 200 IF (NEXT+2.GE.BNEXT) GO TO 210
1149: DSA(KK+2) = NEXT
1150: DSA(NEXT) = ISIZ
1151: DSA(NEXT+1) = 0
1152: NEXT = NEXT + 2
1153: GO TO 220
1154: 210 SYSERR = .TRUE.
1155: CALL ERROR1(33H IN ARDECL, TABLE OVERFLOW OF DSA,33)
1156: 220 IF (FLUSH) GO TO 270
1157: 230 K2 = K2 + 1
1158: GO TO 70
1159: C
1160: C FIXUP FOR VARIABLY DIMENSIONED ARRAYS
1161: C
1162: 240 IF (DSA(KK+2).EQ.0) GO TO 250
1163: N = DSA(KK+2)
1164: DSA(N) = -1
1165: GO TO 220
1166: 250 IF (NEXT+2.GE.BNEXT) GO TO 210
1167: DSA(KK+2) = NEXT
1168: DSA(NEXT) = -1
1169: DSA(NEXT+1) = 0
1170: NEXT = NEXT + 2
1171: GO TO 220
1172: C
1173: C CHECK FORCORNER ELEMENT IN EQUIVALENCE STMT
1174: C
1175: 260 IF (ITYP.NE.12) GO TO 220
1176: IF (CORNER) KK = -KK
1177: GO TO 220
1178: C
1179: C CODE TO FLUSH CONSTRUCT--TO NEXT ")"
1180: C
1181: 270 IF (K2.EQ.NSTMT) GO TO 70
1182: IF (STMT(K2).EQ.62) GO TO 230
1183: K2 = K2 + 1
1184: GO TO 270
1185: C
1186: C CODE TO FLUSH TO NEXT CONSTRUCT ")",",", "/"
1187: C
1188: 280 K = 90
1189: IF (ITYP.EQ.8 .OR. ITYP.EQ.13) K = 67
1190: 290 IF (K2.EQ.NSTMT) GO TO 70
1191: L = STMT(K2)
1192: IF (L.EQ.65) GO TO 270
1193: IF (L.EQ.68 .OR. L.EQ.K) GO TO 70
1194: K2 = K2 + 1
1195: GO TO 290
1196: END
1197: C XXXXXASSASF.f
1198: SUBROUTINE ASSASF(IGP)
1199: INTEGER STMT, PSTMT, PDSA, EXPR, DSA, BNEXT, SYMHD
1200: LOGICAL ERR, SYSERR, ABORT, ASF, DOVAR
1201: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1202: COMMON /DETECT/ ERR, SYSERR, ABORT
1203: COMMON /FACTS/ NAME, NOST, ITYP, IASF
1204: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
1205: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
1206: C
1207: C PROCESSES ARITHMETIC STMT FCNS AND ASSIGNMENT STMTS
1208: C FIRST LOOKS FOR ELEMENT ON RHS. AND TYPES IT
1209: C
1210: CALL NEXTOK(PSTMT, K2, K)
1211: ASF = .FALSE.
1212: IF (K.NE.0) GO TO 180
1213: K = LOOKUP(K2,.FALSE.)
1214: IF (SYSERR) GO TO 190
1215: I1 = IGATT1(K,1)
1216: IF (I1.NE.0) GO TO 10
1217: I1 = 1
1218: IF (STMT(PSTMT).LE.43 .AND. STMT(PSTMT).GE.38) I1 = 2
1219: CALL SATT1(K, 1, I1)
1220: C
1221: C LOOK FOR A "(" ; FIND ARRAY = CASE AND SEND IT TO ERROR
1222: C FIND ARRAY ELEMENT = , ID = CASES AND SEND THEM TO
1223: C ASSIGNMENT CODE
1224: C
1225: 10 I2 = IGATT1(K,7)
1226: I1 = MOD(I1,8)
1227: IF (STMT(K2).NE.65 .AND. I2.NE.0) GO TO 180
1228: IF (STMT(K2).NE.65 .OR. I2.NE.0) GO TO 240
1229: C
1230: C ASF DEFN
1231: C
1232: ITYP = 31
1233: ASF = .TRUE.
1234: IGP = 4
1235: NUM = 0
1236: IASF = K
1237: 20 PSTMT = K2 + 1
1238: IF (PSTMT.GE.NSTMT) GO TO 180
1239: C
1240: C ASF HAS LIST OF SCALAR VARIABLES; THEY ARE TYPED AND USAGE SET
1241: C
1242: CALL NEXTOK(PSTMT, K2, I)
1243: IF (I.EQ.0) GO TO 30
1244: CALL ERROR1(17H ILLEGAL ASF DEFN, 17)
1245: GO TO 190
1246: 30 I = LOOKUP(K2,.FALSE.)
1247: IF (SYSERR) GO TO 190
1248: NUM = NUM + 1
1249: I2 = IGATT1(I,1)
1250: IF (I2.GT.0) GO TO 40
1251: I2 = 1
1252: IF (STMT(PSTMT).LE.43 .AND. STMT(PSTMT).GE.38) I2 = 2
1253: CALL SATT1(I, 1, I2)
1254: 40 I2 = IGATT1(I,8)
1255: IF (I2.EQ.0) GO TO 50
1256: IF (I2.EQ.1) GO TO 60
1257: CALL ERROR1(29H ILLEGAL VARIABLE IN ASF DEFN, 29)
1258: GO TO 210
1259: 50 CALL SATT1(I, 8, 1)
1260: C STORE PTR TO CURRENT ASF-FCN ENTRY IN SYMBOL
1261: C TABLE IN 3D WORD OF ASF-DUMMY ENTRY IN SYM TABLE
1262: 60 DSA(I+2) = K
1263: C
1264: C LIST OF INDICES OF ASF ARGS IS HUNG OFF OF ASF DEF IN DSA
1265: C
1266: IF (DSA(K+2).EQ.0) GO TO 120
1267: L = DSA(K+2)
1268: 70 IF (DSA(L+1).EQ.0) GO TO 80
1269: L = DSA(L+1)
1270: GO TO 70
1271: 80 IF (NEXT+2.LT.BNEXT) GO TO 100
1272: 90 CALL ERROR1(33H IN ASSASF, TABLE OVERFLOW OF DSA, 33)
1273: SYSERR = .TRUE.
1274: GO TO 190
1275: 100 DSA(L+1) = NEXT
1276: 110 DSA(NEXT) = I
1277: DSA(NEXT+1) = 0
1278: NEXT = NEXT + 2
1279: GO TO 130
1280: 120 IF (NEXT+2.GE.BNEXT) GO TO 90
1281: DSA(K+2) = NEXT
1282: GO TO 110
1283: 130 IF (STMT(K2).NE.62) GO TO 170
1284: C
1285: C CHECK FOR TWO ELEMENTS ONLIST BEING THE SAME ID
1286: C
1287: I2 = DSA(K+2)
1288: DO 160 I=1,NUM
1289: L = DSA(K+2)
1290: DO 150 J=1,NUM
1291: IF (I.EQ.J) GO TO 140
1292: IF (DSA(L).NE.DSA(I2)) GO TO 140
1293: CALL ERROR1(18H ILLEGAL ASF-DUMMY, 18)
1294: CALL SATT1(K, 8, 0)
1295: GO TO 190
1296: 140 L = DSA(L+1)
1297: 150 CONTINUE
1298: I2 = DSA(I2+1)
1299: 160 CONTINUE
1300: GO TO 200
1301: 170 IF (STMT(K2).EQ.68) GO TO 20
1302: 180 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
1303: 190 RETURN
1304: C
1305: C = AND EXPR CHECK
1306: C
1307: 200 PSTMT = K2 + 1
1308: 210 IF (PSTMT.GE.NSTMT) GO TO 180
1309: IF (STMT(PSTMT).NE.63) GO TO 180
1310: PSTMT = PSTMT + 1
1311: IF (PSTMT.GE.NSTMT) GO TO 180
1312: L = EXPR(I)
1313: IF (SYSERR) GO TO 190
1314: C
1315: C CHECK THAT ASF WAS NOT DEFINED RECURSIVELY, SET USAGE
1316: C
1317: IF (.NOT.ASF) GO TO 230
1318: I2 = IGATT1(K,8)
1319: IF (I2.EQ.0) GO TO 220
1320: CALL ERROR1(17H ILLEGAL ASF NAME, 17)
1321: GO TO 190
1322: 220 CALL SATT1(K, 8, 2)
1323: 230 IF (L/8.EQ.1) GO TO 280
1324: L = MOD(L,8)
1325: C
1326: C COMPARE TYPES OF RHS AND LHS
1327: C
1328: IF ((L.EQ.3 .AND. I1.EQ.3) .OR. (L.EQ.4 .AND. I1.EQ.4) .OR.
1329: * (L.LE.2 .AND. I1.LE.2) .OR. (L.EQ.5 .AND. I1.EQ.5)) GO TO 190
1330: IF (.NOT.(L.EQ.2 .AND. I1.EQ.5 .OR. L.EQ.5 .AND. I1.EQ.2)) CALL
1331: * ERROR1(38H INCOMPATIBLE DATA TYPES IN ASSIGNMENT, 38)
1332: GO TO 190
1333: C
1334: C PROCESSING FOR ASSIGNMENT STMT
1335: C
1336: 240 I = IGATT1(K,8)
1337: IF (I.NE.0) GO TO 250
1338: I = 10
1339: CALL SATT1(K, 8, 10)
1340: 250 IF (I.EQ.10 .OR. (I.EQ.4 .AND. K.EQ.NAME)) GO TO 260
1341: CALL ERROR1(31H CANNOT ASSIGN VALUE TO THIS ID, 31)
1342: GO TO 190
1343: 260 CALL SATT1(K, 5, 1)
1344: IF (STMT(K2).EQ.65) GO TO 270
1345: IF (DOVAR(K)) CALL ERROR1(
1346: * 57H ILLEGAL TO CHANGE VALUE OF CONTROL VARIABLE OR DO LIMITS,
1347: * 57)
1348: PSTMT = K2
1349: GO TO 210
1350: 270 PSTMT = K2 + 1
1351: IF (PSTMT.GE.NSTMT) GO TO 180
1352: CALL SUBS(I, I2)
1353: C
1354: C PEEL SUBSCRIPTS OFF
1355: C
1356: IF (SYSERR .OR. ERR) GO TO 190
1357: PSTMT = I
1358: GO TO 210
1359: 280 CALL ERROR1(30H ILLEGAL USE OF ARRAY VARIABLE, 30)
1360: GO TO 190
1361: END
1362: C XXXXXASSIGN.f
1363: SUBROUTINE ASSIGN
1364: INTEGER PSTMT, STMT
1365: LOGICAL TOKLAB, ERR, SYSERR, ABORT
1366: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1367: COMMON /DETECT/ ERR, SYSERR, ABORT
1368: C
1369: C PROCESSES AN ASSIGN STMT: ASSIGN <LABEL> TO <VAR>
1370: C
1371: IF (PSTMT.GE.NSTMT) GO TO 10
1372: IF (.NOT.TOKLAB(1,K2,KK,.FALSE.)) GO TO 80
1373: IF (SYSERR) GO TO 20
1374: PSTMT = K2
1375: IF (PSTMT+2.GE.NSTMT) GO TO 10
1376: IF (STMT(PSTMT).EQ.49 .AND. STMT(PSTMT+1).EQ.44) GO TO 30
1377: 10 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
1378: 20 RETURN
1379: 30 PSTMT = PSTMT + 2
1380: IF (PSTMT.GE.NSTMT) GO TO 10
1381: CALL NEXTOK(PSTMT, K2, K)
1382: IF (K.NE.0) GO TO 10
1383: K = LOOKUP(K2,.FALSE.)
1384: IF (SYSERR) GO TO 20
1385: I1 = IGATT1(K,1)
1386: I2 = IGATT1(K,7)
1387: I3 = IGATT1(K,8)
1388: IF (I3.EQ.0) GO TO 40
1389: IF (I3.NE.8) GO TO 90
1390: GO TO 50
1391: 40 CALL SATT1(K, 8, 8)
1392: 50 IF (I1.NE.0) GO TO 60
1393: I1 = 1
1394: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
1395: CALL SATT1(K, 1, I1)
1396: 60 IF (MOD(I1,8).EQ.2 .AND. I2.EQ.0) GO TO 70
1397: CALL ERROR1(35H ASSIGN VARIABLE NOT INTEGER SCALAR, 35)
1398: GO TO 20
1399: 70 IF (K2.NE.NSTMT) GO TO 10
1400: GO TO 20
1401: 80 CALL ERROR1(14H MISSING LABEL, 14)
1402: GO TO 20
1403: 90 CALL ERROR1(23H ILLEGAL VARIABLE USAGE, 23)
1404: GO TO 20
1405: END
1406: C XXXXXCOMMON.f
1407: SUBROUTINE COMMON
1408: INTEGER PSTMT, PDSA, STMT, DSA, BNEXT, SYMHD, S(4)
1409: LOGICAL ERR, SYSERR, ABORT, ARDECL
1410: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1411: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
1412: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
1413: COMMON /DETECT/ ERR, SYSERR, ABORT
1414: COMMON /FACTS/ NAME, NOST, ITYP, IASF
1415: DATA S(1) /66/, S(2) /32/, S(3) /44/, S(4) /42/
1416: C
1417: C PROCESSES A COMMON STMT
1418: C FIRST, PEEL OFF NAME OF COMMON AND SET SYMBOL TABLE ENTRY USAGE
1419: C CHECK NAME HAS NOT APPEARED BEFORE IN PGM UNIT
1420: C
1421: IF (STMT(PSTMT).EQ.67) GO TO 30
1422: C
1423: C SET SYMBOL TABLE ENTRY FOR BLANK COMMON
1424: C
1425: 10 I1 = IGATT1(NAME,8)
1426: IF (I1.EQ.11) GO TO 170
1427: IF (PSTMT.GE.NSTMT) GO TO 200
1428: L = PSTMT
1429: DO 20 I1=1,4
1430: STMT(I1) = S(I1)
1431: 20 CONTINUE
1432: PSTMT = 1
1433: KK = LOOKUP(5,.FALSE.)
1434: IF (SYSERR) GO TO 190
1435: PSTMT = L
1436: CALL SATT1(KK, 8, 7)
1437: GO TO 60
1438: 30 PSTMT = PSTMT + 1
1439: IF (STMT(PSTMT).NE.67) GO TO 40
1440: PSTMT = PSTMT + 1
1441: GO TO 10
1442: 40 IF (PSTMT.GE.NSTMT) GO TO 200
1443: CALL NEXTOK(PSTMT, K2, L)
1444: IF (L.NE.0) GO TO 200
1445: KK = LOOKUP(K2,.FALSE.)
1446: IF (SYSERR) GO TO 190
1447: I1 = IGATT1(KK,1)
1448: N = IGATT1(KK,8)
1449: IF (I1.EQ.0 .AND. (N.EQ.0 .OR. N.EQ.7)) GO TO 50
1450: CALL ERROR1(20H ILLEGAL COMMON NAME, 20)
1451: GO TO 190
1452: 50 CALL SATT1(KK, 8, 7)
1453: I1 = IGATT1(NAME,8)
1454: IF (I1.EQ.11) CALL SATT1(KK, 2, 1)
1455: PSTMT = K2 + 1
1456: IF (PSTMT.GE.NSTMT .OR. STMT(K2).NE.67) GO TO 200
1457: C
1458: C ELEMENTS IN COMMON: ARRAYS,VARIABLES,DECLARATIONS OF ARRAYS( NOT
1459: C VARIABLY DIMENSIONED). IMPLICITLY TYPE THEM
1460: C
1461: 60 IF (ARDECL(K2,N)) GO TO 70
1462: CALL ERROR1(47H COMMON ELEMENT NOT VARIABLE, ARRAY, DECLARATOR,
1463: * 47)
1464: GO TO 190
1465: 70 IF (SYSERR .OR. ERR) GO TO 190
1466: C
1467: C SET SYMBOL TABLE ENTRY OF ELEMENT TO SHOW ITS IN COMMON
1468: C PUT POINTER TO COMMON NAME INTO 3D WORD OF ENTRY (OR OFF 3D
1469: C WORD--FOR ARRAYS
1470: C
1471: I1 = IGATT1(N,2)
1472: IF (I1.NE.0) GO TO 160
1473: CALL SATT1(N, 2, 1)
1474: I1 = IGATT1(N,7)
1475: IF (I1.EQ.0) GO TO 80
1476: L = DSA(N+2)
1477: DSA(L+1) = KK
1478: GO TO 90
1479: 80 CALL SATT1(N, 8, 10)
1480: IF (NEXT+2.GE.BNEXT) GO TO 180
1481: DSA(N+2) = NEXT
1482: DSA(NEXT) = 0
1483: DSA(NEXT+1) = KK
1484: NEXT = NEXT + 2
1485: C
1486: C SETUP CHAIN OF ELEMENTS OF COMMON HANGING OFF SYMBOL TABLE
1487: C ENTRY OF COMMON NAME
1488: C
1489: 90 IF (DSA(KK+2).EQ.0) GO TO 130
1490: L = DSA(KK+2)
1491: 100 IF (DSA(L+1).EQ.0) GO TO 110
1492: L = DSA(L+1)
1493: GO TO 100
1494: 110 IF (NEXT+2.GE.BNEXT) GO TO 180
1495: DSA(L+1) = NEXT
1496: 120 DSA(NEXT) = N
1497: DSA(NEXT+1) = 0
1498: NEXT = NEXT + 2
1499: GO TO 140
1500: 130 IF (NEXT+2.GE.BNEXT) GO TO 180
1501: DSA(KK+2) = NEXT
1502: GO TO 120
1503: C
1504: C CHECK FOR END OF STMT
1505: C
1506: 140 IF (K2.EQ.NSTMT) GO TO 190
1507: IF (STMT(K2).NE.68) GO TO 150
1508: PSTMT = K2 + 1
1509: GO TO 60
1510: 150 IF (STMT(K2).NE.67) GO TO 200
1511: PSTMT = K2
1512: GO TO 30
1513: 160 CALL ERROR1(23H ELEMENT IN TWO COMMONS, 23)
1514: GO TO 140
1515: 170 CALL ERROR1(
1516: * 51H BLANK COMMON NOT ALLOWED IN BLOCK DATA SUBPROGRAMS, 51)
1517: GO TO 190
1518: 180 SYSERR = .TRUE.
1519: CALL ERROR1(33H IN COMMON, TABLE OVERFLOW OF DSA,33)
1520: 190 RETURN
1521: 200 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
1522: GO TO 190
1523: END
1524: C XXXXXDIMENS.f
1525: SUBROUTINE DIMENS
1526: C
1527: C PROCESSES DIMENSION STMT, RECORDING OF ARRAY BOUNDS, LENGTH
1528: C ETC. DONE IN ORDER
1529: C
1530: INTEGER STMT, PSTMT
1531: LOGICAL ERR, SYSERR, ABORT, ARDECL
1532: COMMON /DETECT/ ERR, SYSERR, ABORT
1533: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1534: 10 IF (ARDECL(K2,K3)) GO TO 20
1535: CALL ERROR1(35H ILLEGAL SYNTAX OF ARRAY DECLARATOR, 35)
1536: GO TO 40
1537: 20 IF (SYSERR) RETURN
1538: IF (K2.EQ.NSTMT) GO TO 40
1539: IF (STMT(K2).EQ.68 .AND. K2+1.NE.NSTMT) GO TO 30
1540: CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
1541: GO TO 40
1542: 30 PSTMT = K2 + 1
1543: GO TO 10
1544: 40 RETURN
1545: END
1546: C XXXXXDOCHK.f
1547: SUBROUTINE DOCHK(KK)
1548: INTEGER DOLIST, DOPT, OUTUT, SYMLEN, OUTUT2, DSA, PDSA, OUTUT3,
1549: * STACK, OUTUT4
1550: COMMON /DOS/ DOPT, LDO, DOLIST(192)
1551: COMMON /CEXPRS/ LSTACK, STACK(620)
1552: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
1553: * OUTUT4
1554: COMMON /FACTS/ NAME, NOST, ITYP, IASF
1555: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
1556: C
1557: C KK IS SYMBOL TABLE ENTRY OF LABEL
1558: C ROUTINE CHECKS ALL LABELS FOR BEING END OF DO-STMTS; IF LABEL IS
1559: C END-OF-DO, ALL LABELS WITHIN THAT DO, HAVE END-OF-DEFN STMT NO
1560: C RECORDED IN THEM; DOPT IS DECREMENTED, A MOCK END-OF-DO IS
1561: C CREATED BY THE END STMT IN THE PGM UNIT; DOLIST MUST BE EMPTY
1562: C AFTER THIS PROCESSING OF AN END,
1563: C PERFORMS FIXUP ON SCOPE OF LABELS ENDING MULTIPLE NESTED DO'S
1564: C
1565: IF (ITYP.EQ.28) GO TO 50
1566: IF (DOLIST(DOPT+1).NE.KK) GO TO 40
1567: 10 CALL FIXLAB(.FALSE.)
1568: DOPT = DOPT - 6
1569: IF (ITYP.EQ.15 .OR. ITYP.EQ.16 .OR. (ITYP.GE.19 .AND.
1570: * ITYP.LE.22)) CALL ERROR1(26H ILLEGAL ENDING STMT ON DO, 26)
1571: IF (DOLIST(DOPT+1).NE.KK) GO TO 40
1572: C
1573: C GET REFERENCE TO NESTED DO ENDING AND MAKE REFERENCE
1574: C TO DO STATEMENT A NEGATIVE NUMBER
1575: C SO IT WON'T BE AN ILLEGAL BRANCH
1576: C
1577: K = DSA(KK+1)
1578: L = DOLIST(DOPT)
1579: 20 IF (DSA(K).EQ.L) GO TO 30
1580: K = DSA(K+1)
1581: GO TO 20
1582: 30 DSA(K) = -DSA(K)
1583: GO TO 10
1584: 40 RETURN
1585: 50 CALL FIXLAB(.TRUE.)
1586: IF (DOPT-6.LE.0) GO TO 40
1587: LL = 1
1588: L = DOPT/6
1589: DO 60 I=1,L
1590: J = DOPT + 7 - 6*I
1591: K = DOLIST(J)
1592: CALL S5UNPK(DSA(K+4), STACK(LL), 6)
1593: LL = LL + 6
1594: 60 CONTINUE
1595: LL = LL - 1
1596: IF (LL.LE.55) GO TO 70
1597: 99999 FORMAT (/25H MISSING DO ENDING LABEL , 55A1)
1598: WRITE (OUTUT,99999) (STACK(L),L=1,55)
1599: WRITE (OUTUT,99998) (STACK(L),L=56,LL)
1600: GO TO 40
1601: 99998 FORMAT (25X, 55A1)
1602: 70 WRITE (OUTUT,99999) (STACK(L),L=1,LL)
1603: GO TO 40
1604: END
1605: C XXXXXDOSPEC.f
1606: SUBROUTINE DOSPEC(KK, K2, LOG)
1607: INTEGER STMT, PSTMT, DOPT, DOLIST, LOOKUP
1608: LOGICAL SYSERR, ABORT, DOVAR, ERR, TOKPNO, LOG
1609: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1610: COMMON /LISTDO/ LPT, LEN, LS(64)
1611: COMMON /DOS/ DOPT, LDO, DOLIST(192)
1612: COMMON /FACTS/ NAME, NOST, ITYP, IASF
1613: COMMON /DETECT/ ERR, SYSERR, ABORT
1614: C
1615: C ROUTINE RECOGNIZES DO-SPECIFICATION CONSTRUCT
1616: C DOLIST ARRAY IS DO STACK USED TO CHECK NESTING; 6 WORD ENTRY
1617: C WORD 1-CURRENT STMT NO
1618: C WORD 2-INDEX OF LABEL IN DSA
1619: C WORD 3-INDEX OF DO CONTROL VARIABLE IN DSA
1620: C WORD 4-6,-INDICES OF LIMITS IN DSA OR 0 FOR CONSTANT LIMITS
1621: C LS ARRAY IS IMPLICIT DO STACK- IN EACH ENTRY IS SAME DATA
1622: C AS WORDS 3-6 OF DOLIST ENTRIES.
1623: C
1624: IF (.NOT.LOG) GO TO 10
1625: IF (LPT.LE.1) GO TO 20
1626: LPT = LPT - 4
1627: LS(LPT) = 0
1628: LS(LPT+1) = 0
1629: LS(LPT+2) = 0
1630: LS(LPT+3) = 0
1631: GO TO 40
1632: 10 IF (DOPT.LE.LDO-11) GO TO 30
1633: 20 CALL ERROR1(20H DO NESTING TOO DEEP, 20)
1634: GO TO 190
1635: 30 DOPT = DOPT + 6
1636: DOLIST(DOPT) = NOST
1637: DOLIST(DOPT+1) = KK
1638: DOLIST(DOPT+2) = 0
1639: DOLIST(DOPT+3) = 0
1640: DOLIST(DOPT+4) = 0
1641: DOLIST(DOPT+5) = 0
1642: C
1643: C DO CONTROL VARIABLE MUST BE INTEGER, SCALAR VARIABLE
1644: C
1645: 40 IF (PSTMT.LT.NSTMT) GO TO 60
1646: 50 CALL ERROR1(35H ILLEGAL SYNTAX IN DO SPECIFICATION, 35)
1647: GO TO 190
1648: 60 CALL NEXTOK(PSTMT, K2, K)
1649: IF (K.NE.0) GO TO 50
1650: K = LOOKUP(K2,.FALSE.)
1651: IF (SYSERR) GO TO 180
1652: I1 = IGATT1(K,1)
1653: IF (I1.GT.0) GO TO 70
1654: I1 = 1
1655: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
1656: CALL SATT1(K, 1, I1)
1657: 70 I2 = IGATT1(K,7)
1658: I3 = IGATT1(K,8)
1659: IF (MOD(I1,8).NE.2 .OR. I2.NE.0) GO TO 220
1660: IF (I3.NE.0) GO TO 80
1661: I3 = 10
1662: CALL SATT1(K, 8, 10)
1663: 80 IF (I3.NE.10) GO TO 220
1664: CALL SATT1(K, 5, 1)
1665: IF (DOVAR(K)) CALL ERROR1(
1666: * 57H ILLEGAL TO CHANGE VALUE OF CONTROL VARIABLE OR DO LIMITS,
1667: * 57)
1668: I3 = IGATT1(K,2)
1669: IF (I3.EQ.1) CALL ERROR1(37H WARNING - CONTROL VARIABLE IN COMMON,
1670: * 37)
1671: IF (K.EQ.NAME) CALL ERROR1(
1672: * 49H WARNING - FUNCTION NAME USED AS CONTROL VARIABLE, 49)
1673: IF (.NOT.LOG) GO TO 90
1674: LS(LPT) = K
1675: GO TO 100
1676: 90 DOLIST(DOPT+2) = K
1677: C
1678: C FIND AN =
1679: C
1680: 100 IF (STMT(K2).NE.63) GO TO 50
1681: C
1682: C DO-LIMITS LIMS COUNTS NUMBER OF LIMITS; THESE MUST BE INTEGER
1683: C SCALAR VARIABLES OR POSITIVE INTEGER CONSTANTS
1684: C
1685: LIMS = 0
1686: 110 PSTMT = K2 + 1
1687: IF (PSTMT.GE.NSTMT) GO TO 50
1688: IF (.NOT.TOKPNO(PSTMT,K2,K)) GO TO 120
1689: LIMS = LIMS + 1
1690: GO TO 170
1691: 120 CALL NEXTOK(PSTMT, K2, K)
1692: IF (K.NE.0) GO TO 210
1693: K = LOOKUP(K2,.FALSE.)
1694: IF (SYSERR) GO TO 180
1695: LIMS = LIMS + 1
1696: IF (.NOT.LOG) GO TO 130
1697: IF (LS(LPT).EQ.K) CALL ERROR1(17H ILLEGAL DO LIMIT, 17)
1698: I1 = LPT + LIMS
1699: LS(I1) = K
1700: GO TO 140
1701: 130 IF (DOLIST(DOPT+2).EQ.K) CALL ERROR1(17H ILLEGAL DO LIMIT, 17)
1702: I1 = DOPT + 2 + LIMS
1703: DOLIST(I1) = K
1704: 140 I1 = IGATT1(K,1)
1705: I2 = IGATT1(K,7)
1706: I3 = IGATT1(K,8)
1707: IF (I3.NE.0) GO TO 150
1708: CALL SATT1(K, 8, 10)
1709: I3 = 10
1710: 150 IF (I3.NE.10) GO TO 50
1711: IF (I1.GT.0) GO TO 160
1712: I1 = 1
1713: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
1714: CALL SATT1(K, 1, I1)
1715: 160 IF (MOD(I1,8).NE.2 .OR. I2.NE.0) GO TO 210
1716: C
1717: C CHECK FOR END OF STMT
1718: C
1719: 170 IF (K2.LT.NSTMT .AND. STMT(K2).NE.62) GO TO 200
1720: C
1721: C IF THERE ARE NO MORE CHARS, WE ARE DONE WITH THIS STMT;
1722: C THERE MUST BE AT LEAST 2 AND NO MORE THAN 3 LIMITS IN DO
1723: C
1724: IF (LIMS.LE.1) GO TO 230
1725: 180 RETURN
1726: 190 ERR = .TRUE.
1727: GO TO 180
1728: C
1729: C CHECK FOR A "," MUST FIND HERE
1730: C
1731: 200 IF (STMT(K2).NE.68) GO TO 50
1732: IF (LIMS.GE.3) GO TO 230
1733: GO TO 110
1734: 210 CALL ERROR1(47H DO LIMIT NOT INTEGER SCALAR VAR OR POS INTEGER,
1735: * 47)
1736: GO TO 190
1737: 220 CALL ERROR1(36H CONTROL VARIABLE NOT INTEGER SCALAR, 36)
1738: GO TO 190
1739: 230 CALL ERROR1(18H ILLEGAL DO LIMITS, 18)
1740: GO TO 190
1741: END
1742: C XXXXXDOVAR.f
1743: LOGICAL FUNCTION DOVAR(INDX)
1744: INTEGER DOPT, DOLIST
1745: COMMON /DOS/ DOPT, LDO, DOLIST(192)
1746: C
1747: C CHECKS VAR AT DSA(INDX) NOT IN DOSTACK ALREADY
1748: C AS A LIMIT OR INDEX OF PREVIOUSLY DEFINED AND CURRENTLY
1749: C DEFINED DO
1750: C
1751: DOVAR = .FALSE.
1752: IF (DOPT) 40, 40, 10
1753: 10 DO 30 I=1,DOPT,6
1754: L1 = I + 2
1755: L2 = L1 + 3
1756: DO 20 K=L1,L2
1757: IF (DOLIST(K).EQ.INDX) GO TO 50
1758: 20 CONTINUE
1759: 30 CONTINUE
1760: 40 RETURN
1761: 50 DOVAR = .TRUE.
1762: GO TO 40
1763: END
1764: C XXXXXEQUIV.f
1765: SUBROUTINE EQUIV
1766: INTEGER STMT, PSTMT, PDSA, DSA, TYPE, STACK, BNEXT, SYMHD
1767: LOGICAL ARDECL, CORNR, SAME, ERR, SYSERR, ABORT
1768: COMMON /DETECT/ ERR, SYSERR, ABORT
1769: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1770: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
1771: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
1772: COMMON /CEXPRS/ LSTACK, STACK(620)
1773: C
1774: C PROCESSES AN EQUIVALENCE STMT-FINDS DECLARATORS SEPARATED BY ,
1775: C IF DIFFERENT TYPE VARIABLES INVOLVED, CHECKS FOR USE OF CORNER
1776: C ELEMENTS; ARDECL CALLED TO PROCESS DECLARATORS
1777: C SAME IS .TRUE. IF ALL ITEMS EQUIVALENCED IN ONE (--) ARE SAME TYPE
1778: C CORNR IS .TRUE. IF ALL ITEMS EQUIV. IN ONE (--) ARE CORNER ELES.
1779: C E.G. A(1,1,1)
1780: C
1781: 10 IF (STMT(PSTMT).EQ.65) GO TO 30
1782: 20 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
1783: GO TO 150
1784: 30 TYPE = -1
1785: IPT = 1
1786: CORNR = .TRUE.
1787: SAME = .TRUE.
1788: 40 PSTMT = PSTMT + 1
1789: IF (PSTMT.GE.NSTMT) GO TO 20
1790: IF (.NOT.ARDECL(K2,KK)) GO TO 150
1791: IF (SYSERR .OR. ERR) GO TO 150
1792: C
1793: C KK>= 0 FOR AN ARRAY ELEMENT MEANS IT WASN'T A CORNER ELEMENT
1794: C
1795: L = IGATT1(IABS(KK),7)
1796: IF (KK.GT.0 .AND. L.GT.0) CORNR = .FALSE.
1797: KK = IABS(KK)
1798: C
1799: C SET USAGE, IF UNSET
1800: C
1801: L = IGATT1(KK,8)
1802: IF (L.EQ.0) CALL SATT1(KK, 8, 10)
1803: C
1804: C STORE VARIABLE IN STACK, CHECK VARIABLE TYPE
1805: C
1806: STACK(IPT) = KK
1807: IPT = IPT + 1
1808: CALL SATT1(KK, 3, 1)
1809: I = IGATT1(KK,1)
1810: I = MOD(I,8)
1811: IF (-1.EQ.TYPE) TYPE = I
1812: IF (TYPE.EQ.I) GO TO 50
1813: SAME = .FALSE.
1814: C
1815: C END OF DELARATOR CHECKS; NEED , OR )
1816: C
1817: 50 IF (STMT(K2).NE.68) GO TO 60
1818: PSTMT = K2
1819: GO TO 40
1820: 60 IF (STMT(K2).NE.62) GO TO 20
1821: C
1822: C CHECK FOR CORNER ELEMENTS IF ARRAY ELEMENTS WERE USED
1823: C
1824: IF (.NOT.SAME .AND. .NOT.CORNR) CALL ERROR1(
1825: * 53H WARNING - USE CORNER ELEMENTS WHEN MIXING DATA TYPES, 53)
1826: C
1827: C CHECK FOR ELEMENTS IN COMMON; MAKE SURE ONLY ONE COMMON
1828: C REGION APPEARS
1829: C
1830: KK = IPT - 1
1831: C
1832: C PUT COMMON REGIONS OF EACH DECLARATOR (IF ANY) ON STACK
1833: C
1834: DO 80 I=1,KK
1835: L = IGATT1(STACK(I),2)
1836: IF (L) 80, 80, 70
1837: 70 IF(IPT+1.GT.LSTACK) GOTO 160
1838: L = STACK(I)
1839: L = DSA(L+2)
1840: STACK(IPT) = DSA(L+1)
1841: IPT = IPT + 1
1842: 80 CONTINUE
1843: IF (KK+2.GE.IPT) GO TO 90
1844: CALL ERROR1(40H EQUIVALENCE CONFLICTS WITH COMMON DEFNS, 40)
1845: GO TO 130
1846: 90 IF (KK+1.EQ.IPT) GO TO 130
1847: C
1848: C MARK ALL DECLARATORS IN EQUIV (--) AS IF IN COMMON BLOCK
1849: C THAT ANY ONE OF THEM IS ACTUALLY IN
1850: C
1851: DO 120 I=1,KK
1852: L = IGATT1(STACK(I),2)
1853: IF (L.EQ.1) GO TO 120
1854: CALL SATT1(STACK(I), 2, 1)
1855: L = STACK(I)
1856: IF (DSA(L+2)) 100, 100, 110
1857: 100 IF(NEXT+2.GE.BNEXT) GOTO 170
1858: DSA(L+2) = NEXT
1859: DSA(NEXT) = 0
1860: DSA(NEXT+1) = STACK(IPT-1)
1861: NEXT = NEXT + 2
1862: GO TO 120
1863: 110 L = DSA(L+2)
1864: DSA(L+1) = STACK(IPT-1)
1865: 120 CONTINUE
1866: 130 IF (K2+1.EQ.NSTMT) GO TO 150
1867: IF (STMT(K2+1).NE.68) GO TO 20
1868: PSTMT = K2 + 2
1869: GO TO 10
1870: 150 RETURN
1871: 160 CALL ERROR1(34H IN EQUIV, TABLE OVERFLOW OF STACK,34)
1872: 180 SYSERR = .TRUE.
1873: GOTO 150
1874: 170 CALL ERROR1(32H IN EQUIV, TABLE OVERFLOW OF DSA, 32)
1875: GOTO 180
1876: END
1877: C XXXXXEXTERN.f
1878: SUBROUTINE EXTERN
1879: LOGICAL ERR, SYSERR, ABORT
1880: LOGICAL BR, INTEXT
1881: INTEGER STMT, PSTMT
1882: COMMON /FACTS/ NAME, NOST, ITYP, IASF
1883: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1884: COMMON /DETECT/ ERR, SYSERR, ABORT
1885: C
1886: C PROCESS AN EXTERNAL STMT. CAUSES IDS TO BE MARKED AS EXTERNAL
1887: C PROCEDURES. ERROR OCCURS IF ID HAS PREVIOUSLY DEFINED INCONSISTANT
1888: C USAGE. EXTERNAL CAN'T APPEAR IN BLOCK DATA PGM UNIT.
1889: C
1890: L = IGATT1(NAME,8)
1891: IF (L.EQ.11) GO TO 60
1892: 10 CALL NEXTOK(PSTMT, K2, KK)
1893: IF (KK.EQ.0) GO TO 20
1894: CALL ERROR1(19H ILLEGAL IDENTIFIER, 19)
1895: GO TO 70
1896: 20 KK = LOOKUP(K2,.FALSE.)
1897: IF (SYSERR) RETURN
1898: L = IGATT1(KK,8)
1899: IF (L.EQ.0) GO TO 30
1900: CALL ERROR1(26H ILLEGAL USE OF IDENTIFIER, 26)
1901: GO TO 40
1902: 30 CALL SATT1(KK, 8, 13)
1903: C
1904: C CAUSE EXTERNAL BIT TO BE SET IF POSSIBLE BASIC EXTERNAL
1905: C
1906: 40 BR = INTEXT(KK,0,0,.FALSE.)
1907: IF (K2.EQ.NSTMT) GO TO 70
1908: IF (STMT(K2).NE.68) GO TO 50
1909: PSTMT = K2 + 1
1910: GO TO 10
1911: 50 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
1912: GO TO 70
1913: 60 CALL ERROR1(
1914: *60H ILLEGAL USAGE OF EXTERNAL STMT WITHIN BLOCK DATA SUBPROGRAM,
1915: * 60)
1916: 70 RETURN
1917: END
1918: C XXXXXFIXLAB.f
1919: SUBROUTINE FIXLAB(ND)
1920: C
1921: C ROUTINE SETS END-OF-DEF-STMT NO FOR LABELS
1922: C WHEN CALLED BY END STMT, FIXES ALL LABEL DEFS YET UNBOUND
1923: C TO THE END OF PGM STMT NO. WHEN CALLED BY DO STMT
1924: C FIXES UP ALL LABELS AT THE LEVEL OF THE CURRENT
1925: C DO TO END-OF-DO STMT NO; ND TRUE MEANS AN END STMT CALLED FIXLAB
1926: C
1927: LOGICAL ND
1928: INTEGER DOLIST, DOPT, BNEXT, SYMHD, DSA, PDSA
1929: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
1930: COMMON /DOS/ DOPT, LDO, DOLIST(192)
1931: COMMON /FACTS/ NAME, NOST, ITYP, IASF
1932: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
1933: LEV = -DOPT/6
1934: I = LABHD
1935: 10 IF (I.EQ.0) RETURN
1936: K = IGATT1(I,2)
1937: IF (K.NE.1) GO TO 30
1938: K = IGATT1(I,1)
1939: IF (K.NE.1) GO TO 30
1940: K = DSA(I+2)
1941: IF (ND) GO TO 20
1942: IF (DSA(K+1).EQ.LEV) DSA(K+1) = NOST
1943: GO TO 30
1944: 20 IF (DSA(K+1).LE.0) DSA(K+1) = NOST
1945: 30 I = DSA(I+3)
1946: GO TO 10
1947: END
1948: C XXXXXFORMAT.f
1949: SUBROUTINE FORMAT
1950: INTEGER STMT, PSTMT
1951: LOGICAL TOKPNO, SIGN, ERROR
1952: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
1953: C
1954: C ROUTINE PROCESSES FORMAT STMT
1955: C FORMAT (Q1 T1 Z1 T2 Z2 ... TN Q2)
1956: C Q1,Q2 ARE EMPTY OR ARE SEPARARTERS
1957: C T1,T2 ETC. ARE FORMAT-ITEMS
1958: C Z1,Z2, ETC. ARE SEPARATERS
1959: C CHECKS FOR <= 2 LEVELS OF PARENTHESES
1960: C
1961: ERROR = .FALSE.
1962: ICNT = 0
1963: C
1964: C "("
1965: C
1966: IF (STMT(PSTMT).EQ.65) GO TO 30
1967: 10 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
1968: C
1969: C SEARCH FOR FORMAT ITEMS
1970: C
1971: 20 RETURN
1972: 30 ICNT = ICNT + 1
1973: IF (ICNT.GT.2) CALL ERROR1(28H TOO MANY PARENTHESES LEVELS, 28)
1974: PSTMT = PSTMT + 1
1975: C
1976: C LOOK FOR Q1
1977: C
1978: CALL SEPAR(I)
1979: C TAKES CARE OF FORMAT()
1980: IF (STMT(PSTMT).EQ.62) GO TO 180
1981: IF (STMT(PSTMT-1).EQ.68) CALL ERROR1(25H ILLEGAL PUNCTUATION (, ,
1982: * 25)
1983: 40 IF (STMT(PSTMT).EQ.65) GO TO 30
1984: IF (PSTMT.GE.NSTMT) GO TO 10
1985: SIGN = .FALSE.
1986: C
1987: C SEARCH FOR REPEAT FACTER (POSITIVE INTEGER)
1988: C
1989: IF (TOKPNO(PSTMT,K2,N)) GO TO 70
1990: C
1991: C HOLLERITH STRINGS
1992: C
1993: IF (STMT(PSTMT).LT.0) GO TO 120
1994: C
1995: C "-" IN P SCALING FORMAT-ITEM
1996: C
1997: IF (STMT(PSTMT).NE.61) GO TO 50
1998: SIGN = .TRUE.
1999: PSTMT = PSTMT + 1
2000: 50 IF (PSTMT.GE.NSTMT) GO TO 10
2001: C
2002: C LOOK FOR <INT> IN PSCALING FORMAT-ITEM
2003: C P SCALING FORMAT-ITEM
2004: C ( - ) <INTEGER> P REPEAT (A,I,L) <WIDTH> . <INT>
2005: C
2006: CALL NEXTOK(PSTMT, K2, K)
2007: C
2008: C CHECK FOR USE OF "-" WITH NON P-SCALING CONSTRUCTS
2009: C
2010: IF (K.NE.1 .AND. SIGN) GO TO 100
2011: IF (K.EQ.1) GO TO 60
2012: N = STMT(PSTMT)
2013: GO TO 90
2014: 60 SIGN = .TRUE.
2015: PSTMT = K2
2016: N = STMT(PSTMT)
2017: GO TO 80
2018: C
2019: C LOOK FOR PART OF FORMAT-ITEM AFTER REPEAT FACTOR
2020: C
2021: 70 PSTMT = K2
2022: N = STMT(PSTMT)
2023: C
2024: C "("
2025: C
2026: IF (N.EQ.65) GO TO 30
2027: C
2028: C "X"
2029: C
2030: IF (N.EQ.53) GO TO 120
2031: C
2032: C "P"
2033: C
2034: 80 IF (N.EQ.45) GO TO 130
2035: IF (SIGN) GO TO 100
2036: C
2037: C A,I,L
2038: C
2039: 90 IF (N.EQ.30 .OR. N.EQ.38 .OR. N.EQ.41) GO TO 110
2040: C
2041: C D,E,F,G
2042: C
2043: IF (N.GE.33 .AND. N.LE.36) GO TO 150
2044: 100 CALL ERROR1(20H ILLEGAL FORMAT ITEM, 20)
2045: GO TO 20
2046: C
2047: C A,I,L FOUND. LOOK FOR <WIDTH>
2048: C
2049: 110 IF (PSTMT+1.GE.NSTMT) GO TO 10
2050: PSTMT = PSTMT + 1
2051: IF (.NOT.TOKPNO(PSTMT,K2,I)) GO TO 100
2052: IF (N.NE.30 .OR. I.EQ.1 .OR. ERROR) GO TO 160
2053: CALL ERROR1(48H WARNING - A FORMAT ITEM NOT PORTABLE FOR N.GT.1,
2054: * 48)
2055: ERROR = .TRUE.
2056: GO TO 160
2057: C
2058: C SKIP TO NEXT CHAR IN X OR HOLLERITH
2059: C
2060: 120 PSTMT = PSTMT + 1
2061: GO TO 170
2062: C
2063: C LOOK FOR CONSTRUCT FOLLOWING THE P. CAN BE A REPEAT
2064: C
2065: 130 IF (PSTMT+1.GE.NSTMT) GO TO 10
2066: PSTMT = PSTMT + 1
2067: IF (STMT(PSTMT).GT.9 .OR. STMT(PSTMT).LT.0) GO TO 140
2068: CALL NEXTOK(PSTMT, K2, K)
2069: IF (K.NE.1) GO TO 10
2070: PSTMT = K2
2071: C
2072: C AFTER D,E,F,G FIND <WIDTH> . <INT>
2073: C
2074: 140 IF (STMT(PSTMT).LT.33 .OR. STMT(PSTMT).GT.36) GO TO 10
2075: 150 IF (PSTMT+1.GE.NSTMT) GO TO 10
2076: PSTMT = PSTMT + 1
2077: IF (.NOT.TOKPNO(PSTMT,K2,N)) GO TO 100
2078: IF (STMT(K2).NE.64) GO TO 100
2079: IF (K2+1.GE.NSTMT) GO TO 10
2080: PSTMT = K2 + 1
2081: CALL NEXTOK(PSTMT, K2, K)
2082: IF (K.NE.1) GO TO 100
2083: 160 PSTMT = K2
2084: C
2085: C FINISHED A FORMAT-ITEM
2086: C LOOK FOR SEPARATER OR ")"
2087: C
2088: 170 IF (STMT(PSTMT).NE.62) GO TO 210
2089: 180 ICNT = ICNT - 1
2090: IF (ICNT.LT.0) GO TO 190
2091: IF (PSTMT+1.LT.NSTMT) GO TO 200
2092: IF (ICNT.EQ.0) GO TO 20
2093: 190 CALL ERROR1(28H ILLEGAL PARENTHESES NESTING, 28)
2094: GO TO 20
2095: 200 PSTMT = PSTMT + 1
2096: GO TO 170
2097: 210 CALL SEPAR(I)
2098: IF (I.EQ.0) CALL ERROR1(24H MISSING FIELD SEPARATOR, 24)
2099: IF (STMT(PSTMT).NE.62) GO TO 40
2100: IF (STMT(PSTMT-1).EQ.68) CALL ERROR1(25H ILLEGAL PUNCTUATION ,) ,
2101: * 25)
2102: GO TO 180
2103: END
2104: C XXXXXGETTOK.f
2105: INTEGER FUNCTION GETTOK(K1, K2)
2106: C
2107: C GETTOK FINDS NEXT TOKEN IN STMT(K1)-STMT(K2-1)
2108: C AND RETURNS A VALUE:
2109: C 0= DOUBLE PRECISION CONSTANT-
2110: C 2= INTEGER CONSTANT
2111: C 1= REAL CONSTANT-
2112: C 3= COMPLEX CONSTANT
2113: C 4= LOGICAL CONSTANT
2114: C 5= HOLLERITH CONSTANT
2115: C 6= ID
2116: C >10=OPERATOR (10+CODE FOR OPERATOR;HERE ARRAY AND FCN REFS ARE 16
2117: C
2118: INTEGER PSTMT, STMT
2119: LOGICAL ERR, SYSERR, ABORT, TOKLOP, TOKRL, TOKCOM, TOKLOG
2120: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2121: COMMON /DETECT/ ERR, SYSERR, ABORT
2122: 10 GETTOK = -1
2123: IF (.NOT.TOKRL(K1,K2,K)) GO TO 20
2124: GETTOK = 1
2125: IF (K.EQ.0) GETTOK = 0
2126: GO TO 40
2127: 20 CALL NEXTOK(K1, K2, K)
2128: K = K + 1
2129: GO TO (50, 30, 60, 70), K
2130: 30 GETTOK = 2
2131: 40 RETURN
2132: C
2133: C PROCESS ID, SEE IF ITS A FCN CALL OR ARRAY NAME
2134: C
2135: 50 GETTOK = 6
2136: IF (STMT(K2).NE.65) GO TO 40
2137: GETTOK = 16
2138: K2 = K2 + 1
2139: GO TO 40
2140: 60 GETTOK = 5
2141: GO TO 40
2142: 70 K = STMT(K1)
2143: IF (K.EQ.64) GO TO 100
2144: IF (K.EQ.65) GO TO 80
2145: IF (K.EQ.62) GETTOK = 12
2146: IF (K.EQ.68) GETTOK = 18
2147: IF (K.EQ.60 .OR. K.EQ.61) GETTOK = 11
2148: IF (K.EQ.66 .OR. K.EQ.67) GETTOK = 17
2149: IF (K2.EQ.K1+2) GETTOK = 13
2150: IF (GETTOK+1) 40, 120, 40
2151: 80 GETTOK = 15
2152: IF (TOKCOM(K1,K)) GO TO 90
2153: GO TO 40
2154: 90 GETTOK = 3
2155: K2 = K
2156: GO TO 40
2157: C
2158: C CHECK FOR LOGICAL CONSTANTS,OPERATORS
2159: C
2160: 100 IF (.NOT.TOKLOG(K1,K2)) GO TO 110
2161: GETTOK = 4
2162: GO TO 40
2163: 110 IF (.NOT.TOKLOP(K1,K2,K)) GO TO 120
2164: GETTOK = K
2165: GO TO 40
2166: 120 CALL ERROR1(26H ILLEGAL CHARACTER IGNORED, 26)
2167: IF (K1+1.GE.NSTMT) GO TO 130
2168: K1 = K1 + 1
2169: GO TO 10
2170: 130 ERR = .TRUE.
2171: RETURN
2172: END
2173: C XXXXXGOTO.f
2174: SUBROUTINE GOTO
2175: INTEGER STMT, PSTMT
2176: LOGICAL TOKLAB, DONE, ERR, SYSERR, ABORT
2177: COMMON /DETECT/ ERR, SYSERR, ABORT
2178: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2179: C
2180: C PROCESSES UNCONDITIONAL, ASSIGNED, AND COMPUTED GOTO STMTS
2181: C
2182: IF (PSTMT.GE.NSTMT) GO TO 100
2183: DONE = .FALSE.
2184: C
2185: C UNCONDITIONAL GOTO
2186: C
2187: IF (TOKLAB(1,K2,K,.FALSE.)) GO TO 110
2188: C
2189: C COMPUTED GOTO
2190: C
2191: IF (SYSERR) GO TO 110
2192: IF (STMT(PSTMT).EQ.65) GO TO 70
2193: C
2194: C ASSIGNED GOTO: GOTO <VAR> , ( <LAB> , ETC. )
2195: C
2196: 10 CALL NEXTOK(PSTMT, K2, K)
2197: IF (K.NE.0) GO TO 100
2198: K = LOOKUP(K2,.FALSE.)
2199: IF (SYSERR) GO TO 110
2200: I1 = IGATT1(K,1)
2201: IF (I1.NE.0) GO TO 20
2202: I1 = 1
2203: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
2204: CALL SATT1(K, 1, I1)
2205: 20 I2 = IGATT1(K,7)
2206: IF (MOD(I1,8).NE.2 .OR. I2.NE.0) CALL ERROR1(
2207: * 31H NOT AN INTEGER SCALAR VARIABLE, 31)
2208: I1 = IGATT1(K,8)
2209: IF (DONE) GO TO 40
2210: C
2211: C CHECK FOR ASSIGN VARIABLE IN USAGE
2212: C
2213: IF (I1.EQ.0) GO TO 30
2214: IF (I1.NE.8) CALL ERROR1(26H ID NOT AN ASSIGN VARIABLE, 26)
2215: GO TO 60
2216: 30 CALL SATT1(K, 8, 8)
2217: GO TO 60
2218: C
2219: C CHECK FOR VARIABLE IN USAGE
2220: C
2221: 40 IF (I1.EQ.0) GO TO 50
2222: IF (I1.NE.10) CALL ERROR1(19H ILLEGAL ID IN GOTO, 19)
2223: GO TO 130
2224: 50 CALL SATT1(K, 8, 10)
2225: GO TO 130
2226: C
2227: C LOOK FOR ","
2228: C
2229: 60 IF (STMT(K2).NE.68) GO TO 100
2230: K2 = K2 + 1
2231: DONE = .TRUE.
2232: IF (STMT(K2).NE.65) GO TO 100
2233: GO TO 80
2234: 70 PSTMT = PSTMT + 1
2235: GO TO 90
2236: 80 PSTMT = K2 + 1
2237: C
2238: C LOOK FOR ( <LAB> , ETC.)
2239: C
2240: 90 IF (PSTMT.GE.NSTMT) GO TO 100
2241: IF (.NOT.TOKLAB(1,K2,K,.FALSE.)) GO TO 100
2242: IF(SYSERR) GOTO 110
2243: IF (STMT(K2).EQ.68) GO TO 80
2244: IF (STMT(K2).NE.62) GO TO 100
2245: IF (DONE) GO TO 120
2246: DONE = .TRUE.
2247: IF (STMT(K2+1).NE.68) GO TO 100
2248: PSTMT = K2 + 2
2249: IF (PSTMT.LT.NSTMT) GO TO 10
2250: 100 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
2251: 110 RETURN
2252: C
2253: C CHECK END OF STMT IS REACHED
2254: C
2255: 120 K2 = K2 + 1
2256: 130 IF (K2.NE.NSTMT) CALL ERROR1(
2257: * 34H EXTRANEOUS INFO AFTER END OF STMT, 34)
2258: GO TO 110
2259: END
2260: C XXXXXID.f
2261: SUBROUTINE ID(K2)
2262: INTEGER STMT, PSTMT
2263: LOGICAL ERR, SYSERR, ABORT, DOVAR
2264: COMMON /DETECT/ ERR, SYSERR, ABORT
2265: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2266: COMMON /FACTS/ NAME, NOST, ITYP, IASF
2267: C
2268: C ROUTINE CHECKS IDENTIFIERS IN <LIST> FOR BEING ARRAY,ARRAY ELEMENT
2269: C OR VARIABLE.- RETURNS ERR=.TRUE. IF MUST CEASE PROCESSING
2270: C FIRST CHECK USAGE
2271: C
2272: K = LOOKUP(K2,.FALSE.)
2273: IF (SYSERR) GO TO 50
2274: C
2275: C CHECK USAGE
2276: C
2277: I3 = IGATT1(K,8)
2278: IF (I3.NE.0) GO TO 10
2279: CALL SATT1(K, 8, 10)
2280: GO TO 20
2281: 10 IF (I3.NE.10) CALL ERROR1(27H ILLEGAL IDENTIFIER IN LIST, 27)
2282: C
2283: C SET TYPE
2284: C
2285: 20 I3 = IGATT1(K,1)
2286: IF (I3.NE.0) GO TO 30
2287: I3 = 1
2288: IF (STMT(PSTMT).LE.43 .AND. STMT(PSTMT).GE.38) I3 = 2
2289: CALL SATT1(K, 1, I3)
2290: C
2291: C CHECK FOR READING INTO DO CONTROL VARIABLE OR LIMIT
2292: C
2293: 30 IF (ITYP.NE.23) GO TO 40
2294: IF (DOVAR(K)) CALL ERROR1(
2295: * 57H ILLEGAL TO CHANGE VALUE OF CONTROL VARIABLE OR DO LIMITS,
2296: * 57)
2297: C
2298: C MARK VARIABLES AS SET IF VALUES READ IN
2299: C
2300: CALL SATT1(K, 5, 1)
2301: C
2302: C SEPARATE OUT ARRAY ELEMENTS AND CHECK SUBSCRIPTS
2303: C
2304: 40 IF (STMT(K2).NE.65) GO TO 50
2305: I3 = IGATT1(K,7)
2306: IF (I3.EQ.0) GO TO 60
2307: PSTMT = K2 + 1
2308: IF (PSTMT.GE.NSTMT) GO TO 80
2309: CALL SUBS(K2, I3)
2310: ERR = .FALSE.
2311: 50 RETURN
2312: 60 CALL ERROR1(40H ILLEGAL SUBSCRIPTING OF SCALAR VARIABLE, 40)
2313: 70 ERR = .TRUE.
2314: GO TO 50
2315: 80 CALL ERROR1(19H SUBSCRIPTING ERROR, 19)
2316: GO TO 70
2317: END
2318: C XXXXXIDLIST.f
2319: LOGICAL FUNCTION IDLIST(IDO)
2320: INTEGER PSTMT, STMT
2321: LOGICAL ERR, SYSERR, ABORT, IDO
2322: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2323: COMMON /DETECT/ ERR, SYSERR, ABORT
2324: C
2325: C RECOGNIZES IDLIST=<ID> �, <ID>! ;LAST <ID> CANNOT BE FOLLOWED BY
2326: C A '='; IDLIST MUST CONTAIN AT LEAST ONE ID. IDLIST=.FALSE. WILL
2327: C BE RETURNED FOR AN IRRECOVERABLE SYNTAX ERROR.
2328: C IDO SET TO .TRUE. WHEN <IDLIST> IS FOLLOWED BY <DOSPEC>
2329: C
2330: IDO = .FALSE.
2331: IDLIST = .TRUE.
2332: IF (PSTMT.GE.NSTMT) GO TO 60
2333: CALL NEXTOK(PSTMT, K2, K)
2334: IF (K.NE.0) GO TO 60
2335: IF (STMT(K2).EQ.63) GO TO 20
2336: CALL ID(K2)
2337: IF (ERR .OR. SYSERR) GO TO 20
2338: 10 PSTMT = K2
2339: IF (STMT(PSTMT).EQ.68 .AND. STMT(PSTMT+1).EQ.65 .OR.
2340: * STMT(PSTMT).EQ.62 .OR. PSTMT.EQ.NSTMT) GO TO 30
2341: IF (STMT(PSTMT).EQ.68) GO TO 50
2342: CALL ERROR1(35H ILLEGAL TOKEN FOLLOWING IDENTIFIER, 35)
2343: 20 IDLIST = .FALSE.
2344: ERR = .FALSE.
2345: 30 RETURN
2346: 40 IDO = .TRUE.
2347: GO TO 30
2348: C
2349: C MAKE SURE <ID> = ISN'T NEXT CONSTRUCT
2350: C
2351: 50 K2 = K2 + 1
2352: IF (K2.GE.NSTMT) GO TO 60
2353: CALL NEXTOK(K2, K3, K)
2354: IF (STMT(K3).EQ.63) GO TO 40
2355: PSTMT = K2
2356: K2 = K3
2357: CALL ID(K2)
2358: IF (ERR .OR. SYSERR) GO TO 20
2359: GO TO 10
2360: 60 CALL ERROR1(23H ILLEGAL SYNTAX IN LIST, 23)
2361: GO TO 20
2362: END
2363: C XXXXXIFS.f
2364: SUBROUTINE IFS(LOG)
2365: LOGICAL TOKLAB, ERR, SYSERR, ABORT, LOG
2366: INTEGER STMT, PSTMT, EXPR
2367: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2368: COMMON /DETECT/ ERR, SYSERR, ABORT
2369: C
2370: C ROUTINE PROCESSES ARITHMETIC AND LOGICAL IF STMTS
2371: C LOG RETURNED AS TRUE IF LOGICAL-IF IS ENCOUNTERED;PU CHECKS FOR
2372: C ACCEPTIBLE EXECUTABLE STMT AFTER LOGICAL EXPRESSION
2373: C
2374: LOG = .FALSE.
2375: L = MOD(EXPR(I),8)
2376: IF (-1.EQ.L .OR. SYSERR) GO TO 30
2377: LOG = L.EQ.4
2378: IF (LOG) GO TO 30
2379: C
2380: C ARITHMETIC IF--SEARCH FOR <LAB>,<LAB>,<LAB>
2381: C
2382: IF (L.GT.2) GO TO 50
2383: I = 0
2384: IF (PSTMT.GE.NSTMT) GO TO 20
2385: 10 IF (.NOT.TOKLAB(1,K2,L,.FALSE.)) GO TO 40
2386: IF (SYSERR) GO TO 30
2387: I = I + 1
2388: IF (I.EQ.3) GO TO 60
2389: IF (STMT(K2).NE.68) GO TO 20
2390: PSTMT = K2 + 1
2391: IF (PSTMT.LT.NSTMT) GO TO 10
2392: 20 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
2393: 30 RETURN
2394: 40 CALL ERROR1(14H MISSING LABEL, 14)
2395: GO TO 30
2396: 50 CALL ERROR1(39H COMPLEX EXPRESSION ILLEGAL IN ARITH-IF, 39)
2397: GO TO 30
2398: 60 IF (K2.EQ.NSTMT) GO TO 30
2399: CALL ERROR1(34H EXTRANEOUS INFO AFTER END OF STMT, 34)
2400: GO TO 30
2401: END
2402: C XXXXXINTEXT.f
2403: LOGICAL FUNCTION INTEXT(LL, L1, L2, BR)
2404: C
2405: C LL POINTS TO DSA ENTRY OF FCN NAME
2406: C L1 POINTS INTO STACK TO BEGINNING OF ARGS
2407: C L2 POINTS INTO STACK TO LAST ARG ENTRY
2408: C BR .TRUE. MEANS LOOK FOR BOTH EXTERNALS ND INTRINS
2409: C BR FALSE MEANS JUST LOOK FOR EXTERNALS
2410: C ROUTINE CHECKS FOR REFERENCES TO INTRINSIC OR BASIC EXTERNAL
2411: C FCNS; RETURNS TRUE IF FINDS INTRINSIC FCN. CHECKS INTRINSICS
2412: C ARGS FOR USAGE, TYPE AND NUMBER. MARKS POSSIBLE BASIC EXTDRNAL
2413: C FCNS SENT DOWN TO IT
2414: C
2415: INTEGER STACK, BL, PDSA, DSA, FCN(6), Z
2416: LOGICAL BR
2417: COMMON /CEXPRS/ LSTACK, STACK(620)
2418: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
2419: COMMON /INTS/ Z(346)
2420: COMMON /FACTS/ NAME, NOST, ITYP, IASF
2421: DATA BL /1H /
2422: INTEXT = .FALSE.
2423: CALL S5UNPK(DSA(LL+4), FCN(1), 6)
2424: K = 1
2425: DO 40 I=1,55
2426: K1 = K + 1
2427: K2 = K1 + Z(K) - 1
2428: L = 0
2429: DO 10 J=K1,K2
2430: L = L + 1
2431: IF (FCN(L).NE.Z(J)) GO TO 30
2432: 10 CONTINUE
2433: IF (L.EQ.6) GO TO 60
2434: L = L + 1
2435: DO 20 J=L,6
2436: IF (FCN(J).NE.BL) GO TO 30
2437: 20 CONTINUE
2438: GO TO 60
2439: 30 K = K2 + 2
2440: 40 CONTINUE
2441: 50 RETURN
2442: C
2443: C DIFFERENTIATES BETWEEN A POSSIBLE BASIC EXTERNAL AND POSSIBLE
2444: C INTRINSIC FCN
2445: C
2446: 60 L = MOD(Z(K2+1),1024)/512
2447: C
2448: C IF POSSIBLE BASIC EXTERNAL CHECK TYPE AND SET IT IF NOT ALREADY
2449: C EXPLICITLY SET
2450: C
2451: IF (L.NE.1) GO TO 70
2452: L = IGATT1(LL,1)
2453: IF (L/8.GE.1) GO TO 190
2454: L = MOD(Z(K2+1),8)
2455: IF (BR) L = L + 8
2456: CALL SATT1(LL, 1, L)
2457: C
2458: C MARK AS USED IN PASS 1
2459: C
2460: GO TO 190
2461: C
2462: C CHEKC IF IN EXTERNAL STMT IF SO NOT AN INTRINSIC
2463: C
2464: 70 IF (.NOT.BR) GO TO 50
2465: L = IGATT1(LL,8)
2466: IF (L.EQ.13) GO TO 50
2467: C
2468: C CHECK IF EXPLICITLY TYPES DIFFERENTLY THAN EXPECTED
2469: C
2470: L = IGATT1(LL,1)
2471: J = MOD(Z(K2+1),8)
2472: IF (L.GE.8) GO TO 80
2473: CALL SATT1(LL, 1, J+8)
2474: GO TO 90
2475: 80 IF (J.NE.MOD(L,8)) GO TO 50
2476: C
2477: C K POINTS TO THE FUNCTION ENTRY IN Z
2478: C K1 POINTS TO FIRST LETTER IN FCN-NAME; K2 TO LAST LETTER
2479: C FIELDS IN ATTRIBUTE WORD ARE AS FOLLOWS:
2480: C BITS 0-2 TYPE FCN
2481: C BITS 3-5 TYPE ARGS
2482: C BIT 6 IF 1, FIXED NO ARGS; IF 0 VARIABLE NO OF ARGS
2483: C BITS 7-8 MINIMUM NUMBER OF ARGS
2484: C BITS 9 IF 0, INTRINSIC; IF 1 BASIC EXTERNAL
2485: C BITS 10 IF 1 USED IN PASS 1; ELSE NOT REFERENCED
2486: C
2487: C FCN IS INTRINSIC
2488: C CHECK NUMBER OF ARGS
2489: C
2490: 90 I = MOD(Z(K2+1),128)/64
2491: J = MOD(Z(K2+1),512)/128
2492: IF (I) 100, 100, 120
2493: C
2494: C VARIABLE NUMBER OF ARGS ALLOWED
2495: C MUST BE AT LEAST J
2496: C
2497: 100 IF ((L2-L1+1)/2.GE.J) GO TO 130
2498: 110 CALL ERROR2(29H INCORRECT NUMBER OF ARGS IN , 29, DSA(LL+4),
2499: * 1, 1, 1)
2500: GO TO 180
2501: C
2502: C FIXED NUMBER OF ARGS
2503: C
2504: 120 IF ((L2-L1+1)/2.NE.J) GO TO 110
2505: C
2506: C CHECK THRU ARG LIST OR PROPER TYPE ID AS AN ARG;
2507: C CHECK TYPE AND THAT ARGS ARE SCALARS
2508: C
2509: 130 L = MOD(Z(K2+1),64)/8
2510: DO 170 N=L1,L2,2
2511: C
2512: C CHECK FOR EXPRESSION AS ARG
2513: C
2514: IF (STACK(N).EQ.0) GO TO 160
2515: C
2516: C CHECK USAGE
2517: C
2518: I = IGATT1(STACK(N),8)
2519: IF (I.EQ.10 .OR. ((I.EQ.2 .OR. I.EQ.5 .OR. I.EQ.14) .AND.
2520: * STACK(N+1).NE.6)) GO TO 160
2521: IF (I.NE.0) GO TO 140
2522: CALL SATT1(STACK(N), 8, 10)
2523: GO TO 160
2524: 140 IF (I.EQ.1 .AND. ITYP.NE.31) GO TO 150
2525: I = STACK(N)
2526: IF (DSA(I+2).EQ.IASF) GO TO 160
2527: 150 CALL ERROR2(40H ILLEGAL ARGUMENT IN INTRINSIC REFERENCE, 40,
2528: * DSA(LL+4), 1, 1, 1)
2529: GO TO 170
2530: C
2531: C CHECK STRUCTURE
2532: C
2533: 160 IF (STACK(N+1)/8.EQ.1) CALL ERROR2(
2534: * 48H ILLEGAL STRUCTURE OF ARG IN INTRINSIC REFERENCE, 48,
2535: * DSA(LL+4), 1, 1, 1)
2536: C
2537: C CHECK TYPE
2538: C
2539: IF (MOD(STACK(N+1),8).NE.L) CALL ERROR2(
2540: * 43H ILLEGAL TYPE OF ARG IN INTRINSIC REFERENCE, 43,
2541: * DSA(LL+4), 1, 1, 1)
2542: 170 CONTINUE
2543: 180 INTEXT = .TRUE.
2544: I = IGATT1(LL,8)
2545: IF (I.NE.0) GO TO 190
2546: CALL SATT1(LL, 8, 14)
2547: C
2548: C MARK FCN AS USED
2549: C
2550: 190 K = Z(K2+1)/1024
2551: IF (K.EQ.0) Z(K2+1) = Z(K2+1) + 1024
2552: GO TO 50
2553: END
2554: C XXXXXIO.f
2555: SUBROUTINE IO
2556: LOGICAL ERR, SYSERR, TOKPNO, OK, ABORT, TOKLAB
2557: INTEGER STMT, PSTMT
2558: INTEGER EN(4)
2559: LOGICAL SW
2560: COMMON /FACTS/ NAME, NOST, ITYP, IASF
2561: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2562: COMMON /DETECT/ ERR, SYSERR, ABORT
2563: COMMON /SWS/ SW(10)
2564: DATA EN(1), EN(2), EN(3), EN(4) /34,43,33,63/
2565: C
2566: C ROUTINE RECOGNIZES READ,WRITE,REWIND,BACKSPACE,ENDFILE,PAUSE STMTS
2567: C
2568: OK = .TRUE.
2569: ASSIGN 160 TO IFORM
2570: IF (ITYP.NE.23 .AND. ITYP.NE.24) GO TO 240
2571: C
2572: C SYNTAX OF READ, WRITE STMTS IS THE SAME EXCEPT A BINARY WRITE
2573: C NEEDS A <LIST>. (SEE USE OF OK)
2574: C "READ" (�<UNIT> / <UNIT> , <FORM>!) �<LIST>!
2575: C <UNIT> IS INTEGER SCALAR VARIABLE OR POSITIVE INTEGER CONST
2576: C <FORM> IS <LABEL> OR <ARRAY NAME>.
2577: C
2578: IF (STMT(PSTMT).NE.65) GO TO 230
2579: PSTMT = PSTMT + 1
2580: IF (PSTMT.GE.NSTMT) GO TO 120
2581: 10 IF (TOKPNO(PSTMT,K2,K)) GO TO 60
2582: CALL NEXTOK(PSTMT, K2, K)
2583: IF (K.EQ.0) GO TO 20
2584: CALL ERROR1(13H ILLEGAL UNIT, 13)
2585: GO TO 110
2586: 20 K = LOOKUP(K2,.FALSE.)
2587: IF (SYSERR) GO TO 110
2588: I1 = IGATT1(K,1)
2589: I2 = IGATT1(K,7)
2590: I3 = IGATT1(K,8)
2591: IF (I3.NE.0) GO TO 30
2592: CALL SATT1(K, 8, 10)
2593: GO TO 40
2594: 30 IF (I3.EQ.10) GO TO 40
2595: CALL ERROR1(13H ILLEGAL UNIT, 13)
2596: 40 IF (I1.NE.0) GO TO 50
2597: I1 = 1
2598: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
2599: CALL SATT1(K, 1, I1)
2600: 50 IF (MOD(I1,8).NE.2 .OR. I2.NE.0) CALL ERROR1(13H ILLEGAL UNIT, 13)
2601: 60 PSTMT = K2
2602: C
2603: C DISTINGUISH ( <UNIT> ) FROM ( <UNIT>,<FORM> )
2604: C
2605: IF (ITYP.NE.23 .AND. ITYP.NE.24) GO TO 100
2606: IF (STMT(PSTMT).EQ.68) GO TO 130
2607: IF (STMT(PSTMT).EQ.62 .AND. ITYP.EQ.24) OK = .FALSE.
2608: C
2609: C CODE FINDS ")" AND TRIES TO FIND LIST
2610: C
2611: 70 IF (STMT(PSTMT).NE.62) GO TO 230
2612: PSTMT = PSTMT + 1
2613: IF (PSTMT.GE.NSTMT) GO TO 90
2614: CALL LIST
2615: GO TO 110
2616: 80 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
2617: PSTMT = PSTMT + 1
2618: GO TO 70
2619: 90 IF (OK) GO TO 110
2620: CALL ERROR1(13H MISSING LIST, 13)
2621: 100 IF (PSTMT.LT.NSTMT) CALL ERROR1(
2622: * 34H EXTRANEOUS INFO AFTER END OF STMT, 34)
2623: 110 RETURN
2624: 120 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
2625: GO TO 110
2626: C
2627: C IDENTIFY END= IF THERE
2628: C
2629: 130 IF (ITYP.NE.23) GO TO IFORM, (160, 80)
2630: I1 = PSTMT + 1
2631: DO 140 K=1,4
2632: IF (STMT(I1).NE.EN(K)) GO TO IFORM, (160, 80)
2633: I1 = I1 + 1
2634: 140 CONTINUE
2635: IF (.NOT.SW(1)) CALL ERROR1(
2636: * 37H WARNING - NON-PORTABLE EOF CONSTRUCT, 37)
2637: C
2638: C HAVE FOUND END=, TRY FOR LABEL
2639: C
2640: PSTMT = I1
2641: IF(.NOT.TOKLAB(1,K2,K,.FALSE.))
2642: 1CALL ERROR1(44H MISSING LABEL IN NON-PORTABLE EOF CONSTRUCT ,44)
2643: IF(SYSERR) GOTO 110
2644: 150 PSTMT = K2
2645: GO TO 70
2646: C
2647: C SEARCH FOR FORM
2648: C
2649: 160 PSTMT = PSTMT + 1
2650: IF (PSTMT.GE.NSTMT) GO TO 230
2651: IF (TOKLAB(3,K2,K,.FALSE.)) GO TO 220
2652: IF(SYSERR) GOTO 110
2653: CALL NEXTOK(PSTMT, K2, K)
2654: IF (K.EQ.0) GO TO 180
2655: 170 CALL ERROR1(13H ILLEGAL FORM, 13)
2656: GO TO 110
2657: 180 K = LOOKUP(K2,.FALSE.)
2658: IF (SYSERR) GO TO 110
2659: I1 = IGATT1(K,1)
2660: I2 = IGATT1(K,7)
2661: I3 = IGATT1(K,8)
2662: IF (I3.NE.0) GO TO 190
2663: CALL SATT1(K, 8, 10)
2664: GO TO 200
2665: 190 IF (I3.EQ.10) GO TO 200
2666: CALL ERROR1(13H ILLEGAL FORM, 13)
2667: 200 IF (I1.NE.0) GO TO 210
2668: I1 = 2
2669: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
2670: CALL SATT1(K, 1, I1)
2671: 210 IF((MOD(I1,8).NE.2.AND.MOD(I1,8).NE.5).OR.I2.EQ.0) GOTO 170
2672: C
2673: C HAVE SUCCESSFULLY FOUND A FORM
2674: C
2675: 220 IF (SYSERR) GO TO 110
2676: PSTMT = K2
2677: ASSIGN 80 TO IFORM
2678: IF (STMT(PSTMT).EQ.68) GO TO 130
2679: GO TO 70
2680: 230 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
2681: GO TO 110
2682: C
2683: C LAST 4 I-O STMTS
2684: C
2685: 240 IF (ITYP.EQ.27 .OR. ITYP.EQ.22) CALL ERROR1(
2686: * 39H WARNING - USE OF NON-PORTABLE I/O STMT, 39)
2687: IF (ITYP.EQ.22) GO TO 100
2688: IF (PSTMT.LT.NSTMT) GO TO 10
2689: CALL ERROR1(13H MISSING UNIT, 13)
2690: GO TO 110
2691: END
2692: C XXXXXLDOVAR.f
2693: SUBROUTINE LDOVAR
2694: COMMON /LISTDO/ LPT, LEN, LS(64)
2695: C
2696: C CHECKS PROPER NESTING OF DOS WITHIN LIST CONSTRUCT
2697: C
2698: IF (LPT.GE.61) GO TO 50
2699: DO 40 KQ=LPT,60,4
2700: KK = KQ + 4
2701: DO 30 L=1,4
2702: LL = L + KQ - 1
2703: IF (LS(LL)) 10, 30, 10
2704: 10 DO 20 K=KK,61,4
2705: IF (LS(K).EQ.LS(LL)) CALL ERROR1(
2706: *57H ILLEGAL TO CHANGE VALUE OF CONTROL VARIABLE OR DO LIMITS, 57)
2707: 20 CONTINUE
2708: 30 CONTINUE
2709: 40 CONTINUE
2710: 50 RETURN
2711: END
2712: C XXXXXNEXTOK.f
2713: SUBROUTINE NEXTOK(K1, K2, CODE)
2714: INTEGER STMT, CODE, PSTMT
2715: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
2716: C
2717: C NEXT TOKEN IN STMT(K1)-STMT(K2-1). CODES ARE:
2718: C DIGIT STRING(1)
2719: C HOLLERITH(2)
2720: C IDENTIFIER(0)
2721: C SPECIAL CHARACTER(3)
2722: C
2723: IF (STMT(K1).LT.0) GO TO 50
2724: IF (STMT(K1).GT.9) GO TO 20
2725: C
2726: C DIGIT STRING
2727: C
2728: CODE = 1
2729: K2 = K1 + 1
2730: 10 IF (K2.EQ.NSTMT) GO TO 60
2731: IF ((STMT(K2).GT.9) .OR. (STMT(K2).LT.0)) GO TO 60
2732: K2 = K2 + 1
2733: GO TO 10
2734: 20 IF (STMT(K1).GT.55) GO TO 40
2735: C
2736: C IDENTIFIER
2737: C
2738: CODE = 0
2739: K4 = K1 + 1
2740: K2 = K4
2741: DO 30 I=K4,NSTMT
2742: IF (STMT(I).GT.55 .OR. STMT(I).LT.0) GO TO 60
2743: K2 = K2 + 1
2744: 30 CONTINUE
2745: C
2746: C
2747: C SPECIAL CHARACTER
2748: C
2749: 40 K2 = K1 + 1
2750: CODE = 3
2751: IF (STMT(K1).NE.66) GO TO 60
2752: IF (STMT(K2).EQ.66) K2 = K2 + 1
2753: GO TO 60
2754: C
2755: C HOLLERITH
2756: C
2757: 50 CODE = 2
2758: K2 = K1 + 1
2759: 60 RETURN
2760: END
2761: C XXXXXOUTSYM.f
2762: SUBROUTINE OUTSYM
2763: INTEGER HASH, STACK, BL, DSA, OUTUT, SYMHD, BNEXT, SYMLEN, ATT(8)
2764: INTEGER CODE(11), CC(30), C(4), Q(70), SYM, PDSA
2765: INTEGER OUTUT2, OUTUT3, OUTUT4
2766: LOGICAL OK
2767: LOGICAL OPT, P1ERR, COMM
2768: COMMON /CHASH/ LHASH, HASH(401)
2769: COMMON /OPTNS/ OPT(5), P1ERR
2770: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
2771: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
2772: * OUTUT4
2773: COMMON /TABL/ NEXT, LAB, SYM, BNEXT
2774: COMMON /FACTS/ NAME, NOST, ITYP, IASF
2775: COMMON /CEXPRS/ LSTACK, STACK(620)
2776: COMMON /TRANS/ Q
2777: DATA BL /1H /
2778: DATA CODE(1) /1HD/, CODE(2) /1HR/, CODE(3) /1HI/, CODE(4) /1HC/,
2779: * CODE(5) /1HL/, CODE(11) /1HE/, CODE(7) /1HA/, CODE(8) /1HS/,
2780: * CODE(9) /1HF/, CODE(10) /1HN/, CODE(6) /1HH/, C(1) /4/, C(2)
2781: * /11/, C(3) /7/, C(4) /8/
2782: DATA CC(2), CC(16), CC(20), CC(22), CC(26), CC(28) /6*1H /,
2783: * CC(3), CC(5), CC(9), CC(11) /1HF,1HS,1HF,1HF/, CC(1), CC(4) /
2784: * 1HU,1HA/, CC(6), CC(8), CC(10), CC(12), CC(14) /1HF,4*1HN/,
2785: * CC(7), CC(13) /2*1HS/, CC(15) /1HC/, CC(17) /1HG/, CC(18) /
2786: * 1HT/, CC(19) /1HL/, CC(21) /1HV/, CC(25) /1HM/, CC(23) /1HB/,
2787: * CC(24) /1HD/, CC(27) /1HE/
2788: DATA CC(29) /1HI/, CC(30) /1HF/
2789: C
2790: C ROUTINE PRINTS OUT SYMBOL TABLE FOR A PROGRAM UNIT
2791: C
2792: IF (NAME.EQ.0 .OR. .NOT.OPT(1)) RETURN
2793: II = IGATT1(NAME,8)
2794: CALL S5UNPK(DSA(NAME+4), STACK(1), 6)
2795: WRITE (OUTUT,99999) (STACK(I),I=1,6)
2796: 99999 FORMAT (14H1PROGRAM UNIT , 5X, 6A1)
2797: IF (II.EQ.11 .OR. II.EQ.12 .OR. DSA(NAME+2).EQ.0) GO TO 60
2798: C
2799: C PRINT FCN/SUBROUTINE ARGS
2800: C
2801: KK = DSA(NAME+2)
2802: I = 0
2803: 10 L = 20
2804: CALL RDLIST(KK, 9, M, 0)
2805: IF (M) 20, 60, 20
2806: 20 DO 30 I1=1,M
2807: J = STACK(I1) + 4
2808: CALL S5UNPK(DSA(J), STACK(L), 6)
2809: L = L + 7
2810: STACK(L-1) = BL
2811: 30 CONTINUE
2812: MM = M*7 + 19
2813: IF (I) 40, 40, 50
2814: 40 WRITE (OUTUT,99998) (STACK(L),L=20,MM)
2815: 99998 FORMAT (//10H ARGUMENTS, 9X, 63A1)
2816: I = 1
2817: GO TO 10
2818: 50 WRITE (OUTUT,99997) (STACK(L),L=20,MM)
2819: 99997 FORMAT (19X, 63A1)
2820: GO TO 10
2821: C
2822: C PRINT SYMBOLS FOR PROGRAM UNIT
2823: C
2824: 60 CALL SORT(SYM, LBR)
2825: COMM = .FALSE.
2826: WRITE (OUTUT,99996)
2827: 99996 FORMAT (//1X, 4HNAME, 5X, 4HTYPE, 2X, 3HUSE, 1X, 10HATTRIBUTES,
2828: * 1X, 10HREFERENCES//)
2829: DO 230 JBR=1,LBR
2830: SYMHD = HASH(JBR)
2831: DO 70 I=20,35
2832: STACK(I) = BL
2833: 70 CONTINUE
2834: DO 80 I=1,8
2835: ATT(I) = IGATT1(SYMHD,I)
2836: 80 CONTINUE
2837: C SKIPS OVER SYMBOL TABLE ENTRY FOR MAIN, BLOCK DATA,
2838: C AND CURRENT SUBROUTINE NAME
2839: IF (SYMHD.EQ.NAME .AND. ATT(8).NE.4) GO TO 230
2840: IF (ATT(8).NE.7) GO TO 90
2841: COMM = .TRUE.
2842: GO TO 230
2843: 90 CALL S5UNPK(DSA(SYMHD+4), STACK(20), 6)
2844: I1 = ATT(8)
2845: L = 2*(I1+1) - 1
2846: STACK(28) = CC(L)
2847: STACK(29) = CC(L+1)
2848: C LEAVE BLANK IRRELEVANT TYPE INFO FOR EXT SUBR, COMMON, EXT ENTS
2849: IF(ATT(8).EQ.6 .OR. ATT(8).EQ.7 .OR. ATT(8).EQ.13)
2850: 1 GOTO 100
2851: I1 = MOD(ATT(1),8)
2852: IF (ATT(1).GE.8) STACK(26)=CODE(11)
2853: STACK(27) = CODE(I1 + 1)
2854: 100 DO 110 I=1,4
2855: L = I + 29
2856: J = C(I)
2857: IF (ATT(I+1).EQ.1) STACK(L) = CODE(J)
2858: 110 CONTINUE
2859: IF (ATT(8).EQ.7) STACK(30) = BL
2860: IF (ATT(8).NE.10 .AND. ATT(8).NE.8) GO TO 140
2861: IF (ATT(7)) 120, 130, 120
2862: 120 STACK(34) = CODE(7)
2863: J = ATT(7) + 1
2864: STACK(35) = Q(J)
2865: GO TO 140
2866: 130 STACK(34) = CODE(8)
2867: C
2868: C XREF LIST
2869: C
2870: 140 IF (OPT(2)) GO TO 160
2871: 150 WRITE (OUTUT,99995) (STACK(L),L=20,35)
2872: GO TO 230
2873: 160 OK = .FALSE.
2874: N = DSA(SYMHD+1)
2875: IF (N.LE.0) GO TO 150
2876: N = DSA( N+1 )
2877: 170 CALL RFLIST( N, M, J, DSA(SYMHD+1) )
2878: C
2879: C FIRST TIME PRINT WHOLE LINE
2880: C
2881: K = M
2882: IF (M.GE.57) K = 57
2883: WRITE (OUTUT,99995) (STACK(L),L=20,35), (STACK(L),L=50,K)
2884: 99995 FORMAT (1X, 6A1, 5X, 2A1, 3X, 2A1, 3X, 6A1, 2X, 8(I5, 1X))
2885: IF (M-57) 220, 220, 180
2886: 180 L = (M-57)/8
2887: LL = 58
2888: IF (L) 220, 210, 190
2889: 190 DO 200 K=1,L
2890: LK = LL + 7
2891: WRITE (OUTUT,99994) (STACK(I),I=LL,LK)
2892: LL = LK + 1
2893: 200 CONTINUE
2894: IF (LK.EQ.M) GO TO 220
2895: 210 WRITE (OUTUT,99994) (STACK(I),I=LL,M)
2896: 99994 FORMAT (30X, 8(I5, 1X))
2897: C
2898: C MAY HAVE TO CALL REFLIST AGAIN
2899: C
2900: 220 IF (J) 230, 230, 170
2901: 230 CONTINUE
2902: C
2903: C PRINT LABELS
2904: C
2905: IF (LAB.EQ.0) GO TO 320
2906: CALL SORT(LAB, LBR)
2907: DO 310 JBR=1,LBR
2908: LABHD = HASH(JBR)
2909: CALL S5UNPK(DSA(LABHD+4), STACK(20), 6)
2910: OK = .FALSE.
2911: IF (OPT(2)) GO TO 240
2912: WRITE (OUTUT,99993) (STACK(L),L=20,25)
2913: GO TO 310
2914: 240 II = DSA(LABHD+1)
2915: II = DSA(II+1)
2916: 250 CALL RFLIST(II, M, J, DSA(LABHD+1) )
2917: K = M
2918: IF (M.GE.57) K = 57
2919: WRITE (OUTUT,99993) (STACK(I),I=20,25), (STACK(I),I=50,K)
2920: 99993 FORMAT (1X, 6A1, 23X, 8(I5, 1X))
2921: IF (M-57) 300, 300, 260
2922: 260 L = (M-57)/8
2923: LL = 58
2924: IF (L) 300, 290, 270
2925: 270 DO 280 K=1,L
2926: LK = LL + 7
2927: WRITE (OUTUT,99992) (STACK(I),I=LL,LK)
2928: LL = LK + 1
2929: 280 CONTINUE
2930: IF (LK.EQ.M) GO TO 300
2931: 290 WRITE (OUTUT,99992) (STACK(I),I=LL,M)
2932: 99992 FORMAT (30X, 8(I5, 1X))
2933: 300 IF (J) 310, 310, 250
2934: 310 CONTINUE
2935: 320 IF (.NOT.COMM) GO TO 390
2936: CALL SORT(SYM, LBR)
2937: WRITE (OUTUT,99991)
2938: 99991 FORMAT (//14H COMMON BLOCKS//)
2939: DO 380 JBR=1,LBR
2940: SYMHD = HASH(JBR)
2941: I = IGATT1(SYMHD,8)
2942: IF (I.NE.7) GO TO 380
2943: CALL S5UNPK(DSA(SYMHD+4), STACK(100), 6)
2944: N = 0
2945: II = DSA(SYMHD+2)
2946: 330 L = 11
2947: CALL RDLIST(II, 10, M, 0)
2948: IF (M) 340, 380, 340
2949: 340 DO 350 I=1,M
2950: J = STACK(I) + 4
2951: CALL S5UNPK(DSA(J), STACK(L), 6)
2952: L = L + 7
2953: STACK(L-1) = BL
2954: 350 CONTINUE
2955: L = L - 1
2956: IF (N) 360, 360, 370
2957: 360 WRITE (OUTUT,99990) (STACK(I),I=100,105), (STACK(I),I=11,L)
2958: 99990 FORMAT (1X, 6A1, 3X, 70A1)
2959: N = 1
2960: GO TO 330
2961: 370 WRITE (OUTUT,99989) (STACK(K),K=11,L)
2962: 99989 FORMAT (10X, 70A1)
2963: GO TO 330
2964: 380 CONTINUE
2965: 390 RETURN
2966: END
2967: C XXXXXPOP.f
2968: SUBROUTINE POP
2969: LOGICAL ERR, SYSERR, ABORT
2970: INTEGER PB, PT, STACK, OP(12), EX(4,4), AO(4,4), RO(3,3)
2971: COMMON /CEXPRS/ LSTACK, STACK(620)
2972: COMMON /EXPRS/ PT, PB, AO, RO, EX
2973: COMMON /DETECT/ ERR, SYSERR, ABORT
2974: DATA OP(1), OP(3), OP(7), OP(9), OP(10), OP(11) /6*2/, OP(4) /1/,
2975: * OP(5) /0/, OP(6), OP(8), OP(2) /3*-1/, OP(12) /1/
2976: C
2977: C JOB OF SUBROUTINE IS TO POP THE STACK; DOES ALL POPS
2978: C EXCEPT REMOVAL OF "FCN(" CONSTRUCTION
2979: C OP(I) CONTAINS NUM OF ARGS OF OPERATER I PB CHECKED BEFORE
2980: C CALLING POP; POP CHECKS PT; ERROR RETURNS FROM THIS ROUTINE STOP
2981: C EXPRESSION PROCESSING (I.E. ERR=.TRUE.)
2982: C
2983: ERR = .FALSE.
2984: I = STACK(PB+1)
2985: K = OP(I-10)
2986: IF (K) 190, 180, 10
2987: 10 L = PT - 1
2988: KQ = K
2989: 20 IF (K) 80, 80, 30
2990: 30 IF (STACK(L)/8.EQ.1) GO TO 220
2991: IF (STACK(L).GE.8 .OR. STACK(L-1).EQ.0) GO TO 40
2992: J = IGATT1(STACK(L-1),8)
2993: IF (J.EQ.0) CALL SATT1(STACK(L-1), 8, 10)
2994: 40 GO TO (60, 50), K
2995: 50 K1 = MOD(STACK(L),8) + 1
2996: GO TO 70
2997: 60 K2 = MOD(STACK(L),8) + 1
2998: 70 L = L - 2
2999: K = K - 1
3000: GO TO 20
3001: C
3002: C 11 +,- 12 ) 13 ** 14 .NOT. 15 ( 16 FCN( 17 *,/ 18 ,
3003: C 19 .AND. 20 .OR. 21 .EQ. 22 UNARY +,-
3004: C
3005: 80 L = I - 10
3006: GO TO (90, 190, 120, 150, 190, 190, 90, 190, 130, 130, 100, 140),
3007: * L
3008: 90 IF (K1.GT.4 .OR. K2.GT.4) GO TO 210
3009: KK = AO(K1,K2)
3010: GO TO 160
3011: 100 IF (K1.GT.3 .OR. K2.GT.3) GO TO 110
3012: KK = RO(K1,K2)
3013: GO TO 160
3014: 110 IF ((K1.NE.6 .OR. K2.NE.6) .AND. (K1.NE.6 .OR. K2.NE.3) .AND.
3015: * (K1.NE.3 .OR. K2.NE.6) ) GO TO 210
3016: KK = 4
3017: GO TO 160
3018: 120 IF (K1.GT.4 .OR. K2.GT.4) GO TO 210
3019: KK = EX(K2,K1)
3020: GO TO 160
3021: 130 KK = 4
3022: IF (K1.NE.5 .OR. K2.NE.5) GO TO 210
3023: GO TO 160
3024: 140 KK = K2 - 1
3025: IF (KK.LT.0 .OR. KK.GT.3) GO TO 210
3026: GO TO 160
3027: 150 IF (K2.NE.5) GO TO 210
3028: KK = 4
3029: 160 IF (-1.EQ.KK) GO TO 210
3030: C
3031: C STORE ON STACK 0 TO SHOW EXPRESSION RESULT(NO DSA INDEX)
3032: C ALSO STORE TYPE OF RESULTING OPERAND
3033: C
3034: PT = PT - 2*KQ
3035: STACK(PT) = 0
3036: STACK(PT+1) = KK
3037: PT = PT + 2
3038: PB = PB + 1
3039: 170 RETURN
3040: C
3041: C POPPING "("
3042: C
3043: 180 PB = PB + 1
3044: GO TO 170
3045: 190 CALL ERROR1(25H ILLEGAL ELEMENT ON STACK, 25)
3046: 200 ERR = .TRUE.
3047: RETURN
3048: 210 CALL ERROR1(34H ILLEGAL COMBINATION OF DATA TYPES, 34)
3049: GO TO 200
3050: 220 CALL ERROR1(21H ILLEGAL USE OF ARRAY, 21)
3051: GO TO 200
3052: END
3053: C XXXXXRDLIST.f
3054: SUBROUTINE RDLIST(HEAD, L, N, M)
3055: C
3056: C HEAD IS THE HEAD OF A LINEAR LINKED LIST IN DSA
3057: C L IS MAX NUMBER OF ITEMS DESIRED
3058: C N IS NUMBER OF ITEMS RETURNED
3059: C M IS END OF LIST MARKER
3060: C
3061: INTEGER HEAD, STACK, DSA, PDSA
3062: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3063: COMMON /CEXPRS/ LSTACK, STACK(620)
3064: N = 0
3065: 10 IF (HEAD.EQ.M .OR. N.GE.L) GO TO 20
3066: N = N + 1
3067: STACK(N) = DSA(HEAD)
3068: HEAD = DSA(HEAD+1)
3069: GO TO 10
3070: 20 RETURN
3071: END
3072: C XXXXXRFLIST.f
3073: SUBROUTINE RFLIST( I1, I2, I4, I3 )
3074: C
3075: C I1 IS POINTER TO FIRST ELEMENT ON XREF LIST IN DSA
3076: C I2 IS COUNT OF HOW MANY REFS ARE RETURNED IN STACK
3077: C I4 IS 1 IF RFLIST MUST BE CALLED AGAIN; ELSE IS 0
3078: C I3 IS LAST OF LIST ELEMENTS
3079: C
3080: INTEGER DSA, PDSA, STACK
3081: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3082: COMMON /CEXPRS/ LSTACK, STACK(620)
3083: I4 = 0
3084: I2 = 49
3085: 10 IF ( I2+1.GE.LSTACK ) GOTO 30
3086: I2 = I2 + 1
3087: STACK(I2) = DSA(I1)
3088: IF( I1.EQ.I3 ) GOTO 20
3089: I1 = DSA(I1+1)
3090: GOTO 10
3091: 20 RETURN
3092: 30 I4 = 1
3093: GO TO 20
3094: END
3095: C XXXXXSEPAR.f
3096: SUBROUTINE SEPAR(ICHAR)
3097: C
3098: C FINDS SEPARATER CONSTRUCT IN FORMAT STMTS
3099: C SEPARATER IS A COMBINATION OF "/" AND ","
3100: C ",," IS ALWAYS ILLEGAL IN A SEPARATER
3101: C MIXING OF "/" AND "," IS WARNED AGAINST
3102: C
3103: C ICHAR CONTAINS LENGTH OF SEPARATOR FOUND
3104: INTEGER PSTMT, STMT
3105: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3106: ICHAR = PSTMT
3107: ICOM = 0
3108: C
3109: C " , "
3110: C
3111: 10 IF (STMT(PSTMT).NE.68) GO TO 20
3112: ICOM = ICOM + 1
3113: C
3114: C CHECK FOR ",,"
3115: C
3116: PSTMT = PSTMT + 1
3117: IF (STMT(PSTMT).EQ.68) GO TO 30
3118: 20 IF (STMT(PSTMT).NE.67) GO TO 50
3119: PSTMT = PSTMT + 1
3120: GO TO 10
3121: 30 CALL ERROR1(19H ILLEGAL ADJACENT ,, 19)
3122: C
3123: C FLUSH TO NEXT NON-SEPARATER
3124: C
3125: 40 PSTMT = PSTMT + 1
3126: IF (STMT(PSTMT).EQ.67 .OR. STMT(PSTMT).EQ.68) GO TO 40
3127: 50 ICHAR = PSTMT - ICHAR
3128: IF (ICOM.GT.0 .AND. ICHAR.GT.1) CALL ERROR1(
3129: * 36H ILLEGAL MIXING OF / AND , IN FORMAT, 36)
3130: RETURN
3131: END
3132: C XXXXXSETNAM.f
3133: SUBROUTINE SETNAM(KK)
3134: LOGICAL ERR, SYSERR, ABORT
3135: INTEGER STMT, PSTMT, S(5)
3136: COMMON /FACTS/ NAME, NOST, ITYP, IASF
3137: COMMON /DETECT/ ERR, SYSERR, ABORT
3138: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3139: DATA S(1) /66/, S(2) /42/, S(3) /30/, S(4) /38/, S(5) /43/
3140: C
3141: C KK=11 FOR BLOCK DATA PGM; KK=12 FOR MAIN PGM
3142: C NAME POINTS TO SYMBOL TABLE ENTRY FOR NEW PGM
3143: C
3144: IF (KK.EQ.11) GO TO 30
3145: PSTMT = 1
3146: DO 10 I=1,5
3147: STMT(I) = S(I)
3148: 10 CONTINUE
3149: NAME = LOOKUP(6,.FALSE.)
3150: IF (SYSERR) RETURN
3151: CALL SATT1(NAME, 8, 12)
3152: 20 RETURN
3153: 30 PSTMT = 5
3154: STMT(PSTMT) = S(1)
3155: NAME = LOOKUP(11,.FALSE.)
3156: IF (SYSERR) RETURN
3157: CALL SATT1(NAME, 8, 11)
3158: GO TO 20
3159: END
3160: C XXXXXSORT.f
3161: SUBROUTINE SORT(IPT, L)
3162: EXTERNAL EXCH
3163: INTEGER HASH, PDSA, DSA
3164: COMMON /CHASH/ LHASH, HASH(401)
3165: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3166: C
3167: C PUT ALL SUMBOL INDICES IN HASH TABLE TO SORT THEM
3168: C
3169: L = 0
3170: I = IPT
3171: 10 IF (I.EQ.0) GO TO 20
3172: L = L + 1
3173: HASH(L) = I
3174: I = DSA(I+3)
3175: GO TO 10
3176: C
3177: C CALL SORT ROUTINE
3178: C UPON RETURN HASH CONTAINS INDICES OF ALL SYMBOLS OR LABELS IN
3179: C DSA IN LEXICOGRAPHIC ORDER
3180: C
3181: 20 CALL SSORT(EXCH, DSA, LDSA, HASH, L, 4)
3182: RETURN
3183: END
3184: C XXXXXSUBS.f
3185: SUBROUTINE SUBS(K2, NO)
3186: INTEGER STMT, PSTMT
3187: LOGICAL ERR, SYSERR, ABORT, TOKPNO
3188: COMMON /DETECT/ ERR, SYSERR, ABORT
3189: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3190: C
3191: C STMT(PSTMT)-STMT(K2-1) CONTAIN SUBSCRIPT CONSTRUCT
3192: C NO IS NUMBER OF SUBSCRIPTS EXPECTED
3193: C ROUTINE CHECKS SYNTAX AND NUMBER OF SUBSCRIPTS
3194: C IF FLUSH OF CONSTRUCT IS NECESSARY, AND NSTMT IS REACHED
3195: C ERR=.TRUE.
3196: C
3197: ICNT = 0
3198: 10 CALL NEXTOK(PSTMT, K2, K)
3199: IF (K.EQ.0) GO TO 70
3200: IF (TOKPNO(PSTMT,K2,LL)) GO TO 60
3201: 20 CALL ERROR1(28H ILLEGAL SYNTAX OF SUBSCRIPT, 28)
3202: C
3203: C FLUSH TO END OF SUBSCRIPT CONSTRUCTION
3204: C
3205: 30 IF (STMT(K2).EQ.62) GO TO 40
3206: K2 = K2 + 1
3207: IF (K2.LT.NSTMT) GO TO 30
3208: ERR = .TRUE.
3209: GO TO 50
3210: 40 K2 = K2 + 1
3211: 50 RETURN
3212: 60 IF (STMT(K2).NE.66) GO TO 130
3213: PSTMT = K2 + 1
3214: IF (PSTMT.GE.NSTMT) GO TO 20
3215: CALL NEXTOK(PSTMT, K2, K)
3216: IF (K.NE.0) GO TO 20
3217: C
3218: C ACESS SYMBOL TABLE ENTRY FOR VARIABLE TO DETERMINE
3219: C USAGE AND TYPE
3220: C
3221: 70 KQ = LOOKUP(K2,.FALSE.)
3222: IF (SYSERR) GO TO 30
3223: I1 = IGATT1(KQ,1)
3224: I1 = MOD(I1,8)
3225: I2 = IGATT1(KQ,7)
3226: I3 = IGATT1(KQ,8)
3227: IF (I3.EQ.0) GO TO 90
3228: IF (I3.EQ.10) GO TO 100
3229: 80 CALL ERROR1(43H ILLEGAL VARIABLE IN SUBSCRIPT CONSTRUCTION, 43)
3230: GO TO 120
3231: 90 CALL SATT1(KQ, 8, 10)
3232: C
3233: C IMPLICITLY TYPE VARIABLES FIRST ENCOUNTERED IN SUBSCRIPT
3234: C CONSTRUCT
3235: C
3236: 100 IF (I1.GT.0) GO TO 110
3237: I1 = 1
3238: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
3239: CALL SATT1(KQ, 1, I1)
3240: 110 IF (I2.NE.0 .OR. I1.NE.2) GO TO 80
3241: 120 IF (STMT(K2).NE.60 .AND. STMT(K2).NE.61) GO TO 130
3242: CALL NEXTOK(K2+1, K3, K)
3243: IF (K.NE.1) GO TO 20
3244: K2 = K3
3245: 130 ICNT = ICNT + 1
3246: IF (STMT(K2).EQ.68) GO TO 140
3247: IF (STMT(K2).NE.62) GO TO 20
3248: IF (NO.NE.ICNT) CALL ERROR1(34H INCOMPATIBLE NUMBER OF SUBSCRIPTS,
3249: * 34)
3250: IF (ICNT.GT.3) CALL ERROR1(20H TOO MANY SUBSCRIPTS, 20)
3251: GO TO 40
3252: 140 PSTMT = K2 + 1
3253: IF (PSTMT.GE.NSTMT) GO TO 20
3254: GO TO 10
3255: END
3256: C XXXXXSUBFCN.f
3257: SUBROUTINE SUBFCN(TYPE)
3258: C
3259: C TYPE IS EXPLICIT TYPE OF FUNCTION, ELSE IS -1
3260: C ALL FCNS GIVEN EXPLICIT TYPE SINCE FCN NAME CANNOT APPEAR IN
3261: C NONEXECUTABLE STMT WITHIN FCN SUBPRGM EXCEPT HEAD STMT
3262: C ROUTINES DEFINES SUBROUTINE AND FUNCTION NAMES AND CREATES
3263: C LINKED LISTS OF POINTERS TO THEIR ARGUMENTS IN DSA.
3264: C SETS NAME TO POINT TO CURRENT FUNCN OR SUBRTNE. IN CASE
3265: C OF BAD SYNTAX IN NAME CONSTRUCT OR FCN WITHOUT PARAMS.,
3266: C PROGRAM UNIT BECOMES MAIN PGM BY DEFAULT
3267: C
3268: INTEGER STMT, PSTMT, DSA, SYMHD, TYPE, BNEXT, S(5), PDSA
3269: LOGICAL ERR, SYSERR, ABORT
3270: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3271: COMMON /FACTS/ NAME, NOST, ITYP, IASF
3272: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
3273: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3274: COMMON /DETECT/ ERR, SYSERR, ABORT
3275: DATA S(1) /66/, S(2) /42/, S(3) /30/, S(4) /38/, S(5) /43/
3276: KCELL = 0
3277: CALL NEXTOK(PSTMT, K2, I1)
3278: IF (I1.NE.0) GO TO 120
3279: C
3280: C SET FCN OR SUBR USE IN SYMBOL TABLE. TYPE FCN AND RECORD EXPLICIT
3281: C OR IMPLICIT TYPE
3282: C
3283: K = LOOKUP(K2,.FALSE.)
3284: IF (SYSERR) GO TO 90
3285: NAME = K
3286: L = ITYP - 8
3287: GO TO (10, 20), L
3288: 10 CALL SATT1(K, 8, 3)
3289: GO TO 40
3290: 20 CALL SATT1(K, 8, 4)
3291: IF (TYPE.LT.0) GO TO 30
3292: CALL SATT1(K, 1, TYPE+8)
3293: GO TO 40
3294: 30 L = 1
3295: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) L = 2
3296: CALL SATT1(K, 1, L)
3297: 40 IF (STMT(K2).NE.65) GO TO 140
3298: 50 PSTMT = K2 + 1
3299: IF (PSTMT.GE.NSTMT) GO TO 120
3300: CALL NEXTOK(PSTMT, K2, L)
3301: IF (L.NE.0) GO TO 80
3302: C
3303: C ENTER PARAMETER IN SYMBOL TABLE; TYPE IMPLICITLY; ADD ONTO PARAM
3304: C LIST HANGING OFF SUBR/FCN NAME; SET DUMMYARG BIT ON; DO NOT SET
3305: C USAGE
3306: C
3307: N = LOOKUP(K2,.FALSE.)
3308: IF (SYSERR) GO TO 90
3309: I2 = IGATT1(N,4)
3310: I1 = IGATT1(N,8)
3311: IF (I1.NE.0 .OR. I2.NE.0) GO TO 80
3312: L = 1
3313: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) L = 2
3314: CALL SATT1(N, 1, L)
3315: L = IGATT1(N,4)
3316: IF (L.EQ.1) GO TO 80
3317: CALL SATT1(N, 4, 1)
3318: IF (NEXT+2.GE.BNEXT) GO TO 150
3319: IF (KCELL.EQ.0) GO TO 60
3320: DSA(KCELL+1) = NEXT
3321: GO TO 70
3322: C
3323: C START PARAM LIST
3324: C
3325: 60 DSA(K+2) = NEXT
3326: 70 KCELL = NEXT
3327: DSA(NEXT) = N
3328: DSA(NEXT+1) = 0
3329: NEXT = NEXT + 2
3330: C
3331: C SEARCH FOR ")" OR ","
3332: C
3333: IF (STMT(K2).EQ.62) GO TO 100
3334: IF (STMT(K2).EQ.68) GO TO 50
3335: 80 CALL ERROR1(33H ILLEGAL SYNTAX IN PARAMETER LIST, 33)
3336: 90 RETURN
3337: 100 K2 = K2 + 1
3338: 110 IF (K2.EQ.NSTMT) GO TO 90
3339: CALL ERROR1(39H ILLEGAL CHARACTERS AFTER SUBR/FCN HEAD, 39)
3340: GO TO 90
3341: 120 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
3342: PSTMT = 6
3343: DO 130 I1=1,5
3344: STMT(I1+5) = S(I1)
3345: 130 CONTINUE
3346: NAME = LOOKUP(11,.FALSE.)
3347: IF (SYSERR) GO TO 90
3348: CALL SATT1(NAME, 8, 11)
3349: GO TO 90
3350: 140 IF (ITYP.EQ.9) GO TO 110
3351: CALL ERROR1(20H NO PARAMS SPECIFIED, 20)
3352: GO TO 120
3353: 150 SYSERR = .TRUE.
3354: CALL ERROR1(33H IN SUBFCN, TABLE OVERFLOW OF DSA,33)
3355: GO TO 90
3356: END
3357: C XXXXXTOKCOM.f
3358: LOGICAL FUNCTION TOKCOM(K1, K2)
3359: C
3360: C TOKCOM RETURNS TRUE IS FINDS CONST IN STMT(K1)-STMT(K2-1)
3361: C ( (OPTIONAL SIGN) REAL CONST, (OPTIONAL SIGN) REAL CONST ) IS
3362: C COMPLEX CONSTRUCT; TOKCOM RESETS K2
3363: C
3364: LOGICAL TOKRL
3365: INTEGER STMT, PSTMT
3366: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3367: TOKCOM = .FALSE.
3368: IF (STMT(K1).NE.65) GO TO 10
3369: K3 = K1 + 1
3370: IF (STMT(K3).EQ.60 .OR. STMT(K3).EQ.61) K3 = K3 + 1
3371: IF (TOKRL(K3,K2,K)) IF (K-1) 10, 20, 10
3372: 10 RETURN
3373: 20 IF (STMT(K2).NE.68) GO TO 10
3374: K3 = K2 + 1
3375: IF (STMT(K3).EQ.60 .OR. STMT(K3).EQ.61) K3 = K3 + 1
3376: IF (TOKRL(K3,K2,K)) IF (K-1) 10, 30, 10
3377: GO TO 10
3378: 30 IF (STMT(K2).NE.62) GO TO 10
3379: K2 = K2 + 1
3380: TOKCOM = .TRUE.
3381: GO TO 10
3382: END
3383: C XXXXXTOKLAB.f
3384: LOGICAL FUNCTION TOKLAB(K1, K2, KK, DEF)
3385: INTEGER STMT, PSTMT, SYMHD, DSA, PDSA, BNEXT, DOPT, DOLIST
3386: LOGICAL DEF, NON0, SYSERR, ABORT, ERR
3387: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3388: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
3389: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3390: COMMON /DETECT/ ERR, SYSERR, ABORT
3391: COMMON /DOS/ DOPT, LDO, DOLIST(192)
3392: COMMON /FACTS/ NAME, NOST, ITYPE, IASF
3393: C
3394: C LOOKS FOR DEFNS OF LABEL IF DEF = .TRUE., ELSE LOOKS FOR
3395: C REFS. IF IT FINDS A LABEL TOKLAB=.TRUE.
3396: C IN REFERENCE LABEL IS IN STMT(PSTMT)-STMT(K2-1)
3397: C IN DEFN LABEL IS IN STMT(1)-STMT(K2-1)
3398: C KK IS SYMBOL TABLE INDEX OF LABEL
3399: C K1 IS TYPE OF LABEL EXPECTED OR DEFINED--1-EXECUTABLE
3400: C 2-NONEXECUTABLE, 3-FORMAT
3401: C IN REF, ROUTINE SETS USAGE OF SYMBOL AND CHECKS FOR
3402: C COMPATIBLE REFERENCES(I.E. GOTO 5 AND WRITE(6,5) ARE INCOMPAT.)
3403: C IN DEF, ROUTINE SETS USAGE OF SYMBOL, CHECKS FOR DUPLICATE
3404: C DEFNS, CHECKS FOR COMPATIBLITY BETWEEN DEFN AND PREVIOUS
3405: C REFS, CREATES SCOPE AREA FOR LABEL INITIALIZING WORD1 TO
3406: C CURRENT HEADING STMT NO ON DOLIST AND WORD2 TO CURRENT LEVEL
3407: C IN REFS AND DEFS LABELS MUST BE POSITIVE NUMBERS
3408: C
3409: TOKLAB = .FALSE.
3410: IF (DEF) GO TO 80
3411: NON0 = .FALSE.
3412: J = PSTMT + 4
3413: IF (J.GT.NSTMT) J = NSTMT
3414: K3 = PSTMT
3415: DO 10 K2 = PSTMT,J
3416: IF(STMT(K2).GT.9 .OR. STMT(K2).LT.0) GOTO 60
3417: IF(STMT(K2) .GT. 0) NON0 = .TRUE.
3418: IF(.NOT.NON0) K3 = K3+1
3419: 10 CONTINUE
3420: K2 = J+1
3421: IF(.NOT.NON0) GOTO 70
3422: C NOTE CAN CHANGE PSTMT HERE BECAUSE WE KNOW WE HAVE A LAB
3423: 20 PSTMT = K3
3424: KK = LOOKUP(K2,.TRUE.)
3425: IF (SYSERR) GO TO 50
3426: IF (ITYPE.EQ.14) DSA(BNEXT+1) = -DSA(BNEXT+1)
3427: I = IGATT1(KK,8)
3428: IF (I.EQ.0) CALL SATT1(KK, 8, 9)
3429: I1 = IGATT1(KK,1)
3430: IF (I1.NE.0) GO TO 30
3431: CALL SATT1(KK, 1, K1)
3432: GO TO 40
3433: 30 IF (K1.NE.I1) CALL ERROR1(30H INCOMPATIBLE LABEL REFERENCES, 30)
3434: 40 TOKLAB = .TRUE.
3435: 50 RETURN
3436: 60 IF (K2.EQ.PSTMT) GO TO 50
3437: IF (NON0) GO TO 20
3438: 70 CALL ERROR1(30H LABEL MUST BE POSITIVE NUMBER, 30)
3439: GO TO 50
3440: C
3441: C TAKES DEF OF LABEL; CHECKS FOR DUPLICATE DEFS.; SETS DEFINED
3442: C BIT IN SYMBOL TABLE; STORES BEGINNING BINDING STMT NO
3443: C
3444: 80 K2 = 0
3445: NON0 = .FALSE.
3446: DO 90 I=1,5
3447: IF (STMT(I).EQ.69) GO TO 90
3448: IF ((STMT(I).GT.9) .OR. (STMT(I).LT.0)) GO TO 140
3449: IF (STMT(I).GT.0) NON0 = .TRUE.
3450: IF (.NOT.NON0) GO TO 90
3451: K2 = K2 + 1
3452: STMT(K2) = STMT(I)
3453: 90 CONTINUE
3454: IF (K2.EQ.0) GO TO 50
3455: IF (.NOT.NON0) GO TO 70
3456: K2 = K2 + 1
3457: KK = LOOKUP(K2,.TRUE.)
3458: IF (SYSERR) GO TO 50
3459: I = IGATT1(KK,2)
3460: IF (I.EQ.1) GO TO 120
3461: CALL SATT1(KK, 2, 1)
3462: CALL SATT1(KK, 8, 9)
3463: I1 = IGATT1(KK,1)
3464: IF (I1.EQ.0) GO TO 100
3465: IF (I1.EQ.K1) GO TO 110
3466: CALL ERROR1(44H ILLEGAL REFERENCE TO LABEL IN PREVIOUS CODE, 44)
3467: 100 CALL SATT1(KK, 1, K1)
3468: 110 IF (K1.NE.1) GO TO 40
3469: IF (NEXT+2.GE.BNEXT) GO TO 130
3470: DSA(KK+2) = NEXT
3471: DSA(NEXT) = DOLIST(DOPT)
3472: DSA(NEXT+1) = -DOPT/6
3473: NEXT = NEXT + 2
3474: GO TO 40
3475: 120 CALL ERROR1(16H DUPLICATE LABEL, 16)
3476: GO TO 50
3477: 130 CALL ERROR1(33H IN TOKLAB, TABLE OVERFLOW OF DSA, 33)
3478: SYSERR = .TRUE.
3479: GO TO 50
3480: 140 CALL ERROR1(24H ILLEGAL SYMBOL IN LABEL, 24)
3481: GO TO 50
3482: END
3483: C XXXXXTOKLOG.f
3484: LOGICAL FUNCTION TOKLOG(K1, K2)
3485: C
3486: C ROUTINE RETURNS TRUE IF FINDS .TRUE. OR .FALSE.
3487: C IN STMT(K1)-STMT(K2-1)
3488: C
3489: INTEGER STMT, CONS(13), PSTMT
3490: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3491: DATA CONS(1) /64/, CONS(2) /35/, CONS(3) /30/, CONS(4) /41/,
3492: * CONS(5) /48/, CONS(6) /34/, CONS(7) /64/, CONS(8) /64/,
3493: * CONS(9) /49/, CONS(10) /47/, CONS(11) /50/, CONS(12) /34/,
3494: * CONS(13) /64/
3495: TOKLOG = .FALSE.
3496: KCNT = 1
3497: L1 = 1
3498: L2 = 7
3499: K2 = K1
3500: 10 DO 20 I=L1,L2
3501: IF (STMT(K2).NE.CONS(I)) GO TO 30
3502: K2 = K2 + 1
3503: 20 CONTINUE
3504: TOKLOG = .TRUE.
3505: RETURN
3506: 30 KCNT = KCNT + 1
3507: IF (KCNT.GE.3) RETURN
3508: K2 = K1
3509: L1 = 8
3510: L2 = 13
3511: GO TO 10
3512: END
3513: C XXXXXTOKLOP.f
3514: LOGICAL FUNCTION TOKLOP(K1, K2, KCODE)
3515: C
3516: C ROUTINE RETURNS TRUE IF FINDS LOGICAL OR RELATIONAL
3517: C OPERATORS IN STMT(K1)-STMT(K2-1); RETURNS OPERATOR CODE
3518: C IN KCODE (SEE EXPR FOR CODES)
3519: C
3520: INTEGER C(20), CC(9), CODE(9), PSTMT, STMT
3521: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3522: DATA C(1) /30/, C(2) /43/, C(3) /33/, C(4) /43/, C(5) /44/, C(6)
3523: * /49/, C(7) /44/, C(8) /47/, C(9) /34/, C(10) /46/, C(11)
3524: * /43/, C(12) /34/, C(13) /36/, C(14) /49/, C(15) /36/, C(16)
3525: * /34/, C(17) /41/, C(18) /49/, C(19) /41/, C(20) /34/
3526: DATA CC(1), CC(2) /2*3/, CC(3), CC(4), CC(5), CC(6), CC(7),
3527: * CC(8), CC(9) /7*2/, CODE(1) /19/, CODE(2) /14/, CODE(3) /20/,
3528: * CODE(4), CODE(5), CODE(6), CODE(7), CODE(8), CODE(9) /6*21/
3529: TOKLOP = .FALSE.
3530: IF (STMT(K1).NE.64) RETURN
3531: J = 1
3532: DO 30 I=1,9
3533: KK = J + CC(I) - 1
3534: K2 = K1 + 1
3535: DO 10 L=J,KK
3536: IF (STMT(K2).NE.C(L)) GO TO 20
3537: K2 = K2 + 1
3538: 10 CONTINUE
3539: KCODE = CODE(I)
3540: IF (STMT(K2).NE.64) RETURN
3541: K2 = K2 + 1
3542: TOKLOP = .TRUE.
3543: RETURN
3544: 20 J = J + CC(I)
3545: 30 CONTINUE
3546: RETURN
3547: END
3548: C XXXXXTOKPNO.f
3549: LOGICAL FUNCTION TOKPNO(K1, K2, LL)
3550: C
3551: C ROUTINE RECOGNIZES A POSITIVE INTEGER CONSTANT
3552: C IN STMT(K1)-STMT(K2-1), AND RETURNS ITS VALUE IN LL
3553: C
3554: INTEGER STMT, PSTMT
3555: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3556: TOKPNO = .FALSE.
3557: CALL NEXTOK(K1, K2, K)
3558: IF (K.NE.1) RETURN
3559: K=K2-1
3560: LL = 0
3561: DO 10 KK=K1,K
3562: LL = 10 * LL + STMT(KK)
3563: 10 CONTINUE
3564: IF (LL.GT.0) TOKPNO = .TRUE.
3565: RETURN
3566: END
3567: C XXXXXTOKRL.f
3568: LOGICAL FUNCTION TOKRL(K1, K2, CODE)
3569: INTEGER STMT, CODE, PSTMT
3570: LOGICAL TOKLOP
3571: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3572: C
3573: C ROUTINE RETURNS TRUE IF FINDS A REAL CONSTANT IN
3574: C STMT(K1)-STMT(K2-1) . ELSE IT RETURNS FALSE.
3575: C BASIC CONSTRUCT IS: <INT> . <INT>
3576: C <INT> .
3577: C . <INT>
3578: C EACH OF THESE MAY BE FOLLOWED BY <D,E> <+,-> <INT>
3579: C ALSO LEGAL IS IN-CONST FOLLOWED BY EXPONENT CONSTRUCT
3580: C
3581: TOKRL = .FALSE.
3582: CALL NEXTOK(K1, K2, K)
3583: IF (K.EQ.3 .AND. STMT(K1).EQ.64) GO TO 10
3584: IF (K.EQ.1 .AND. STMT(K2).EQ.64) GO TO 40
3585: C IF HAVE INT-CONST NEED EXPONENT FOR THIS TO BE A REAL-CONST
3586: IF (K-1) 80, 50, 80
3587: C
3588: C FIND BASIC REAL CONSTANT
3589: C
3590: C (. INT-CONST) CONSTRUCT
3591: 10 CALL NEXTOK(K2, K3, K)
3592: IF (K.NE.1) GO TO 80
3593: 20 K2 = K3
3594: 30 TOKRL = .TRUE.
3595: CODE = 1
3596: GO TO 50
3597: C (INT-CONST .) CONSTRUCT; CHECK FOR (INT . INT )
3598: 40 K2 = K2 + 1
3599: CALL NEXTOK(K2, K3, K)
3600: IF (K.EQ.1) GO TO 20
3601: IF (TOKLOP(K2-1,K4,K)) GO TO 80
3602: GO TO 30
3603: C
3604: C CHECK FOR EXPONENT
3605: C
3606: 50 IF (STMT(K2).NE.33) GO TO 60
3607: CODE = 0
3608: GO TO 70
3609: 60 IF (STMT(K2).NE.34) GO TO 80
3610: CODE = 1
3611: 70 K3 = K2 + 1
3612: IF (K3.EQ.NSTMT) GO TO 80
3613: IF ((STMT(K3).EQ.60) .OR. (STMT(K3).EQ.61)) K3 = K3 + 1
3614: CALL NEXTOK(K3, K4, K)
3615: IF (K.NE.1) GO TO 80
3616: K2 = K4
3617: TOKRL = .TRUE.
3618: 80 RETURN
3619: END
3620: C XXXXXTYPE.f
3621: SUBROUTINE TYPE
3622: LOGICAL ERR, SYSERR, ARDECL, ABORT
3623: INTEGER STMT, PSTMT, DSA, PDSA
3624: COMMON /DETECT/ ERR, SYSERR, ABORT
3625: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3626: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3627: C
3628: C PROCESSES TYPE STMT BY FINDING IDS OR ARRAY DECLS
3629: C THEY ARE ENTERED INTO SYMBOL TABLE AND TYPED EXPLICITLY
3630: C NO USAGE IS SET.
3631: C
3632: 10 IF (.NOT.ARDECL(K2,INDX)) GO TO 20
3633: IF (SYSERR) GO TO 30
3634: L = IGATT1(INDX,6)
3635: IF(L.EQ.1) CALL ERROR1(63
3636: 1H WARNING - SHOULD TYPE ADJUSTABLE DIMENSION VARIABLE BEFORE USE
3637: 2, 63)
3638: IF (K2.EQ.NSTMT) GO TO 30
3639: IF (STMT(K2).EQ.68 .AND. K2+1.NE.NSTMT) GO TO 40
3640: 20 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
3641: 30 RETURN
3642: 40 PSTMT = K2 + 1
3643: GO TO 10
3644: END
3645: C XXXXXTYPST.f
3646: SUBROUTINE TYPST(ITYP, KK, KL)
3647: INTEGER PSTMT, K(186), KI(30), STMT, CODE, KT(30)
3648: LOGICAL ERR, SYSERR, ASSMT, ABORT
3649: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3650: COMMON /DETECT/ ERR, SYSERR, ABORT
3651: COMMON /STS/ K, KI, KT
3652: C
3653: C*****STS
3654: C K(*) (INT) ARRAY CONTAINS A TABLE OF INTERNAL CODES FOR EACH
3655: C "KEYWORD" IN FORTRAN STMTS
3656: C KI(*) (INT) ARRAY CONTAINING NUMBER OF CHARACTERS IN EACH
3657: C KEYWORD IN K
3658: C KT(*) (INT) ARRAY CONTAINING CLASS OF EACH STMT IN K
3659: C (SEE PU FOR FURTHER DOC OF IGP -CLASS)
3660: C TEST IF ITS AN ASSIGNMENT; IF SO ITYP = 30
3661: C ELSE SEARCH K ARRAY FOR STMT; ITYP CONTAINS CODED
3662: C TYPE OF STMT; KK CONTAINS GENERAL CLASS OF STMTS IT FALLS IN
3663: C KL IS COUNT OF NUMBER OF LETTERS IN FIRST WORD OF STMT
3664: C
3665: CALL TYPST2(ASSMT)
3666: IF (ASSMT) GO TO 40
3667: J = 1
3668: CODE = 0
3669: 10 I = PSTMT
3670: CODE = CODE + 1
3671: L = J + KI(CODE) - 1
3672: DO 20 LL=J,L
3673: IF (STMT(I).NE.K(LL)) GO TO 30
3674: I = I + 1
3675: 20 CONTINUE
3676: ITYP = CODE
3677: KK = KT(CODE)
3678: KL = KI(CODE)
3679: RETURN
3680: 30 J = L + 1
3681: IF (CODE.LT.29) GO TO 10
3682: ERR = .TRUE.
3683: RETURN
3684: 40 ITYP = 30
3685: KK = KT(30)
3686: KL = 0
3687: RETURN
3688: END
3689: C XXXXXTYPST2.f
3690: SUBROUTINE TYPST2(ASSMT)
3691: INTEGER PSTMT, STMT
3692: LOGICAL EQUALS, ASSMT
3693: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3694: C
3695: C ALGORITHM FOR IDENTIFYING ASSIGNMENT STMTS:
3696: C
3697: EQUALS = .FALSE.
3698: LEVEL = 0
3699: IGP = 0
3700: C
3701: C 62.....) 63.....= 65.....( 68.....,
3702: C
3703: DO 40 I=PSTMT,NSTMT
3704: IF (STMT(I).EQ.65) LEVEL = LEVEL + 1
3705: IF (STMT(I).NE.62) GO TO 10
3706: LEVEL = LEVEL - 1
3707: IF (EQUALS) GO TO 40
3708: IF (LEVEL.EQ.0) IGP = IGP + 1
3709: IF (IGP.EQ.1 .AND. LEVEL.EQ.0 .AND. STMT(I+1).NE.63) GO TO 60
3710: GO TO 40
3711: 10 IF (LEVEL) 50, 20, 30
3712: 20 IF (STMT(I).EQ.68) GO TO 60
3713: IF (STMT(I).EQ.63) EQUALS = .TRUE.
3714: GO TO 40
3715: 30 IF (STMT(I).EQ.63) GO TO 60
3716: 40 CONTINUE
3717: IF (.NOT.EQUALS) GO TO 60
3718: ASSMT = .TRUE.
3719: 50 RETURN
3720: 60 ASSMT = .FALSE.
3721: GO TO 50
3722: END
3723: C XXXXXSATT2.f
3724: SUBROUTINE SATT2(INDEX, FIELD, ATT)
3725: C
3726: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
3727: C
3728: INTEGER INDEX, FIELD, ATT
3729: INTEGER LLAT, PLAT, LAT
3730: INTEGER FWTH(8), FPOS(8)
3731: C
3732: DATA FWTH(1) /16/, FPOS(1) /1/
3733: DATA FWTH(2) /2/, FPOS(2) /16/
3734: DATA FWTH(3) /2/, FPOS(3) /32/
3735: DATA FWTH(4) /2/, FPOS(4) /64/
3736: DATA FWTH(5) /2/, FPOS(5) /128/
3737: DATA FWTH(6) /2/, FPOS(6) /256/
3738: DATA FWTH(7) /4/, FPOS(7) /512/
3739: DATA FWTH(8) /32/, FPOS(8) /2048/
3740: C
3741: LAT(INDEX) = LAT(INDEX) + (ATT-MOD(LAT(INDEX)/FPOS(FIELD),
3742: * FWTH(FIELD)))*FPOS(FIELD)
3743: C
3744: RETURN
3745: C
3746: END
3747: C XXXXXIGATT2.f
3748: INTEGER FUNCTION IGATT2(INDEX, FIELD)
3749: C
3750: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
3751: C
3752: INTEGER INDEX, FIELD
3753: INTEGER LLAT, PLAT, LAT
3754: INTEGER FWTH(8), FPOS(8)
3755: C
3756: DATA FWTH(1) /16/, FPOS(1) /1/
3757: DATA FWTH(2) /2/, FPOS(2) /16/
3758: DATA FWTH(3) /2/, FPOS(3) /32/
3759: DATA FWTH(4) /2/, FPOS(4) /64/
3760: DATA FWTH(5) /2/, FPOS(5) /128/
3761: DATA FWTH(6) /2/, FPOS(6) /256/
3762: DATA FWTH(7) /4/, FPOS(7) /512/
3763: DATA FWTH(8) /32/, FPOS(8) /2048/
3764: C
3765: IGATT2 = MOD(LAT(INDEX)/FPOS(FIELD),FWTH(FIELD))
3766: C
3767: RETURN
3768: C
3769: END
3770: C XXXXXCALLS.f
3771: SUBROUTINE CALLS
3772: INTEGER STMT, PSTMT, EXPR, M(3), OUTUT3, OUTUT4
3773: LOGICAL ERR, SYSERR, ABORT
3774: LOGICAL OPT, P1ERR
3775: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3776: COMMON /PARAMS/ I1, I2, I6, I4, I5, OUTUT3, OUTUT4
3777: COMMON /DETECT/ ERR, SYSERR, ABORT
3778: COMMON /FACTS/ NAME, NOST, ITYP, IASF
3779: COMMON /OPTNS/ OPT(5), P1ERR
3780: DATA M(1) /4/, M(2) /2/, M(3) /0/
3781: C
3782: C CHECK FOR LEGAL SUBROUTINE NAME BEFORE CALLING EXPR
3783: C TO PROCESS ARGUMENTS
3784: C IF NO ARGS, CALLS SAVES PASS 2 DATA ITSELF WITHOUT
3785: C CALLING EXPR
3786: C
3787: IF (PSTMT.GE.NSTMT) GO TO 10
3788: CALL NEXTOK(PSTMT, K2, K)
3789: IF (K.NE.0) GO TO 10
3790: IF (K2.EQ.NSTMT) GO TO 40
3791: IF (STMT(K2).EQ.65) GO TO 30
3792: 10 CALL ERROR1(26H MISSING ROUTINE NAME OR (, 26)
3793: 20 RETURN
3794: C
3795: C BY A CALL TO EXPR
3796: C
3797: 30 I3 = EXPR(K)
3798: IF (SYSERR) GO TO 20
3799: IF (PSTMT.NE.NSTMT) CALL ERROR1(18H ILLEGAL CALL STMT, 18)
3800: GO TO 20
3801: C
3802: C SAVE SUBROUTINE CALL W/O ARGS
3803: C
3804: 40 K = LOOKUP(K2,.FALSE.)
3805: IF (SYSERR) GO TO 20
3806: I3 = IGATT1(K,8)
3807: IF (I3.NE.13 .AND. I3.NE.0) GO TO 50
3808: CALL SATT1(K, 8, 6)
3809: GO TO 60
3810: C
3811: C MAKE SURE EXTERNAL REFERENCED ID IS NOT USED AS ANYTHING
3812: C OTHER AS A SUBROUTINE ELSEWHERE IN THIS P-U
3813: C
3814: 50 IF (I3.EQ.6) GO TO 60
3815: CALL ERROR1(24H ILLEGAL SUBROUTINE NAME, 24)
3816: GO TO 20
3817: 60 IF (OPT(3) .AND. .NOT.P1ERR) WRITE (OUTUT3) M, K, NOST, M(3)
3818: GO TO 20
3819: END
3820: C XXXXXDATA.f
3821: SUBROUTINE DATA
3822: LOGICAL ERR, SYSERR, ABORT, REPL, ARDECL, SIGN, TOKPNO, ERROR
3823: INTEGER DECNT, DATCNT, STMT, PSTMT, GETTOK, STACK, S(10), DSA,
3824: * PDSA
3825: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
3826: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
3827: COMMON /FACTS/ NAME, NOST, ITYP, IASF
3828: COMMON /DETECT/ ERR, SYSERR, ABORT
3829: COMMON /CEXPRS/ LSTACK, STACK(620)
3830: DATA IS /1H*/
3831: C
3832: C ROUTINE PROCESSES A DATA STMT
3833: C
3834: 10 DECNT = 0
3835: 20 IF (ARDECL(K2,KK)) GO TO 30
3836: IF (.NOT.ERR) GO TO 30
3837: CALL ERROR1(19H ILLEGAL DECLARATOR, 19)
3838: IF(.NOT.SYSERR) GOTO 260
3839: 30 IF (SYSERR) RETURN
3840: C
3841: C SET DECLARATOR USAGE AS VARIABLE; CHECK ITS NOT IN BLANK COMMON
3842: C CANNOT BE INLABELLED COMMON IF THIS STMT NOT IN BLOCK DATA PGM
3843: C FOUND A DECLARATOR ADD IT TO LIST OF ALL DECLS SO CAN CHECK
3844: C TYPE OF ITS CORRESPONDING DATA-ITEM; ADD IN COUNT SO CAN
3845: C CHECK NUMBER OF DECLS VS. NUMBER OF DATA-ITEMS
3846: C KEEP TYPE INFO ON STACK; DECNT IS LENGTH OF STACK
3847: C
3848: I = IGATT1(KK,8)
3849: IF (I.EQ.0) CALL SATT1(KK, 8, 10)
3850: I = IGATT1(KK,2)
3851: NN = IGATT1(NAME,8)
3852: IF (I) 60, 60, 40
3853: C
3854: C IF VARIABLE IN COMMON, CHECK TO SEE IF CAN LEGALLY APPEAR
3855: C IN DATA STMT
3856: C
3857: 40 I = DSA(KK+2)
3858: I = DSA(I+1)
3859: CALL S5UNPK(DSA(I+4), S(1), 6)
3860: IF (S(1).EQ.IS) GO TO 50
3861: C
3862: C FOUND NO "*" SO ARE IN LABELLED COMMON
3863: C
3864: IF (NN.EQ.11) GO TO 70
3865: CALL ERROR1(
3866: * 55H ILLEGAL TO INITIALIZE VARIABLE IN LABELLED COMMON HERE,
3867: * 55)
3868: GO TO 260
3869: C
3870: C FOUND BLANK COMMON
3871: C
3872: 50 CALL ERROR1(48H ILLEGAL TO INITIALIZE VARIABLES IN BLANK COMMON,
3873: * 48)
3874: GO TO 260
3875: 60 IF (NN.NE.11) GO TO 70
3876: CALL ERROR1(33H DATA-ITEM NOT IN LABELLED COMMON, 33)
3877: GO TO 260
3878: 70 I = IGATT1(KK,1)
3879: CALL SATT1(KK, 5, 1)
3880: NN = 1
3881: IF (IGATT1(KK,7).EQ.0) GO TO 75
3882: IF (STMT(K2-1).EQ.62) GO TO 75
3883: N = DSA(KK+2)
3884: NN = DSA(N)
3885: 75 CONTINUE
3886: IF (DECNT+3.LE.LSTACK) GO TO 76
3887: CALL ERROR1(33H IN DATA, TABLE OVERFLOW OF STACK , 33 )
3888: GO TO 260
3889: 76 CONTINUE
3890: STACK(DECNT+1) = MOD(I,8)
3891: STACK(DECNT+2) = KK
3892: STACK(DECNT+3) = NN
3893: DECNT = DECNT + 3
3894: IF (STMT(K2).EQ.67) GO TO 100
3895: IF (STMT(K2).NE.68) GO TO 90
3896: PSTMT = K2 + 1
3897: IF (PSTMT.LT.NSTMT) GO TO 20
3898: 80 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
3899: RETURN
3900: 90 CALL ERROR1(33H ILLEGAL PUNCTUATION IN DATA STMT, 33)
3901: GO TO 260
3902: C
3903: C FIND DATA-ITEMS; CHECK ITS TYPE VS. CORRESPONDING DECLARATOR
3904: C SIGN .TRUE. IF DATA-ITEM PRECEEDED BY A SIGN
3905: C REPL .TRUE. IF A REPLICATION FACTOR HAS ALREADY BEEN FOUND
3906: C
3907: 100 DATCNT = 0
3908: ERROR = .FALSE.
3909: PSTMT = K2 + 1
3910: 110 IF (PSTMT.EQ.NSTMT) GO TO 80
3911: SIGN = .FALSE.
3912: REPL = .FALSE.
3913: NN = 1
3914: 120 IF (STMT(PSTMT).NE.60 .AND. STMT(PSTMT).NE.61) GO TO 130
3915: PSTMT = PSTMT + 1
3916: SIGN = .TRUE.
3917: 130 IF (PSTMT.EQ.NSTMT) GO TO 80
3918: KK = GETTOK(PSTMT,K2)
3919: IF (ERR) GO TO 80
3920: IF (KK.LT.6) GO TO 150
3921: 140 CALL ERROR1(18H ILLEGAL DATA-ITEM, 18)
3922: GO TO 260
3923: 150 KK = KK + 1
3924: GO TO (200, 200, 160, 190, 190, 180), KK
3925: C
3926: C MUST MAKE SURE THAN AN INTEGER DATA-ITEM ISN'T A REPLICATION FACTO
3927: C
3928: 160 IF (REPL) GO TO 200
3929: IF(SIGN .OR. STMT(K2).NE.66) GOTO 200
3930: IF(TOKPNO(PSTMT,K2,NN)) GOTO 170
3931: CALL ERROR1(27H ILLEGAL REPLICATION FACTOR ,27)
3932: NN = 1
3933: 170 REPL = .TRUE.
3934: PSTMT = K2 + 1
3935: GO TO 120
3936: C
3937: C CHECK LENGTH OF HOLLERITH DATA-ITEM; MUST FIT INTO INTEGER WORD
3938: C
3939: 180 IF (STMT(PSTMT)+2048.EQ.1 .OR. ERROR) GO TO 190
3940: CALL ERROR1(
3941: * 53H WARNING - NH WITH N.GT.1 IS NOT A PORTABLE CONSTRUCT, 53)
3942: ERROR = .TRUE.
3943: C
3944: C CHECK COMPLEX, HOLLERITH, AND LOGICAL DATA-ITEMS ARE UNSIGNED
3945: C
3946: 190 IF (SIGN) GO TO 140
3947: C
3948: C CHECK COMPATIBLITY OF DATA-ITEMS WITH DECLARATORS
3949: C NN IS REPLICATION FACTOR;
3950: C
3951: 200 IBR=0
3952: DO 220 I = 1,NN
3953: IF (STACK(DATCNT+3).EQ.0) DATCNT = DATCNT + 3
3954: IF (DATCNT .GE. DECNT) GO TO 240
3955: STACK(DATCNT+3) = STACK(DATCNT+3) - 1
3956: IF (STACK(DATCNT+1).EQ.KK-1) GO TO 220
3957: IF ((STACK(DATCNT+1).NE.2 .OR. KK.NE.6) .AND.
3958: * (STACK(DATCNT+1).NE.5 .OR. KK.NE.3)) GO TO 210
3959: CALL SATT1(STACK(DATCNT+2), 1, 5)
3960: GO TO 220
3961: 210 IBR = 1
3962: 220 CONTINUE
3963: IF(IBR .EQ. 1) CALL ERROR1(52
3964: 1H WARNING - DATA-ITEM IS INCOMPATIBLE WITH DECLARATOR ,52)
3965: C
3966: C CHECK FOR "," BETWEEN DATA-ITEMS
3967: C
3968: IF (STMT(K2).NE.68) GO TO 230
3969: PSTMT = K2 + 1
3970: GO TO 110
3971: C
3972: C CHECK FOR ANOTHER SET OF DECLARATORS/DATA-ITEMS
3973: C
3974: 230 IF (STMT(K2).NE.67) GO TO 90
3975: IF (STACK(DATCNT+3).EQ.0) DATCNT = DATCNT + 3
3976: IF (DATCNT.EQ.DECNT) GO TO 250
3977: 240 CALL ERROR1(34H MISSING DECLARATORS OR DATA-ITEMS, 34)
3978: IF (DATCNT.GE.DECNT) GO TO 260
3979: 250 PSTMT = K2 + 1
3980: IF (PSTMT.EQ.NSTMT) RETURN
3981: IF (STMT(PSTMT).NE.68) GO TO 90
3982: PSTMT = PSTMT + 1
3983: IF (PSTMT.NE.NSTMT) GO TO 10
3984: GO TO 80
3985: C
3986: C FLUSH TO "/," CONSTRUCT OR END OF STATEMEMT
3987: C
3988: 260 IF (PSTMT+1.GE.NSTMT) RETURN
3989: IF (STMT(PSTMT).EQ.67 .AND. STMT(PSTMT+1).EQ.68) GO TO 270
3990: PSTMT = PSTMT + 1
3991: GO TO 260
3992: 270 PSTMT = PSTMT + 2
3993: IF (PSTMT.GE.NSTMT) RETURN
3994: GO TO 10
3995: END
3996: C XXXXXDOSTMT.f
3997: SUBROUTINE DOSTMT
3998: LOGICAL TOKLAB, ERR, SYSERR, ABORT
3999: INTEGER STMT, PSTMT
4000: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
4001: COMMON /DETECT/ ERR, SYSERR, ABORT
4002: C
4003: C ROUTINE PROCESSES A DO STMT. DOSTMT PEELS OFF THE
4004: C LABEL. CALLS DOSPEC TO GET THE <DO-SPECIFICATION>
4005: C
4006: IF (TOKLAB(1,K2,KK,.FALSE.)) GO TO 10
4007: CALL ERROR1(23H MISSING LABEL AFTER DO, 23)
4008: GO TO 20
4009: 10 IF (SYSERR) GO TO 20
4010: PSTMT = K2
4011: CALL DOSPEC(KK, K2, .FALSE.)
4012: 20 RETURN
4013: END
4014: C XXXXXEND.f
4015: SUBROUTINE END
4016: C
4017: C ROUTINE SAVES SYMBOL TABLE FOR 2ND PASS
4018: C CHECKS VARIABLE DIMENSIONING IN FCN/SUBR PU'S
4019: C CANNOT RESET DUMMY ARGS USED IN VARIABLE DIMENSIONING;
4020: C CHECKS SUCH BOUNDS FOR TYPE INTEGER
4021: C CALLS OUTSYM TO PRINT SYMBOL TABLE
4022: C CHECKS FOR UNDEFINED LABELS,MISSING DO ENDINGS,
4023: C PROPER BRANCHING THROUGHOUT PGM,
4024: C FIXES UP ALL LABELS WHOSE SCOPE IS NOT YET LIMITED
4025: C SETS USAGE OF ALL IDS TO VARIABLE IF USAGE NOT YET SET
4026: C RESETS FCN USAGE IN FCN SUBPROGRAM
4027: C
4028: INTEGER OUTUT, OUTUT2, OUTUT3, OUTUT4
4029: INTEGER PDSA, SYMLEN, BNEXT, SYMHD, STACK, DSA
4030: LOGICAL OPT, P1ERR
4031: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
4032: * OUTUT4
4033: COMMON /OPTNS/ OPT(5), P1ERR
4034: COMMON /FACTS/ NAME, NOST, ITYP, IASF
4035: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
4036: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
4037: COMMON /CEXPRS/ LSTACK, STACK(620)
4038: I = IGATT1(NAME,8)
4039: IF((I.NE.3 .AND. I.NE.10) .OR. DSA(NAME+2).EQ.0) GOTO 40
4040: C
4041: C ARGUMENT CHECKING- FOR USE IN VARIABLE DIMENSIONING OF ARRAYS
4042: C
4043: LL = 1
4044: L = DSA(NAME+2)
4045: NPAR = 0
4046: 10 IF (L.EQ.0) GO TO 40
4047: NPAR = NPAR + 1
4048: C CHECK FOR PROC ARGS TO ENTER THEIR RELATIVE POSIT
4049: C IN ARGLIST IN WD 3 OF THEIR SYMBOL TABLE ENTRY
4050: I = IGATT1(DSA(L),8)
4051: IF (I.NE.5 .AND. I.NE.6 .AND. I.NE.13) GO TO 20
4052: I = DSA(L)
4053: DSA(I+2) = NPAR
4054: GO TO 30
4055: 20 I = IGATT1(DSA(L),6)
4056: IF (I.EQ.0) GO TO 30
4057: I = IGATT1(DSA(L),7)
4058: IF (I.NE.0) GO TO 30
4059: I = IGATT1(DSA(L),5)
4060: K = DSA(L)
4061: IF (I.GT.0) CALL ERROR2(
4062: * 57H ILLEGALLY RESET DUMMY ARG USED IN VARIABLE DIMENSIONING ,
4063: * 57, DSA(K+4), 1, 1, 1)
4064: I = IGATT1(K,1)
4065: IF (MOD(I,8).NE.2) CALL ERROR2(
4066: * 47H ILLEGAL DATA TYPE USED IN ADJUSTIBLE DIMENSION, 47
4067: * , DSA(K+4), 1, 1, 1)
4068: 30 L = DSA(L+1)
4069: GO TO 10
4070: C
4071: C OUTPUT TABLE
4072: C
4073: 40 CALL DOCHK(1)
4074: C
4075: C CHECK LABELS DEFINED AND WITHIN SCOPE
4076: C
4077: I = LABHD
4078: 50 IF (I.EQ.0) GO TO 110
4079: L = IGATT1(I,2)
4080: IF (L.EQ.1) GO TO 60
4081: CALL ERROR2(17H UNDEFINED LABEL , 17, DSA(I+4), 1, 1, 1)
4082: GO TO 100
4083: 60 L = IGATT1(I,1)
4084: IF (L.NE.1) GO TO 100
4085: L = DSA(I+2)
4086: L1 = DSA(L)
4087: KK = DSA(L+1)
4088: L2 = DSA(I+1)
4089: C
4090: C L3 POINTS TO LAST ELEMENT ON CIRCULAR LIST
4091: C
4092: L3 = L2
4093: 70 IF (DSA(L2).LE.KK .AND. DSA(L2).GE.L1) GO TO 90
4094: IF (DSA(L2).LT.0) GO TO 80
4095: CALL ERROR2(15H ILLEGAL BRANCH, 15, DSA(L2), -1, 1, 1)
4096: GO TO 90
4097: 80 DSA(L2) = IABS(DSA(L2))
4098: 90 L2 = DSA(L2+1)
4099: IF (L2.NE.L3) GO TO 70
4100: 100 I = DSA(I+3)
4101: GO TO 50
4102: C
4103: C SET <ID> USAGE IF NOT YET SET
4104: C
4105: 110 I = SYMHD
4106: 120 IF (I.EQ.0) GO TO 150
4107: K = IGATT1(I,8)
4108: IF (K.NE.0) GO TO 130
4109: CALL SATT1(I, 8, 10)
4110: GO TO 140
4111: 130 IF (K.NE.6) GO TO 140
4112: IF (IGATT1(I,1)/8.NE.1) GO TO 140
4113: CALL ERROR2(33H SUBROUTINE NAME CANNOT BE TYPED , 33, DSA(I+4),
4114: * 1, 1, 1)
4115: 140 I = DSA(I+3)
4116: GO TO 120
4117: C
4118: C RESET FCN USAGE IN FCN PROGRAM UNIT
4119: C
4120: 150 I = IGATT1(NAME,8)
4121: IF (I.NE.10) GO TO 160
4122: CALL SATT1(NAME, 8, 4)
4123: I = IGATT1(NAME,5)
4124: IF (I.EQ.0) CALL ERROR1(23H FUNCTION VALUE NOT SET, 23)
4125: C
4126: C SAVE BINARY COPY OF SYMBOL TABLE
4127: C
4128: 160 IF (OPT(3) .AND. .NOT.P1ERR) GO TO 170
4129: CALL ERROR1(36H P-U NOT SAVED FOR PASS2 PROCESSING , 36)
4130: K = 3
4131: L = 1
4132: WRITE(OUTUT2) L,K,L
4133: WRITE(OUTUT3) L,K,L
4134: GOTO 180
4135: 170 K = 1
4136: L = NEXT - 1
4137: I = L + 3
4138: WRITE (OUTUT2) I, K, (DSA(I),I=1,L), NAME, SYMHD, LABHD
4139: L = 3
4140: WRITE (OUTUT3) K, L, K
4141: 180 CALL OUTSYM
4142: RETURN
4143: END
4144: C XXXXXEXPR.f
4145: INTEGER FUNCTION EXPR(LOGEX)
4146: C
4147: C LOGEX IS A DUMMY ARG , NEVER USED
4148: C FALSE IF AN ARITHMETIC EXPRESSION WAS FOUND
4149: C PRE IS PRECEDENCE TABLE, PRE(I,J) GIVES ACTION TAKEN WHEN OP I
4150: C IS ON THE STACK, OP J IN THE INPUT
4151: C CUROP IS CURRENT TOKEN TYPE
4152: C PREVOP IS PREVIOUS TOKEN TYPE (LAST ONE PROCESSED BEFORE CUROP)
4153: C STACK IS OPERAND STACK GROWING FROM TOP (1,2 ETC)
4154: C OPERATER STACK GROWING FROM BOTTOM UP(100,99 ETC)
4155: C PARENS COUNTS NESTING LEVEL OF PARENTHESES AND FUNCTION CALLS
4156: C
4157: C*****EXPRS
4158: C PT (INT) POINTER TO NEXT FREE WORD ON OPERAND STACK (GROWS
4159: C FROM STACK(1))
4160: C PB (INT) POINTER TO NEXT FREE WORD ON OPERATOR STACK (GROWS
4161: C FROM STACK(LSTACK))
4162: C AO(*,*) (INT) ARRAY GIVES TYPES OF ARITH OPERATIONS
4163: C AO(I,J) = TYPE OF (TYPE I <ARITH-OP> TYPE J)
4164: C RO(*,*) (INT) ARRAY TELLS LEGALITY OF RELATIONAL OPERATIONS
4165: C RO(I,J) = 1 IF TYPE I <RELOP> TYPEJ IS LEGAL; ELSE IS 0
4166: C EX(*,*) (INT) ARRAY GIVES TYPES OF ** OPERATION
4167: C EX(I,J) = TYPE OF (TYPE I <**> TYPE J)
4168: C
4169: INTEGER PRE(12,12), EX(4,4), AO(4,4), CUROP, PREVOP, RO(3,3),
4170: * STACK, PARENS, STMT, PSTMT, PT, PB, SYMLEN, PDSA, OUTUT,
4171: * GETTOK, IBR(14), JBR(13), ADJ(5,4), OUTUT2, DSA, OUTUT3,
4172: * OUTUT4, PREF, REF
4173: LOGICAL FLUSH, ERR, SYSERR, CALLST, DOVAR, OPT, ABORT, P1ERR
4174: LOGICAL INTEXT
4175: COMMON /DETECT/ ERR, SYSERR, ABORT
4176: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
4177: COMMON /EXPRS/ PT, PB, AO, RO, EX
4178: COMMON /CEXPRS/ LSTACK, STACK(620)
4179: COMMON /CREF/ LREF, PREF, REF(100)
4180: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
4181: * OUTUT4
4182: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
4183: COMMON /OPTNS/ OPT(5), P1ERR
4184: COMMON /FACTS/ NAME, NOST, ITYP, IASF
4185: DATA K /0/
4186: DATA PRE(1,1) /6/, PRE(1,2) /6/, PRE(1,3) /4/, PRE(1,5) /4/,
4187: * PRE(1,6) /2/, PRE(1,7) /4/, PRE(1,8) /6/, PRE(1,9) /6/,
4188: * PRE(1,10) /6/, PRE(1,4) /-1/, PRE(1,11) /6/, PRE(2,1) /-1/,
4189: * PRE(2,2) /-1/, PRE(2,3) /-1/, PRE(2,5) /-1/, PRE(2,6) /-1/,
4190: * PRE(2,7) /-1/, PRE(2,8) /-1/, PRE(2,9) /-1/, PRE(2,10) /-1/,
4191: * PRE(2,4) /-1/, PRE(2,11) /-1/, PRE(3,1) /6/, PRE(3,2) /6/,
4192: * PRE(3,3) /-1/, PRE(3,5) /4/, PRE(3,6) /2/, PRE(3,7) /6/,
4193: * PRE(3,8) /6/, PRE(3,9) /6/, PRE(3,10) /6/, PRE(3,4) /-1/,
4194: * PRE(3,11) /6/, PRE(5,1) /5/, PRE(5,2) /7/, PRE(5,3) /4/,
4195: * PRE(5,5) /4/, PRE(5,6) /2/, PRE(5,7) /4/, PRE(5,8) /-1/,
4196: * PRE(5,9) /4/, PRE(5,10) /4/, PRE(5,4) /4/, PRE(5,11) /4/,
4197: * PRE(6,1) /5/, PRE(6,2) /1/, PRE(6,3) /4/, PRE(6,5) /4/,
4198: * PRE(6,6) /2/, PRE(6,7) /4/, PRE(6,8) /3/, PRE(6,9) /4/,
4199: * PRE(6,10) /4/, PRE(6,4) /4/, PRE(6,11) /4/
4200: DATA PRE(7,1) /6/, PRE(7,2) /6/, PRE(7,3) /4/, PRE(7,5) /4/,
4201: * PRE(7,6) /2/, PRE(7,7) /6/, PRE(7,8) /6/, PRE(7,9) /6/,
4202: * PRE(7,10) /6/, PRE(7,4) /-1/, PRE(7,11) /6/, PRE(8,1) /-1/,
4203: * PRE(8,2) /-1/, PRE(8,3) /-1/, PRE(8,5) /-1/, PRE(8,6) /-1/,
4204: * PRE(8,7) /-1/, PRE(8,8) /-1/, PRE(8,9) /-1/, PRE(8,10) /-1/,
4205: * PRE(8,4) /-1/, PRE(8,11) /-1/, PRE(9,1) /5/, PRE(9,2) /6/,
4206: * PRE(9,3) /4/, PRE(9,5) /4/, PRE(9,6) /2/, PRE(9,7) /4/,
4207: * PRE(9,8) /6/, PRE(9,9) /6/, PRE(9,10) /6/, PRE(9,4) /4/,
4208: * PRE(9,11) /4/, PRE(10,1) /5/, PRE(10,2) /6/, PRE(10,3) /4/,
4209: * PRE(10,5) /4/, PRE(10,6) /2/, PRE(10,7) /4/, PRE(10,8) /6/,
4210: * PRE(10,9) /4/, PRE(10,10) /6/, PRE(10,4) /4/, PRE(10,11) /4/,
4211: * PRE(4,1) /5/, PRE(4,2) /6/, PRE(4,3) /4/, PRE(4,5) /4/,
4212: * PRE(4,6) /2/, PRE(4,7) /4/, PRE(4,8) /6/, PRE(4,9) /6/,
4213: * PRE(4,10) /6/, PRE(4,4) /-1/, PRE(4,11) /4/, PRE(11,1) /5/,
4214: * PRE(11,2) /6/, PRE(11,3) /4/, PRE(11,5) /4/, PRE(11,6) /2/,
4215: * PRE(11,7) /4/, PRE(11,8) /6/, PRE(11,9) /6/, PRE(11,10) /6/,
4216: * PRE(11,4) /-1/, PRE(11,11) /6/
4217: DATA PRE(12,1), PRE(12,3), PRE(12,7), PRE(12,11) /4*6/, PRE(12,2)
4218: * /6/, PRE(12,5) /4/, PRE(12,6) /2/, PRE(12,8) /6/, PRE(12,4),
4219: * PRE(12,9), PRE(12,10) /3*6/, PRE(1,12), PRE(2,12), PRE(3,12),
4220: * PRE(7,12), PRE(12,12) /5*-1/, PRE(5,12), PRE(6,12),
4221: * PRE(8,12), PRE(9,12), PRE(10,12), PRE(4,12), PRE(11,12) /7*4/
4222: DATA IBR(1), IBR(3), IBR(7), IBR(12) /4*1/, IBR(2) /2/, IBR(4),
4223: * IBR(11) /2*3/, IBR(9), IBR(10) /2*5/, IBR(8), IBR(5), IBR(6)
4224: * /3*4/, IBR(13) /2/, IBR(14) /4/, JBR(1), JBR(12) /2*1/,
4225: * JBR(2), JBR(3), JBR(7), JBR(9), JBR(10), JBR(11), JBR(8)
4226: * /7*2/, JBR(4) /3/, JBR(5), JBR(6) /2*4/, JBR(13) /4/
4227: DATA ADJ(1,1), ADJ(1,2), ADJ(1,3) /3*-1/, ADJ(1,4) /0/, ADJ(2,1),
4228: * ADJ(2,2) /2*0/, ADJ(2,3), ADJ(2,4) /2*-1/, ADJ(3,1) /1/,
4229: * ADJ(3,4) /0/, ADJ(3,2), ADJ(3,3) /2*-1/, ADJ(5,1) /1/,
4230: * ADJ(5,3), ADJ(5,4) /2*0/, ADJ(5,2) /-1/, ADJ(4,1), ADJ(4,3),
4231: * ADJ(4,4) /3*0/, ADJ(4,2) /-1/
4232: C
4233: C CODES IN OPERAND STACK
4234: C 0....DOUBLE PRECISION 1....REAL 2....INTEGER
4235: C 3....COMPLEX 4....LOGICAL 5....HOLLERITH
4236: C 6....PROCEDURE NAME
4237: C CODES FOR OPERATORS
4238: C 11 +,- 12 ) 13 ** 14 .NOT. 15 ( 16 FCN(
4239: C 17 /,* 18 , 19 .AND. 20 .OR. 21 .EQ. 22 UNARY -,+
4240: C
4241: PB = LSTACK
4242: PT = 1
4243: CALLST = .FALSE.
4244: PREVOP = -1
4245: CUROP = 0
4246: PARENS = 0
4247: FLUSH = .FALSE.
4248: EXPR = -1
4249: 10 IF (PSTMT.LT.NSTMT .AND. .NOT.CALLST) GO TO 110
4250: C
4251: C FINISH RECOGNITION OF EXPRESSION; POP OPERAND STACK AND RETURN
4252: C TYPE OF EXPRESSION
4253: C
4254: 20 IF (PARENS.EQ.0) GO TO 40
4255: 30 CALL ERROR1(37H UNBALANCED PARENTHESES IN EXPRESSION, 37)
4256: IF (FLUSH) GO TO 530
4257: GO TO 80
4258: 40 IF (PB.EQ.LSTACK .OR. CALLST) GO TO 60
4259: 50 CALL POP
4260: IF (ERR) GO TO 530
4261: IF (PB.LT.LSTACK) GO TO 50
4262: 60 IF (PT.NE.3) GO TO 90
4263: IF (STACK(1).EQ.0) GO TO 70
4264: I = IGATT1(STACK(1),8)
4265: IF (I.EQ.0) CALL SATT1(STACK(1), 8, 10)
4266: 70 EXPR = STACK(2)
4267: 80 PSTMT = K2
4268: ERR = .FALSE.
4269: RETURN
4270: 90 CALL ERROR1(29H INVALID SYNTAX IN EXPRESSION, 29)
4271: IF (FLUSH) GO TO 530
4272: GO TO 80
4273: 100 CALL ERROR1(31H EXPRESSION TOO LONG TO PROCESS, 31)
4274: GO TO 530
4275: C
4276: C CONTINUING PROCESSING THE EXPRESSION, IDENTIFY NEXT TOKEN,
4277: C
4278: 110 CUROP = GETTOK(PSTMT,K2)
4279: IF (ERR) GO TO 80
4280: C
4281: C SEE END OF EXPRESSION: ")" <ID> OR <LABEL>; GETTOK RETURNS
4282: C SAME CODES AS THOSE ABOVE EXCEPT 6 IS ID, 16 IS FCN( OR ARRAY ELE
4283: C
4284: IF (CUROP.NE.6 .AND. CUROP.NE.2 .AND. CUROP.NE.16 .OR.
4285: * PREVOP.NE.12) GO TO 120
4286: K2 = PSTMT
4287: GO TO 20
4288: C
4289: C CHECK FOR ADJACENT OPERATORS OR OPERANDS.
4290: C
4291: 120 IF (PREVOP.LE.6) GO TO 130
4292: I = IBR(PREVOP-10)
4293: GO TO 140
4294: 130 I = IBR(13)
4295: IF(PREVOP.EQ.(-1)) I = IBR(14)
4296: 140 IF (CUROP.LE.6) GO TO 150
4297: I2 = JBR(CUROP-10)
4298: GO TO 160
4299: 150 I2 = JBR(13)
4300: 160 IF (I.GE.3 .AND. I2.EQ.1) CUROP = 22
4301: IF (ADJ(I,I2)) 170, 190, 180
4302: 170 CALL ERROR1(44H ADJACENT PLACEMENT OF OPERATORS OR OPERANDS, 44)
4303: GO TO 530
4304: 180 CALL ERROR1(
4305: * 54H WARNING - ADJACENT PLACEMENT OF OPERATOR AND UNARY -+, 54)
4306: 190 IF (CUROP.GT.6 .AND. CUROP.NE.16) GO TO 290
4307: IF (CUROP.LT.6) GO TO 280
4308: C
4309: C PROCESS ID OR FCN( OR ARRAY ELEMENT OR ARRAY
4310: C LOOKUP SYMBOL TABLE ENTRY TO IDENTIFY ARRAYS AND TO IMPLICITLY
4311: C TYPE IDENTIFIERS IF NECESSARY.
4312: C
4313: IF (CUROP.EQ.6) GO TO 200
4314: K = LOOKUP(K2-1,.FALSE.)
4315: GO TO 210
4316: 200 K = LOOKUP(K2,.FALSE.)
4317: 210 IF (SYSERR) GO TO 530
4318: I1 = IGATT1(K,1)
4319: I2 = IGATT1(K,7)
4320: I3 = IGATT1(K,8)
4321: C
4322: C IMPLICITLY TYPE IDENTIFIERS AND FCNS
4323: C
4324: IF (I1.GT.0) GO TO 220
4325: I1 = 1
4326: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
4327: CALL SATT1(K, 1, I1)
4328: C
4329: C SEPARATE ARRAY ELEMENT, FCN REFERENCE,ASF REF.
4330: C
4331: 220 I1 = MOD(I1,8)
4332: IF (CUROP.NE.16) GO TO 250
4333: IF (I2.EQ.0) GO TO 240
4334: C
4335: C ARRAY ELEMENT--CHECK FOR BEING IN ASF DEF AND PEEL OFF
4336: C SUBSCRIPTS, CHECKING THEIR NUMBER
4337: C
4338: IF (ITYP.NE.31) GO TO 230
4339: CALL ERROR1(39H ILLEGAL USE OF ARRAY IN ASF DEFINITION, 39)
4340: 230 CUROP = I1
4341: I1 = CUROP + 16
4342: PSTMT = K2
4343: CALL SUBS(K2, I2)
4344: IF (ERR .OR. SYSERR) GO TO 80
4345: GO TO 270
4346: C
4347: C PROCESS FCN( OR ASF( REFERENCE; CHECK USAGE TO SEE
4348: C IF IS A LEGAL FCN OR ASF NAME I.E. IF WAS USED
4349: C AS A FCN, SUBR, ASF, OR WAS IN AN EXTERNAL STMT.
4350: C
4351: 240 IF (I3.EQ.0 .OR. I3.EQ.2 .OR. I3.EQ.5 .OR. I3.EQ.6 .OR. I3.EQ.13
4352: * .OR. I3.EQ.14) GO TO 290
4353: C
4354: C ACTUAL USAGE WILL BE DETERMINED BY CODE WHICH
4355: C STORES CALL TEMPLATE
4356: C
4357: CALL ERROR1(18H ILLEGAL USE OF ID, 18)
4358: GO TO 530
4359: C
4360: C VARIABLE, ARRAY, PROCEDURE NAME
4361: C
4362: 250 IF (I2.EQ.0) GO TO 260
4363: C
4364: C ARRAY
4365: C
4366: CUROP = I1
4367: I1 = CUROP + 8
4368: IF (I3.EQ.0) CALL SATT1(K, 8, 10)
4369: GO TO 270
4370: C
4371: C VARIABLE OR PROCEDURE
4372: C LEAVE IDS USAGE UNSET
4373: C THEY WILL BE SET LATER BY APPEARING AS OPERANDS OR BY BEING
4374: C DEFINED AS FCN OR SUBROUTINE REFS BY FOLLOWING PGMS
4375: C
4376: 260 IF (I3.EQ.0) GO TO 270
4377: IF (I3.EQ.5 .OR. I3.EQ.6 .OR. I3.EQ.13) I1 = 6
4378: IF (I3.EQ.10 .OR. I1.EQ.6) GO TO 270
4379: IF (ITYP.EQ.31 .AND. I3.EQ.1 .AND. DSA(K+2).EQ.IASF) GO TO 270
4380: CALL ERROR1(36H ILLEGAL VARIABLE USED IN EXPRESSION, 36)
4381: GO TO 530
4382: C
4383: C ENTER ARRAY,ID, PROCEDURE NAME, ARRAY ELEMENT INTO OPERAND STACK
4384: C UPDATE PREVOP,PSTMT. ALSO ENTER SYMBOL TABLE INDEX FOR THESE
4385: C PREVOP = 0,1,...6 FOR OPERANDS
4386: C 11,12,...22 FOR OPERATORS
4387: C
4388: 270 IF (PT+2.GE.PB) GO TO 100
4389: STACK(PT) = K
4390: STACK(PT+1) = I1
4391: PT = PT + 2
4392: PREVOP = CUROP
4393: PSTMT = K2
4394: GO TO 10
4395: C
4396: C ARE PROCESSING A CONSTANT
4397: C
4398: 280 I1 = CUROP
4399: K = 0
4400: GO TO 270
4401: C
4402: C ARE PROCESSING AN OPERATER
4403: C PRE(I,J) CONTAINS ACTION TAKEN GIVEN OPERATOR I ON STACK
4404: C AND OPERATOR J IN INPUT
4405: C
4406: 290 KNAME = K
4407: IF (CUROP.EQ.15 .OR. CUROP.EQ.16) PARENS = PARENS + 1
4408: IF (CUROP.EQ.12) PARENS = PARENS - 1
4409: IF (PARENS.GE.0) GO TO 300
4410: FLUSH = .TRUE.
4411: GO TO 30
4412: C
4413: C CHECKS FOR LEADING UNARY +,- IN EXPRESSIONS
4414: C
4415: 300 IF (PB.EQ.LSTACK) GO TO 460
4416: I = STACK(PB+1) - 10
4417: I2 = CUROP - 10
4418: K = PRE(I,I2)
4419: 310 IF (-1.NE.K) GO TO 320
4420: FLUSH = .TRUE.
4421: GO TO 90
4422: 320 GO TO (330, 470, 520, 480, 480, 490, 510), K
4423: C
4424: C CREATE TEMPLATE FROM FCN CALL
4425: C
4426: 330 IF (ITYP.EQ.18 .AND. PARENS.EQ.0) CALLST = .TRUE.
4427: L1 = STACK(PB+2)
4428: L2 = PT - 1
4429: C
4430: C CHECK FOR NO ARGS
4431: C
4432: IF (L2.GT.L1) GO TO 340
4433: CALL ERROR1(18H MISSING ARGUMENTS, 18)
4434: GO TO 450
4435: C
4436: C CHECK FOR NOT CHANGING THROUGH SUBROUTINE CALL THE DO CONTROL
4437: C VARIABLE OF A CURRENT LOOP OR ANY ADJUSTIBLE DIMENSION DUMMY ARG
4438: C
4439: 340 DO 380 I=L1,L2,2
4440: IF (STACK(I)) 350, 380, 350
4441: 350 IF (DOVAR(STACK(I))) STACK(I+1) = STACK(I+1) + 32
4442: I1 = IGATT1(STACK(I),4)
4443: IF (I1) 380, 380, 360
4444: 360 I1 = IGATT1(STACK(I),6)
4445: IF (I1) 380, 380, 370
4446: 370 STACK(I+1) = STACK(I+1) + 64
4447: 380 CONTINUE
4448: C
4449: C CHECK FOR USE OF ID AS FCN ONCE AND AS SUBROUTINE LATER
4450: C OR VICE VERSA
4451: C
4452: I = STACK(PB+3)
4453: L = IGATT1(I,8)
4454: IF (L.EQ.2 .OR. L.EQ.5 .OR. L.EQ.6) GO TO 410
4455: IF (.NOT.INTEXT(I,L1,L2,.TRUE.)) GO TO 390
4456: C
4457: C FOUND AN INTRINSIC FCN
4458: C CHECK NOT IN A CALL STMT USED AS A SUBROUTINE
4459: C
4460: IF (CALLST) GO TO 420
4461: GO TO 450
4462: C
4463: C DEFINE FCN( USAGE IF UNSET
4464: C SET USAGE OF ID USED AS A PROC
4465: C
4466: 390 IF (CALLST) GO TO 400
4467: CALL SATT1(I, 8, 5)
4468: GO TO 430
4469: 400 CALL SATT1(I, 8, 6)
4470: GO TO 430
4471: C
4472: C CHECK USAGE OF PROC ALREADY USED IN PROGRAM UNIT
4473: C
4474: 410 IF (CALLST .AND. L.EQ.6 .OR. .NOT.CALLST .AND. (L.EQ.5 .OR.
4475: * L.EQ.2)) GO TO 430
4476: 420 CALL ERROR1(18H ILLEGAL REFERENCE, 18)
4477: GO TO 450
4478: 430 IF (.NOT.OPT(3) .OR. P1ERR) GO TO 450
4479: C
4480: C LOAD INTO STACK COUNT OF WORDS IN DESCRIPTOR, INDEX OF FCN
4481: C IN SYMBOL TABLE, STMT NO OF REFERENCE
4482: C
4483: IF (PT+3.GE.PB) GO TO 100
4484: STACK(PT) = PT - STACK(PB+2)
4485: STACK(PT+1) = STACK(PB+3)
4486: STACK(PT+2) = NOST
4487: STACK(PT+3) = 6 - IGATT1(STACK(PB+3),8)
4488: L3 = PT + 3
4489: ICOD = 2
4490: L = L2 - L1 + 5
4491: IF (L.LE.LREF) GO TO 440
4492: CALL ERROR1(44H IN EXPR, TABLE OVERFLOW OF REF, REF IGNORED, 44)
4493: GO TO 450
4494: 440 WRITE (OUTUT3) L, ICOD, (STACK(I),I=PT,L3), (STACK(I),I=L1,L2)
4495: C
4496: C FCN REF POPPED AND PROPER TYPE PUT ON OPERAND STACK
4497: C
4498: 450 PT = STACK(PB+2)
4499: I1 = IGATT1(STACK(PB+3),1)
4500: STACK(PT) = 0
4501: STACK(PT+1) = MOD(I1,8)
4502: PT = PT + 2
4503: PB = PB + 3
4504: GO TO 520
4505: C
4506: C HANDLES FIRST OPERATOR IN EXPRESSION--WILL ALWAYS BE PUSHED ONTO
4507: C OPERATOR STACK. FCN( HAS SPECIAL PUSH.
4508: C
4509: 460 IF (CUROP.NE.16) GO TO 480
4510: C
4511: C FOUND "FCN(" CONSTRUCT ; STORE 3 THINGS IN STACK
4512: C PTR TO FCN NAME IN SYMBOL TABLE; PTR TO 1ST ARGE IN STACK ;
4513: C OPERAND CODE FOR FCN(
4514: C
4515: 470 IF (PB-3.LE.PT) GO TO 100
4516: STACK(PB) = KNAME
4517: STACK(PB-1) = PT
4518: STACK(PB-2) = CUROP
4519: PB = PB - 3
4520: GO TO 520
4521: C
4522: C SIMPLE PUSH ONTO OPERATOR STACK
4523: C
4524: 480 IF (PB-1.EQ.PT) GO TO 100
4525: STACK(PB) = CUROP
4526: PB = PB - 1
4527: GO TO 520
4528: C
4529: C POP OPERATOR FROM STACK. IF STACK EMPTY, PUSH CUROP ONTO
4530: C STACK. ELSE TAKE ACTION SPECIFIED BY PRE(TOP OPERATOR,CUROP).
4531: C
4532: 490 CALL POP
4533: IF (ERR) GO TO 530
4534: IF (PB.LT.LSTACK) GO TO 500
4535: GO TO 480
4536: 500 I = STACK(PB+1) - 10
4537: K = PRE(I,CUROP-10)
4538: GO TO 310
4539: C
4540: C POP "(" WHEN HAVE FINISHED A PARENTHESIZED EXPRESSION
4541: C
4542: 510 CALL POP
4543: IF (ERR) GO TO 530
4544: C
4545: C UPDATE PREVOP,PSTMT AFTER FINISHING PROCESSING AN OPERATOR
4546: C
4547: 520 PREVOP = CUROP
4548: PSTMT = K2
4549: GO TO 10
4550: C
4551: C JOB OF THIS CODE IS TO FLISH TO END OF UNRECOGNIZABLE
4552: C EXPRESSION
4553: C
4554: 530 K2 = PSTMT
4555: ERR = .FALSE.
4556: 540 IF (K2.GE.NSTMT) GO TO 80
4557: IF (STMT(K2).EQ.65) PARENS = PARENS + 1
4558: IF (STMT(K2).NE.62) GO TO 550
4559: PARENS = PARENS - 1
4560: IF (PARENS.EQ.0) GO TO 560
4561: 550 K2 = K2 + 1
4562: GO TO 540
4563: 560 I = GETTOK(K2,I2)
4564: K2 = I2
4565: IF ((I.EQ.1 .OR. I.EQ.6) .OR. ERR) GO TO 80
4566: GO TO 540
4567: END
4568: C XXXXXINSTMT.f
4569: SUBROUTINE INSTMT(EOF, NCARD)
4570: LOGICAL ILLEG, ILHOL, ILCONT
4571: LOGICAL NEWRD, EOF, CONT, OPT, P1ERR
4572: INTEGER PSTMT, CARD(80), OUTUT, BLK, STATE, HCOUNT, STMT
4573: INTEGER SYMLEN, OUTUT2, OUTUT3, OUTUT4
4574: DIMENSION IBR(5)
4575: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
4576: COMMON /OPTNS/ OPT(5), P1ERR
4577: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
4578: * OUTUT4
4579: COMMON /FACTS/ NAME, NOST, ITYP, IASF
4580: DATA NEWRD /.TRUE./
4581: DATA IBR(1), IBR(2), IBR(3), IBR(4), IBR(5) /1H*,1HC,1H.,1H0,1H /
4582: DATA CARD(1) /1H /
4583: C
4584: C ROUTINE INPUTS AN ENTIRE FORTRAN STATEMENT. IT IS PASSED 1 CHAR
4585: C PER ELEMENT IN THE ARRAY STMT.
4586: C IN SHOULD BE CALLED AGAIN IF ERR IS TRUE.
4587: C EACH CARD IS WRITTEN OUT BEFORE BEING PARSED.
4588: C IN DEBLANKS CARDS USES THE VARIABLE STATE TO FIND
4589: C HOLLERITHS:
4590: C STATE = 0.....LOOK FOR BREAK CHAR
4591: C 1.....HAVE BREAK CHAR AND NEED DIGIT
4592: C 2.....HAVE DIGIT AND NEED DIGIT OR "H"
4593: C 3....NEED TO SKIP OVER THESE CHARS, PART OF HOLLERITH
4594: C NOTE: USE "90" AS AN END OF STMT MARKER
4595: C
4596: C NEWRD IS TRUE IF A NEW CARD IS NECESSARY; ELSE CARD IN BUFFER
4597: C IS USED. EOF IS TRUE WHEN END-OF-FILE CARD ("." IN COL 1)
4598: C IS READ NCARD GIVES # OF CARDS READ FOR THIS STMT
4599: C
4600: 10 NOST = NOST + 1
4601: STATE = 0
4602: NSTMT = 0
4603: ILLEG = .FALSE.
4604: ILCONT = .FALSE.
4605: ILHOL = .FALSE.
4606: NCARD = 0
4607: CONT = .FALSE.
4608: 20 IF (NEWRD) CALL IN(CARD, INUT)
4609: IF (CARD(1).NE.IBR(2) .OR. CARD(2).NE.IBR(1)) GO TO 40
4610: C
4611: C DEAL WITH OPTIONS CARD
4612: C
4613: IF (CONT) GO TO 50
4614: CALL INOPT(CARD)
4615: 30 IF (OPT(4)) WRITE (OUTUT,99999) CARD
4616: 99999 FORMAT (11X, 80A1)
4617: NEWRD = .TRUE.
4618: GO TO 20
4619: 40 IF (CARD(1).NE.IBR(2)) GO TO 70
4620: C
4621: C DEAL WITH COMMENT CARD
4622: C
4623: IF (.NOT.CONT) GO TO 30
4624: C
4625: C HAVE COMPLETED STMT
4626: C
4627: 50 NEWRD = .FALSE.
4628: NSTMT = NSTMT + 1
4629: STMT(NSTMT) = 90
4630: 60 IF (ILLEG) CALL ERROR1(
4631: * 40H WARNING - NON-FORTRAN CHARACTER IGNORED, 40)
4632: IF (ILHOL) CALL ERROR1(
4633: * 46H WARNING - NON-FORTRAN CHARACTER IN HOLLERITH , 46)
4634: IF (ILCONT) CALL ERROR1(
4635: * 45H WARNING - NON-FORTRAN CONTINUATION CHARACTER, 45)
4636: RETURN
4637: 70 IF (CARD(1).NE.IBR(3)) GO TO 80
4638: C
4639: C HAVE EOF
4640: C
4641: IF (CONT) GO TO 50
4642: EOF = .TRUE.
4643: GO TO 60
4644: 80 IF (CARD(6).EQ.IBR(4) .OR. CARD(6).EQ.IBR(5)) GO TO 100
4645: C
4646: C DEAL WITH CONTINUATION CARD
4647: C
4648: II = MAPCHR(CARD(6),ILCONT)
4649: IF (CONT) GO TO 110
4650: CALL ERROR1(40H WARNING - CONTINUATION NOT ALLOWED HERE, 40)
4651: C
4652: C FLUSH TO NEXT NONCONTINUATION CARD
4653: C
4654: 90 IF (OPT(4)) WRITE (OUTUT,99998) NOST, CARD
4655: 99998 FORMAT (1H , I5, 5X, 80A1)
4656: CALL IN(CARD, INUT)
4657: IF (CARD(1).NE.IBR(1) .AND. CARD(1).NE.IBR(2) .AND.
4658: * CARD(1).NE.IBR(3) .AND. CARD(6).NE.IBR(4) .AND.
4659: * CARD(6).NE.IBR(5)) GO TO 90
4660: NEWRD = .FALSE.
4661: GO TO 10
4662: C
4663: C DEAL WITH A NON-CONTINUATION CARD
4664: C
4665: 100 IF (CONT) GO TO 50
4666: C DEAL WITH A LEGAL CONTIN OR NONCONTIN CARD
4667: 110 NCARD = NCARD + 1
4668: IF (NCARD.LT.21) GO TO 120
4669: CALL ERROR1(33H WARNING - TOO MANY CONTINUATIONS, 33)
4670: GO TO 90
4671: 120 IF (OPT(4)) WRITE (OUTUT,99998) NOST, CARD
4672: NEWRD = .TRUE.
4673: BLK = 0
4674: IF (NSTMT.NE.0) GO TO 150
4675: DO 130 I=1,5
4676: NSTMT = NSTMT + 1
4677: STMT(NSTMT) = MAPCHR(CARD(I),ILLEG)
4678: 130 CONTINUE
4679: 140 I = 7
4680: GO TO 180
4681: 150 DO 160 I=1,5
4682: IF (MAPCHR(CARD(I),ILLEG).NE.69) GO TO 170
4683: 160 CONTINUE
4684: GO TO 140
4685: 170 CALL ERROR1(40H WARNING - ILLEGAL LABEL WILL BE IGNORED, 40)
4686: GO TO 140
4687: 180 IF (I.LE.72) GO TO 200
4688: C
4689: C AFTER TRANSLATE CARD CHECK FOR BLANK CARD
4690: C AND GO BACK FOR A CONTINUATION CARD
4691: C
4692: IF (BLK.NE.66) GO TO 190
4693: CALL ERROR1(33H WARNING - BLANK CARD ENCOUNTERED, 33)
4694: GO TO 90
4695: 190 CONT = .TRUE.
4696: GO TO 20
4697: 200 IF (STATE.NE.3) GO TO 210
4698: C
4699: C STATE 3 --ARE PROCESSING A HOLLERITH
4700: C
4701: HCOUNT = HCOUNT - 1
4702: KK = MAPCHR(CARD(I),ILHOL)
4703: IF (HCOUNT.EQ.0) STATE = 0
4704: GO TO 290
4705: 210 NSTMT = NSTMT + 1
4706: STMT(NSTMT) = MAPCHR(CARD(I),ILLEG)
4707: IF (STMT(NSTMT).NE.69) GO TO 220
4708: C
4709: C BLANK ENCOUNTERED AND DELETED
4710: C
4711: BLK = BLK + 1
4712: NSTMT = NSTMT - 1
4713: GO TO 290
4714: 220 KK = STATE + 1
4715: GO TO (280, 260, 230), KK
4716: C
4717: C STATE 2--SKIP OVER LEADING DIGIT STRING; LOOK FOR H
4718: C
4719: 230 IF (STMT(NSTMT).LE.9) GO TO 290
4720: IF (STMT(NSTMT).NE.37) GO TO 270
4721: C
4722: C PROCESS HOLLERITH COUNT
4723: C
4724: STMT(NSTMT) = -STMT(NSTMT)
4725: STATE = 3
4726: KK = NSTMT - KST
4727: I10 = 1
4728: HCOUNT = 0
4729: DO 240 K=1,KK
4730: JJ = NSTMT - K
4731: HCOUNT = HCOUNT + I10*STMT(JJ)
4732: I10 = I10*10
4733: 240 CONTINUE
4734: STMT(KST) = HCOUNT - 2048
4735: NSTMT = KST
4736: IF (HCOUNT.LE.0) GO TO 250
4737: GO TO 290
4738: C
4739: C AVOID THE 0H CONSTRUCTION
4740: C
4741: 250 CALL ERROR1(44H WARNING - 0H ILLEGAL HOLLERITH CONSTRUCTION, 44)
4742: STATE = 0
4743: GO TO 290
4744: C
4745: C STATE 1--LOOK FOR START OF DIGIT STRING BEFORE H
4746: C
4747: 260 IF (STMT(NSTMT).GT.9) GO TO 270
4748: STATE = 2
4749: KST = NSTMT
4750: GO TO 290
4751: C
4752: C CHECK FOR NESTED SPECIAL HEADING CHARS
4753: C
4754: 270 STATE = 0
4755: 280 IF ((STMT(NSTMT).LT.65) .OR. (STMT(NSTMT).GT.68)) GO TO 290
4756: STATE = 1
4757: 290 I = I + 1
4758: GO TO 180
4759: END
4760: C XXXXXIN.f
4761: SUBROUTINE IN(CARD, INUT)
4762: C
4763: INTEGER CARD(80)
4764: LOGICAL EOF
4765: C
4766: DATA EOF /.FALSE./
4767: DATA IDOT /1H./
4768: C
4769: IF (EOF) RETURN
4770: C
4771: C READ A CARD. PHYSICAL EOF SHOULD TRANSFER TO 100
4772: C
4773: READ (INUT,99999) CARD
4774: 99999 FORMAT (80A1)
4775: IF (CARD(1).NE.IDOT) RETURN
4776: C
4777: C HERE FOR EOF
4778: C
4779: 100 CARD(1) = IDOT
4780: EOF = .TRUE.
4781: C
4782: RETURN
4783: END
4784: C XXXXXINOPT.f
4785: SUBROUTINE INOPT(CARD)
4786: INTEGER S(8), CARD(80), J(5)
4787: LOGICAL OPT, P1ERR
4788: COMMON /OPTNS/ OPT(5), P1ERR
4789: DATA S(1), S(2), S(3), S(4), S(5), S(6), S(7) /1HS,1HR,1HP,1HL,
4790: * 1HC,1H,,1HN/, S(8) /1H /
4791: C
4792: C OPT(1) IF TRUE, PRINT SYMBOL TABLE
4793: C IF FALSE, NOSYMBOL TABLE PRINTED
4794: C OPT(2) IF TRUE, PRINT CROSS REFERENCES
4795: C IF FALSE, NO REFS PRINTED
4796: C OPT(3) IF TRUE, DO PASS 2; ELSE DO NOT
4797: C OPT(4) IF TRUE GET LISTING OF PGM; ELSE DO NOT
4798: C OPT(5) IF TRUE, COMPILE PGM AFTER PROCESSING; ELSE DO NOT
4799: C SET OPTIONS FROM CARD READ IN BY "IN"
4800: C P2 IS TURNED OFF ONLY ONCE A RUN; IT CANNOT BE TURNED ON AGAIN
4801: C OPTIONS CARD IS ONLY ACCEPTED IF SYNTAX ON CARD IS OK
4802: C SYNTAX IS C* FOLLOWED BY AT LEAST ONE OPTION OF THEFORM
4803: C OPT BLANKS, OPT N, AT LEAST ONE OF (S,R,P,L,C), OPT BLANKS
4804: C WHERE OPTIONS ARE SEPARATEDBY COMMAS
4805: C
4806: DO 10 I=1,5
4807: J(I) = 0
4808: 10 CONTINUE
4809: IP = 2
4810: 20 IP = IP + 1
4811: IF (IP.GE.73) GO TO 60
4812: C DEBLANK LEADING BLANKS
4813: IF (CARD(IP).EQ.S(8)) GO TO 20
4814: L = 1
4815: C
4816: C CHECK FOR NEGATIVE
4817: C
4818: IF (CARD(IP).NE.S(7)) GO TO 30
4819: L = -1
4820: IP = IP + 1
4821: IF (IP.GE.73) GO TO 60
4822: 30 DO 40 I=1,5
4823: IF (S(I).NE.CARD(IP)) GO TO 40
4824: J(I) = J(I) + L
4825: GO TO 50
4826: 40 CONTINUE
4827: GOTO 100
4828: C
4829: C FLUSH BLANKS TO NEXT COMMA
4830: C
4831: 50 IP = IP + 1
4832: IF (IP.GE.73) GO TO 60
4833: IF (CARD(IP).EQ.S(6)) GO TO 20
4834: IF(CARD(IP).NE.S(8)) GOTO 100
4835: GO TO 50
4836: 60 DO 90 K=1,5
4837: IF (J(K)) 70, 90, 80
4838: 70 OPT(K) = .FALSE.
4839: GO TO 90
4840: C DO NOT LET USER TURN ON PASS2 AFTER WE TURN IT OFF
4841: 80 IF (K.EQ.3 .AND. .NOT.OPT(3)) GO TO 90
4842: OPT(K) = .TRUE.
4843: 90 CONTINUE
4844: 100 RETURN
4845: END
4846: C XXXXXLIST.f
4847: SUBROUTINE LIST
4848: INTEGER STMT, PSTMT
4849: LOGICAL ERR, SYSERR, ABORT, IDLIST, IDO, FINDO
4850: LOGICAL SIO
4851: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
4852: COMMON /DETECT/ ERR, SYSERR, ABORT
4853: COMMON /LISTDO/ LPT, LEN, LS(64)
4854: C
4855: C ROUTINE PROCESSES THE LIST CONSTRUCT, USED IN I-O STMTS
4856: C LEV USED TO COUNT PARENTHESES LEVELS
4857: C
4858: SIO = .FALSE.
4859: LPT = LEN + 1
4860: FINDO = .FALSE.
4861: ICNT = 0
4862: LEV = 0
4863: 10 IF (STMT(PSTMT).NE.65) GO TO 20
4864: LEV = LEV + 1
4865: IF (LEV.GT.ICNT) ICNT = ICNT + 1
4866: PSTMT = PSTMT + 1
4867: GO TO 10
4868: 20 IF (PSTMT.GE.NSTMT) GO TO 120
4869: C
4870: C ALLOW <ID>=ARRAY,ARRAY ELE., VARIABLE
4871: C
4872: IF (.NOT.IDLIST(IDO)) GO TO 130
4873: C
4874: C FALSE RETURN SIGNIFIES ERROR IN IDLIST
4875: C TRUE RETURN SIGNIFIES NO ERROR IN IDLIST
4876: C IDO = .TRUE. MEANS , <DOSPEC> IS NEXT
4877: C IDO = .FALSE. MEANS AT END-OF-STMT, ", (" , OR ")"
4878: C
4879: C FOUND <DOSPEC> )
4880: C
4881: IF (SYSERR) GO TO 130
4882: IF (.NOT.IDO) GO TO 30
4883: PSTMT = PSTMT + 1
4884: GO TO 100
4885: C
4886: C FOUND END OF SIMPLE LIST "( <IDLIST> )"
4887: C
4888: 30 IF (STMT(PSTMT).EQ.62) GO TO 60
4889: 40 IF (PSTMT.NE.NSTMT) GO TO 50
4890: C
4891: C AT END OF STMT
4892: C
4893: IF (FINDO) CALL LDOVAR
4894: IF (LEV.NE.0) GO TO 120
4895: GO TO 130
4896: C
4897: C NEED "," AND NEW <LIST> CONSTRUCT
4898: C
4899: 50 IF (STMT(PSTMT).NE.68) GO TO 120
4900: PSTMT = PSTMT + 1
4901: GO TO 10
4902: C
4903: C MUST CHECK FOR ILLEGALLY NESTED SIMPLE LISTS
4904: C SIMPLE LIST= ( <IDLIST> )
4905: C ICNT COUNTAINS LEVEL OF LAST SIMPLE LIST WITHIN A
4906: C PARENTHESIZED EXPRESSION
4907: C
4908: 60 SIO = .TRUE.
4909: IF (LEV.EQ.0) GO TO 120
4910: PSTMT = PSTMT + 1
4911: IF (ICNT.LE.LEV) GO TO 80
4912: 70 CALL ERROR1(28H ILLEGAL PARENTHESES NESTING, 28)
4913: GO TO 130
4914: 80 LEV = LEV - 1
4915: IF (LEV) 120, 110, 90
4916: C
4917: C CHECK FOR CONSTRUCT FOLLOWING <DOSPEC>
4918: C
4919: 90 IF (STMT(PSTMT).EQ.62) GO TO 70
4920: IF (STMT(PSTMT).NE.68) GO TO 120
4921: CALL NEXTOK(PSTMT+1, K2, K)
4922: IF (K.NE.0 .OR. STMT(K2).NE.63) GO TO 40
4923: PSTMT = PSTMT + 1
4924: C
4925: C LOOK FOR DOSPEC
4926: C
4927: 100 CALL DOSPEC(0, K2, .TRUE.)
4928: IF (SYSERR .OR. ERR) GO TO 130
4929: FINDO = .TRUE.
4930: IF (STMT(K2).NE.62) GO TO 120
4931: PSTMT = K2 + 1
4932: IF (ICNT.GT.LEV) ICNT = ICNT - 1
4933: GO TO 80
4934: C
4935: C CHECK NESTED DOSPECS IN LIST
4936: C
4937: 110 IF (LEV.NE.0 .OR. .NOT.FINDO) GO TO 40
4938: FINDO = .FALSE.
4939: CALL LDOVAR
4940: LPT = LEN + 1
4941: GO TO 40
4942: 120 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
4943: IF (FINDO) CALL LDOVAR
4944: 130 IF (SIO) CALL ERROR1(34H REDUNDANT PARENTHESES ARE ILLEGAL, 34)
4945: RETURN
4946: END
4947: C XXXXXLOOKUP.f
4948: INTEGER FUNCTION LOOKUP(K1, LABEL)
4949: C
4950: C STMT(PSTMT)-STMT(K2-1) TO BE ENTERED IN DSA
4951: C LABEL IS TRUE IF SYMBOL IS A LABEL. ROUTINE
4952: C RETURNS VALUE OF INDEX OF SYMBOL IN DSA, CREATING
4953: C A NEW ENTRY ID NESESSARY. IT ENTERS SYMBOL INTO
4954: C SYMBOL OR LABEL CHAIN AND CREATES A CROSSREFERENCE
4955: C ENTRY FOR THE CURRENT STATMT NUMBER
4956: C
4957: INTEGER PSTMT, SYMLEN, DSA, HASH, L(6), LL(6)
4958: INTEGER BLANK, SYMHD, STMT, OUTUT, BNEXT, Q(70)
4959: INTEGER PDSA, OUTUT2, OUTUT3, OUTUT4
4960: LOGICAL LABEL, ERR, P1ERR, OPT, SYSERR, ABORT
4961: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
4962: * OUTUT4
4963: COMMON /DETECT/ ERR, SYSERR, ABORT
4964: COMMON /FACTS/ NAME, NOST, ITYP, IASF
4965: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
4966: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
4967: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
4968: COMMON /CHASH/ LHASH, HASH(401)
4969: COMMON /TRANS/ Q
4970: COMMON /OPTNS/ OPT(5), P1ERR
4971: DATA BLANK /1H /
4972: K = K1 - PSTMT
4973: IF (K.LE.6) GO TO 10
4974: CALL ERROR1(39H IDENTIFIER TOO LONG, WILL BE TRUNCATED, 39)
4975: K = 6
4976: 10 KK = K
4977: DO 20 I=1,K
4978: II = PSTMT + I - 1
4979: J = STMT(II) + 1
4980: LL(I) = Q(J)
4981: 20 CONTINUE
4982: DO 30 I=1,SYMLEN
4983: L(I) = BLANK
4984: 30 CONTINUE
4985: CALL S5PACK(LL, L, K)
4986: C
4987: C HAVE PACKED SYMBOL;NOW CALCULATE HASH
4988: C HASH IS(PRODUCT OF FIRST AND THIRD LETTERS PLUS SECOND) MOD 257
4989: C
4990: IF (KK.LT.3) GO TO 50
4991: IHASHS = STMT(PSTMT)*STMT(PSTMT+2) + STMT(PSTMT+1)
4992: 40 IHASHS = MOD(IHASHS,LHASH)
4993: ISAVE = IHASHS
4994: IHASH = IHASHS + 1
4995: GO TO 80
4996: 50 IHASHS = STMT(PSTMT)
4997: GO TO (60, 70), KK
4998: 60 IHASHS = IHASHS*69 + 69
4999: GO TO 40
5000: 70 IHASHS = IHASHS*69 + STMT(PSTMT+1)
5001: GO TO 40
5002: 80 IF (HASH(IHASH).EQ.0) GO TO 140
5003: C
5004: C IF TABLE EMPTY, CREATE ENTRY, SEND BACK INDEX OF FIRST WORD IN DSA
5005: C ELSE COMPARE SYMBOL TO ID AND RETURN INDEX OF PROPER ENTRY IN HASH
5006: C TABLE AFTER RESOLVING COLLISION
5007: C
5008: DO 90 J=1,SYMLEN
5009: II = HASH(IHASH) + 3 + J
5010: IF (L(J).NE.DSA(II)) GO TO 100
5011: 90 CONTINUE
5012: LOOKUP = HASH(IHASH)
5013: IF (DSA(LOOKUP+1)) 190, 190, 200
5014: C
5015: C RESOLVE CONFLICTS BY LINEAR CONGRUENCE
5016: C
5017: 100 IHASHS = MOD(IHASHS+1,LHASH)
5018: IF (IHASHS.EQ.ISAVE) GO TO 110
5019: IHASH = IHASHS + 1
5020: GO TO 80
5021: 110 CALL ERROR1(34H IN LOOKUP, TABLE OVERFLOW OF HASH, 34)
5022: 120 SYSERR = .TRUE.
5023: RETURN
5024: 130 CALL ERROR1(33H IN LOOKUP, TABLE OVERFLOW OF DSA, 33)
5025: GO TO 120
5026: C
5027: C CREATE NEW SYMBOL TABLE ENTRY; ZERO ITS CROSSREF TAIL PTR
5028: C
5029: 140 HASH(IHASH) = NEXT
5030: IF (NEXT+6+SYMLEN.GE.BNEXT) GO TO 130
5031: LOOKUP = NEXT
5032: C
5033: C*****DSA
5034: C 1ST WORD..... ATTRIBUTE WORD
5035: C FIELD 1
5036: C
5037: C BITS 0-2*TYPE (FOR SYMBOL) 0 DOUBLE PRECISION, 1 REAL, 2 INT,
5038: C 3 COMPLEX,4 LOGICAL, 5 HOLLERITH
5039: C TYPE (FOR LABEL) 1 EXECUTABLE STMT, 2 NONEXEC. STMT,
5040: C 3 FORMAT STMT
5041: C BIT 3****EXPLICITLY TYPED 1, IMPLICITLY 0
5042: C FIELD 2
5043: C BIT 4****(FOR SYMBOL) IN COMMON 1, NOT IN COMMON 0
5044: C (FOR LABEL) DEFINED 1, REFERENCED 0
5045: C (FOR COMMON-NAME) INITIALIZED IN BLOCK DATA SUBPGM
5046: C FIELD 3
5047: C BIT 5****EQUIVALENCED 1
5048: C FIELD 4
5049: C BIT 6****DUMMY SUBROUTINE/FUNCTION ARGUMENT 1
5050: C FIELD 5
5051: C BIT 7****VALUE SET BY P.U. 1
5052: C FIELD 6
5053: C BIT 8****VARIABLE USED AS DIMENSION IN VARIABLY DIMENSIONED ARRAY
5054: C FIELD 7
5055: C BIT 9-10*SCALAR 0, NUMBER OF ARRAY BOUNDS 1,2,3
5056: C FIELD 8
5057: C BITS 11-15**USAGE--UNSET 0, ASF ARG 1, ASF FCN 2, CURRENT P. U.=
5058: C SUBR 3, CURRENT P.U.=FCN 4, EXTERNAL FCN 5, EXTERNAL SUBR 6,
5059: C COMMON-NAME 7, ASSIGN/GOTO VARIABLE 8,LABEL 9, VARIABLE 10,
5060: C CURRENT P.U.=BLOCK DATA 11, CURRENT P.U.=MAIN 12, EXTERNAL ENTITY
5061: C 13, INTRINSIC FCN 14
5062: C BITS 5-8 ARE 0 IF ENTRY CORRESPONDS TO ENTITY WITHOUT THE
5063: C ATTRIBUTE MENTIONED
5064: C
5065: C 2ND WD..... XREF LIST TAIL POINTER
5066: C 3D WORD.....EXTRA INFO POINTER
5067: C
5068: C FOR A VARIABLE, 3D WORD POINTS TO A 2 WORD BLOCK, FIRST WORD
5069: C CONTAINING STORAGE UNIT LENGTH OF THE VARIABLE (-1 IF VARIABLY
5070: C DIMENSIONED ARRAY); SECOND WORD CONTAINING INDEX OF COMMON
5071: C ENTRY IN DSA;
5072: C FOR A LABEL, 3D WORD CONTAINS POINTER TO 2 WORD BLOCK ; AFTER
5073: C LABEL DEFINED, FIRST WORD CONTAINS STMT NUMBER OF FIRST STMT
5074: C IN CURRENT DO NESTING LEVEL; SECOND WORD CONTAINS NEGATIVE THE
5075: C NESTING LEVEL; WHEN END OF THIS NESTING LEVEL IS ENCOUNTERED
5076: C ALL 2ND WORDS FOR THAT LEVEL ARE UPDATED TO CONTAIN STMT NUMBER
5077: C OF LAST STMT AT THAT NESTING LEVEL;
5078: C FOR A COMMON-NAME, 3D WORD POINTS TO HEAD OF LINEAR LINKED LIST
5079: C OF INDICES OF DSA ENTRIES FOR ORDERED ELEMENTS IN THAT COMMON;
5080: C FOR THE CURRENT P.U. IF ITS A SUBR OR FCN, 3D WORD CONTAINS
5081: C A LINEAR LINKED LIST OF INDICES IN DSA OF ENTRIES FOR ORDERED
5082: C DUMMIES OF THAT SUBPGM;
5083: C
5084: C 4TH WORD..... CHAIN POINTER TO ENTRY IN DSA FOR LAST SYMBOL
5085: C OR LABEL FOR WHICH A NEW ENTRY WAS CREATED
5086: C 5-7TH WORD.....PACKED CHARACTERS OF SYMBOL OR LABEL
5087: C
5088: J = NEXT + 2
5089: DO 150 I=NEXT,J
5090: DSA(I) = 0
5091: 150 CONTINUE
5092: J = J + 1
5093: DO 160 I=1,SYMLEN
5094: II = I + J
5095: DSA(II) = L(I)
5096: 160 CONTINUE
5097: C
5098: C SETONE OF THE CHAIN POINTERS TO PUT THIS SYMBOL ON CHAIN
5099: C
5100: IF (LABEL) GO TO 170
5101: DSA(J) = SYMHD
5102: SYMHD = NEXT
5103: GO TO 180
5104: 170 DSA(J) = LABHD
5105: LABHD = NEXT
5106: 180 NEXT = 4 + SYMLEN + NEXT
5107: C
5108: C BEGINNEW XREF LIST
5109: C
5110: 190 IF (.NOT.LABEL .AND. .NOT.OPT(2)) GO TO 210
5111: IF (NEXT+2.GE.BNEXT) GO TO 130
5112: DSA(BNEXT-1) = NOST
5113: DSA(LOOKUP+1) = BNEXT - 1
5114: DSA(BNEXT) = BNEXT - 1
5115: BNEXT = BNEXT - 2
5116: GO TO 210
5117: C
5118: C XREF LIST UPDATE; CHECK TO SEE IF STATEMENT NUMBER IS ALREADY
5119: C THERE
5120: C
5121: 200 IF (.NOT.LABEL .AND. .NOT.OPT(2)) GO TO 210
5122: IF (NEXT+2.GE.BNEXT) GO TO 130
5123: J = DSA(LOOKUP+1)
5124: IF (DSA(J).EQ.NOST) GO TO 210
5125: DSA(BNEXT) = DSA(J+1)
5126: DSA(J+1) = BNEXT - 1
5127: DSA(LOOKUP+1) = BNEXT - 1
5128: DSA(BNEXT-1) = NOST
5129: BNEXT = BNEXT - 2
5130: 210 RETURN
5131: END
5132: C XXXXXMAPCHR.f
5133: INTEGER FUNCTION MAPCHR(CHAR, ERR)
5134: C
5135: C MAPCHR RETURNS THE INTERNAL CODE OF THE CHARACTER CHAR
5136: C
5137: INTEGER CHAR
5138: INTEGER LET(46), ICODE(46)
5139: LOGICAL ERR
5140: C
5141: DATA LET(7), ICODE(7) /1H0,0/
5142: DATA LET(16), ICODE(16) /1H1,1/
5143: DATA LET(22), ICODE(22) /1H2,2/
5144: DATA LET(24), ICODE(24) /1H3,3/
5145: DATA LET(26), ICODE(26) /1H4,4/
5146: DATA LET(28), ICODE(28) /1H5,5/
5147: DATA LET(25), ICODE(25) /1H6,6/
5148: DATA LET(38), ICODE(38) /1H7,7/
5149: DATA LET(34), ICODE(34) /1H8,8/
5150: DATA LET(32), ICODE(32) /1H9,9/
5151: DATA LET(3), ICODE(3) /1HA,30/
5152: DATA LET(36), ICODE(36) /1HB,31/
5153: DATA LET(14), ICODE(14) /1HC,32/
5154: DATA LET(6), ICODE(6) /1HD,33/
5155: DATA LET(5), ICODE(5) /1HE,34/
5156: DATA LET(33), ICODE(33) /1HF,35/
5157: DATA LET(27), ICODE(27) /1HG,36/
5158: DATA LET(37), ICODE(37) /1HH,37/
5159: DATA LET(8), ICODE(8) /1HI,38/
5160: DATA LET(44), ICODE(44) /1HJ,39/
5161: DATA LET(46), ICODE(46) /1HK,40/
5162: DATA LET(13), ICODE(13) /1HL,41/
5163: DATA LET(12), ICODE(12) /1HM,42/
5164: DATA LET(4), ICODE(4) /1HN,43/
5165: DATA LET(2), ICODE(2) /1HO,44/
5166: DATA LET(18), ICODE(18) /1HP,45/
5167: DATA LET(43), ICODE(43) /1HQ,46/
5168: DATA LET(11), ICODE(11) /1HR,47/
5169: DATA LET(15), ICODE(15) /1HS,48/
5170: DATA LET(10), ICODE(10) /1HT,49/
5171: DATA LET(30), ICODE(30) /1HU,50/
5172: DATA LET(42), ICODE(42) /1HV,51/
5173: DATA LET(45), ICODE(45) /1HW,52/
5174: DATA LET(39), ICODE(39) /1HX,53/
5175: DATA LET(35), ICODE(35) /1HY,54/
5176: DATA LET(41), ICODE(41) /1HZ,55/
5177: DATA LET(31), ICODE(31) /1H+,60/
5178: DATA LET(29), ICODE(29) /1H-,61/
5179: DATA LET(19), ICODE(19) /1H),62/
5180: DATA LET(23), ICODE(23) /1H=,63/
5181: DATA LET(17), ICODE(17) /1H.,64/
5182: DATA LET(20), ICODE(20) /1H(,65/
5183: DATA LET(21), ICODE(21) /1H*,66/
5184: DATA LET(40), ICODE(40) /1H/,67/
5185: DATA LET(9), ICODE(9) /1H,,68/
5186: DATA LET(1), ICODE(1) /1H ,69/
5187: C
5188: DO 10 I=1,46
5189: IF (CHAR.EQ.LET(I)) GO TO 20
5190: 10 CONTINUE
5191: C
5192: C UNKNOWN, RETURN BLANK AND SET ERR = .TRUE.
5193: C
5194: MAPCHR = 69
5195: ERR = .TRUE.
5196: RETURN
5197: C
5198: C KNOWN, RETURN INTERNAL CODE, LEAVE ERR ALONE
5199: C
5200: 20 MAPCHR = ICODE(I)
5201: RETURN
5202: END
5203: C XXXXXPU.f
5204: SUBROUTINE PU
5205: INTEGER STMT, PSTMT, SYMLEN, OUTUT, SYMHD, BNEXT, HASH, DSA
5206: INTEGER STACK, DOPT, DOLIST, PDSA, OUTUT2, OUTUT3, OUTUT4
5207: INTEGER Q(70)
5208: LOGICAL ERR, BLKD, SYSERR, LOGIF1, LOGIF2, LAB, EOF
5209: LOGICAL NEW, TOKLAB, EXECUT, P1ERR, OPT, RET, ABORT
5210: LOGICAL P2, QBR
5211: COMMON /OPTNS/ OPT(5), P1ERR
5212: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
5213: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
5214: * OUTUT4
5215: COMMON /CEXPRS/ LSTACK, STACK(620)
5216: COMMON /FACTS/ NAME, NOST, ITYP, IASF
5217: COMMON /DETECT/ ERR, SYSERR, ABORT
5218: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
5219: COMMON /CHASH/ LHASH, HASH(401)
5220: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
5221: COMMON /DOS/ DOPT, LDO, DOLIST(192)
5222: COMMON /TRANS/ Q
5223: COMMON /PASS/ P2, QBR
5224: C
5225: C ROUTINE HANDLES CYCLING THROUGH STMTS OF A PGM UNIT. NEW IS
5226: C USED TO HANDLE P.U.'S WITHOUT END STMTS. FLUSHING OF STMTS
5227: C TO NEXT END OR HEADING STMT IS PROVIDED FOR ILLEGAL SEQUENCING
5228: C LOGIF1,LOGIF2 ARE USED TO CYCLE THROUGH LOGICAL IF STMTS
5229: C EOF OF INPUT FILE
5230: C ERR USED AS ERROR DIAGNOSTIC INDICATOR
5231: C NEWRD, NEW USED TO CONTROL INPUT
5232: C
5233: EOF = .FALSE.
5234: NEW = .FALSE.
5235: C
5236: C INTER-PROGRAM INITIALIZATION
5237: C NOST CONTAINS CURRENT STATEMENT NUMBER
5238: C ITYP CONTAINS TYPE OF STMT
5239: C BLKD IS TRUE FOR BLOCK DATA PGM UNIT, ELSE FALSE
5240: C EXECUT IS TRUE FOR AT LEAST ONE EXECUTABLE STMT IN
5241: C PROGRAM UNIT EXISTING
5242: C NAME CONTAINS INDEX IN DSA OF PGM UNIT NAME
5243: C P1ERR USED TO CONTROL WRITING OF SYMBOL TABLE FOR
5244: C PASS 2
5245: C RET IS TRUE IF RETURN STMT OCCURS IN P.U. ELSE FALSE
5246: C NEXT, BNEXT POINT INTO DSA
5247: C LABHD POINTS TO HEAD OF LABELS LIST IN DSA
5248: C SYMHD POINTS TO HEAD OF SYMBOLS LIST IN DSA
5249: C KGP, IGP USED TO CHECK STMT SEQUENCING
5250: C DOPT,DOLIST USED TO CHECK DO LOOP NESTING
5251: C
5252: 10 NOST = 0
5253: ITYP = 0
5254: LTYP = 0
5255: BLKD = .FALSE.
5256: EXECUT = .FALSE.
5257: NAME = 0
5258: P1ERR = .FALSE.
5259: RET = .FALSE.
5260: NEXT = 1
5261: BNEXT = LDSA
5262: LABHD = 0
5263: SYMHD = 0
5264: KGP = 0
5265: DOPT = 1
5266: DOLIST(1) = 1
5267: DO 20 I=2,6
5268: DOLIST(I) = 0
5269: 20 CONTINUE
5270: DO 30 I=1,LHASH
5271: HASH(I) = 0
5272: 30 CONTINUE
5273: C
5274: C DONT GOTO NEW PAGE IF NOT PRODUCING LISTING
5275: C
5276: IF (.NOT.OPT(4)) GO TO 40
5277: WRITE (OUTUT,99999)
5278: 99999 FORMAT (32H1PFORT VERIFIER 1/12/79 VERSION //)
5279: C
5280: C INPUT NEW STMT; RETURN WHEN HIT EOF STMT
5281: C FIND LABELS
5282: C
5283: C HEADING STMT INADVERTENTLY READ BECAUSE OF MISSING END
5284: C
5285: 40 IF (.NOT.NEW) GO TO 70
5286: NEW = .FALSE.
5287: NOST = 1
5288: IF (.NOT.OPT(4)) GO TO 80
5289: K = NSTMT - 1
5290: DO 50 I=1,K
5291: II = STMT(I) + 1
5292: STACK(I) = Q(II)
5293: 50 CONTINUE
5294: WRITE (OUTUT,99998) NOST, (STACK(I),I=1,K)
5295: 99998 FORMAT (1H , I5, 5X, 80A1)
5296: GO TO 80
5297: 60 CALL ERROR1(20H UNRECOGNIZABLE STMT, 20)
5298: ERR = .FALSE.
5299: 70 CALL INSTMT(EOF, NCARD)
5300: IF (EOF) GO TO 400
5301: 80 LAB = .FALSE.
5302: C
5303: C TYPST TYPES THE CURRENT STAMT
5304: C ITYP IS NO 1-30 TELLING STMT WE HAVE
5305: C KGP IS LEVEL NO 0-6 OF STMT.
5306: C ICNT IS NO OF CHARACTERS IN STMT IE KI(ITYP)
5307: C
5308: PSTMT = 6
5309: CALL TYPST(ITYP, IGP, ICNT)
5310: IF (ERR) GO TO 60
5311: PSTMT = 6 + ICNT
5312: IF (ITYP.GE.6) GO TO 100
5313: I = ITYP - 1
5314: CALL TYPST(ITYP, II, K2)
5315: IF (ITYP.NE.10) GO TO 90
5316: PSTMT = PSTMT + K2
5317: IGP = II
5318: GO TO 110
5319: 90 ITYP = I + 1
5320: 100 I = -1
5321: 110 II = 1
5322: IF (ITYP.LT.14 .OR. ITYP.EQ.28 .OR. ITYP.EQ.31) II = 2
5323: IF (ITYP.EQ.29) II = 3
5324: KEEP = PSTMT
5325: PSTMT = 1
5326: IF (TOKLAB(II,K2,KK,.TRUE.)) LAB = .TRUE.
5327: IF (SYSERR) GO TO 450
5328: C
5329: C CHECK FOR MAIN PROGRAM OR OTHER HEADING STMTS
5330: C
5331: IF (NAME) 140, 120, 140
5332: 120 IF (IGP) 130, 150, 130
5333: 130 CALL SETNAM(12)
5334: GO TO 150
5335: 140 IF (IGP.EQ.0) GO TO 490
5336: C
5337: C CHECK SEQUENCING OF STMTS
5338: C
5339: 150 IF (BLKD .AND. IGP.GT.3 .AND. ITYP.NE.28) GO TO 160
5340: IF (IGP.GE.KGP) GO TO 170
5341: CALL ERROR1(24H ILLEGAL STMT SEQUENCING, 24)
5342: GO TO 450
5343: 160 CALL ERROR1(32H ILLEGAL STMTS IN BLOCK DATA PGM, 32)
5344: GO TO 450
5345: C
5346: C CHECK FOR FIRST ASF DEFN OR EXECUTABLE STMT.
5347: C TO RESET USAGE OF FCN SUBPGM NAME IN SYMBOL TABLE
5348: C
5349: 170 IF (EXECUT .OR. IGP.LT.4) GO TO 180
5350: EXECUT = .TRUE.
5351: K = IGATT1(NAME,8)
5352: IF (K.EQ.4) CALL SATT1(NAME, 8, 10)
5353: 180 PSTMT = KEEP
5354: LOGIF2 = .FALSE.
5355: C
5356: C VALUES OF ITYP
5357: C 1-5 TYPE STMTS: 1 DP, 2 REAL, 3 INT, 4 COMP, 5 LOG
5358: C 6-8 OTHER SPECIFICATION STMTS: 6 EXTERNAL, 7 DIMENSION
5359: C 8 COMMON
5360: C 9-11 HEADING STMTS: 9 SUBROUTINE, 10 FUNCTION, 11 BLOCK DATA
5361: C 12 EQUIVALENCE
5362: C 13 DATA
5363: C 14-27,30,32 EXECUTABLE STMTS: 14 ASSIGN, 15 GOTO, 16 RETURN,
5364: C 17 CONTINUE, 18 CALL, 19 STOP, 20 IF, 21 DO, 22 PAUSE,
5365: C 23 READ, 24 WRITE, 25 REWIND, 26 ENDFILE, 27 BACKSPACE, 30
5366: C ASSIGNMENT, 32 LOGICAL IF
5367: C 28 END
5368: C 29 FORMAT
5369: C 31 ASF DEFN
5370: C CLASS CODES
5371: C 0-HEADING STMTS
5372: C 1-SPECIFICATION STMTS (INCLUDING TYPE STMTS)
5373: C 2-EQUIVALENCE
5374: C 3-DATA
5375: C 4-ASF DEF
5376: C 5-EXECUTABLE STMTS AND FORMAT STMTS
5377: C 6-END STMT
5378: C
5379: 190 GO TO (200, 200, 200, 200, 200, 210, 220, 250, 230, 230, 240,
5380: * 270, 260, 350, 330, 360, 380, 370, 380, 300, 280, 340, 340,
5381: * 340, 340, 340, 340, 410, 390, 290), ITYP
5382: C
5383: C TYPE STMTS (SYSERR)
5384: C
5385: 200 CALL TYPE
5386: GO TO 430
5387: C
5388: C EXTERNAL STMT (SYSERR)
5389: C
5390: 210 CALL EXTERN
5391: GO TO 430
5392: C
5393: C DIMENSION STMT(SYSERR)
5394: C
5395: 220 CALL DIMENS
5396: GO TO 430
5397: C
5398: C SUBR/FCN DEFNS (SYSERR)
5399: C
5400: 230 CALL SUBFCN(I)
5401: GO TO 430
5402: C
5403: C BLOCK DATA STMT (SYSERR)
5404: C
5405: 240 CALL SETNAM(11)
5406: BLKD = .TRUE.
5407: GO TO 430
5408: C
5409: C COMMON STMT
5410: C
5411: 250 CALL COMMON
5412: GO TO 430
5413: 260 CALL DATA
5414: GO TO 430
5415: 270 CALL EQUIV
5416: GO TO 430
5417: 280 CALL DOSTMT
5418: GO TO 430
5419: 290 CALL ASSASF(IGP)
5420: IF (IGP.EQ.4 .AND. LOGIF2) GO TO 320
5421: GO TO 430
5422: C
5423: C IF STMTS
5424: C
5425: 300 CALL IFS(LOGIF1)
5426: C
5427: C FOUND AN ARITH. IF
5428: C
5429: IF (.NOT.LOGIF1) GO TO 430
5430: C
5431: C FOUND LOGICAL IF WITHIN LOGICAL IF
5432: C
5433: IF (LOGIF1 .AND. LOGIF2) GO TO 320
5434: C
5435: C FOUND A LOGICAL IF; MUS PROCESS REST OFSTMT
5436: C
5437: LOGIF2 = .TRUE.
5438: CALL TYPST(ITYP, K, K2)
5439: IF (.NOT.ERR) GO TO 310
5440: CALL ERROR1(20H UNRECOGNIZABLE STMT, 20)
5441: GO TO 430
5442: 310 IF (K.NE.4 .AND. K.NE.5 .OR. ITYP.EQ.21 .OR. ITYP.EQ.29) GO TO 320
5443: PSTMT = PSTMT + K2
5444: GO TO 190
5445: 320 CALL ERROR1(27H ILLEGAL STMT IN LOGICAL IF, 27)
5446: GO TO 430
5447: C
5448: C GOTO STMTS
5449: C
5450: 330 CALL GOTO
5451: GO TO 430
5452: C
5453: C I-O STMTS
5454: C
5455: 340 CALL IO
5456: GO TO 430
5457: C
5458: C ASSIGN STMT
5459: C
5460: 350 CALL ASSIGN
5461: GO TO 430
5462: C
5463: C RETURN CANNOT APPEAR IN MAIN PGM
5464: C
5465: 360 I = IGATT1(NAME,8)
5466: IF (I.EQ.12) CALL ERROR1(
5467: * 44H RETURN STATEMENT MAY NOT APPEAR IN MAIN PGM, 44)
5468: RET = .TRUE.
5469: GO TO 380
5470: C
5471: C CALL STMT
5472: C
5473: 370 CALL CALLS
5474: GO TO 430
5475: C
5476: C CHECK FOR EXTRANEOUS INFO AFTER STOP AND CONTINUE STMTS
5477: C
5478: 380 IF (PSTMT.NE.NSTMT) CALL ERROR1(
5479: * 34H EXTRANEOUS INFO AFTER END OF STMT, 34)
5480: GO TO 430
5481: C
5482: C FORMAT
5483: C
5484: 390 IF (.NOT.LAB) CALL ERROR1(26H MISSING FORMAT STMT LABEL, 26)
5485: CALL FORMAT
5486: GO TO 430
5487: C
5488: C CODE TO HANDLE END-OF-FILE WITHOUT AN END STMT
5489: C
5490: 400 IF (ITYP.EQ.28 .OR. ITYP.EQ.0) GO TO 500
5491: CALL ERROR1(37H WARNING - MISSING END STMT SIMULATED, 37)
5492: LAB = .FALSE.
5493: ITYP = 28
5494: 410 CALL END
5495: C
5496: C CHECK FOR NO CONTINUATION
5497: C
5498: IF (NCARD.GT.1) CALL ERROR1(34H END LINE CANNOT HAVE CONTINUATION,
5499: * 34)
5500: C
5501: C CHECK FOR ENDING ON A GOTO,ARITH IF, STOP OR RETURN
5502: C
5503: IF ((LTYP.EQ.16 .OR. LTYP.EQ.15 .OR. LTYP.EQ.19 .OR. LTYP.EQ.20)
5504: * .OR. BLKD) GO TO 420
5505: CALL ERROR1(29H ILLEGAL LAST EXECUTABLE STMT, 29)
5506: C
5507: C CHECK THERE HAVE BEEN EXECUTABLE STMTS
5508: C CHECK FOR A RETURN STMT IF NECESSARY
5509: C
5510: 420 IF (KGP.NE.5 .AND. .NOT.BLKD) CALL ERROR1(
5511: * 42H ILLEGAL PROGRAM UNIT, NO EXECUTABLE STMTS, 42)
5512: I = IGATT1(NAME,8)
5513: IF (I.EQ.11 .OR. I.EQ.12 .OR. RET) GO TO 430
5514: CALL ERROR1(36H MISSING RETURN STMT IN PROGRAM UNIT, 36)
5515: C
5516: C CHECK STMT LABELS FOR DOENDINGS, UPDATE KGP, CHECK TABLE SIZE
5517: C CHECK FOR CANCELLING SAVING OF SYMBOL TABLE FOR PASS2
5518: C DUE TO ERRORS IN THIS PGM UNIT
5519: C
5520: 430 KGP = IGP
5521: IF (ITYP.NE.29) LTYP = ITYP
5522: IF (LOGIF2) LTYP = 32
5523: IF (SYSERR) GO TO 450
5524: IF (.NOT.LAB) GO TO 440
5525: CALL DOCHK(KK)
5526: IF (ITYP.LT.14 .OR. ITYP.EQ.28 .OR. ITYP.EQ.31) CALL ERROR1(
5527: * 37H WARNING - LABELED NONEXECUTABLE STMT, 37)
5528: 440 IF (EOF) GO TO 500
5529: ERR = .FALSE.
5530: IF (ITYP.EQ.28) GO TO 10
5531: GO TO 70
5532: C
5533: C FLUSH CODE TO NEXT HEADR OR END SMT
5534: C
5535: 450 CALL ERROR1(44H CODE FLUSHED UNTIL NEXT END OR HEADING STMT, 44)
5536: P1ERR = .TRUE.
5537: IF (SYSERR) SYSERR = .FALSE.
5538: LAB = .FALSE.
5539: 460 CALL INSTMT(EOF, NCARD)
5540: IF (EOF) GO TO 500
5541: PSTMT = 6
5542: CALL TYPST(ITYP, IGP, ICNT)
5543: IF (.NOT.ERR) GO TO 470
5544: ERR = .FALSE.
5545: GO TO 460
5546: 470 IF (ITYP.EQ.28) GO TO 410
5547: IF (ITYP.GT.5) GO TO 480
5548: PSTMT = PSTMT + ICNT
5549: CALL TYPST(ITYP, IGP, ICNT)
5550: IF (ERR) ERR = .FALSE.
5551: IF (ITYP.EQ.10) GO TO 490
5552: GO TO 460
5553: 480 IF (ITYP.LT.9 .OR. ITYP.GT.11) GO TO 460
5554: C
5555: C HAVE FOUND A HEADER STMT; SIMULATE AN END STMT
5556: C
5557: 490 NEW = .TRUE.
5558: CALL ERROR1(37H WARNING - MISSING END STMT SIMULATED, 37)
5559: ITYP = 28
5560: LAB = .FALSE.
5561: GO TO 410
5562: C
5563: C PUT ENDING MARKER ON THE DATA FOR PASS2
5564: C
5565: 500 I = 1
5566: II = 4
5567: WRITE (OUTUT3) I, II, I
5568: WRITE (OUTUT2) I, II, I
5569: RETURN
5570: END
5571: C XXXXXCOMCHK.f
5572: SUBROUTINE COMCHK(MAIN)
5573: INTEGER TEMP(1), PLAT, STAR, PCOM, COM, PNODE, SYMLEN
5574: INTEGER ZERO(1)
5575: COMMON /COMS/ LCOM, PCOM, COM(300)
5576: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5577: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
5578: COMMON /HEAD/ LNODE, PNODE, NODE(500)
5579: COMMON /SCR2/ LNN, NN(500)
5580: DATA STAR /1H*/
5581: DATA ZERO(1) /0/
5582: C
5583: C ALGORITHM TO CHECK FOR LEGAL USE OF COMMON IN PGM UNITS
5584: C NODE(MAIN) POINTS TO SUPEROOT ENTRY IN LAT
5585: C
5586: IF (PCOM.LE.0) GO TO 130
5587: LK = 1
5588: 10 IF (LK.GE.PCOM-1) GO TO 130
5589: C
5590: C CHECK COMMON ISNT BLANK COMMON
5591: C
5592: CALL S5UNPK(COM(LK), TEMP, 1)
5593: IF (TEMP(1).EQ.STAR) GO TO 120
5594: C
5595: C CHECK THAT COMMON BLOCK NOT IN BLOCK DATA PGM
5596: C NEED NOT CHECK THE COMMON
5597: C
5598: K = LK + SYMLEN + 1
5599: IF (COM(K).EQ.1) GO TO 120
5600: C
5601: C NEED ALGORITHM TO CHECK OUT THIS COMMON
5602: C
5603: L = PNODE - 1
5604: DO 20 K=1,L
5605: NN(K) = 0
5606: IF (NODE(K).LT.0) NN(K) = 1
5607: 20 CONTINUE
5608: ICNT = 0
5609: NN(MAIN) = 2
5610: C
5611: C SEARCH FOR A 2 NODE
5612: C
5613: 30 L = PNODE - 1
5614: DO 40 K=1,L
5615: IF (NN(K).EQ.2) GO TO 50
5616: 40 CONTINUE
5617: GO TO 120
5618: C
5619: C FOUND A 2 NODE; CHANGE TO 1 TO SHOW HAVE VISITED IT;
5620: C IF SUBPGM CONTAINS COMMON IN QUESTION INCREMENT COUNT;
5621: C IF COUNT> 1 ERROR IN USAGE
5622: C IF SUBPGM DOESN'T CONTAIN COMMON, MARK HIS DESC 2 IF THEY ARE 0.
5623: C
5624: 50 NN(K) = 1
5625: LBR = NODE(K)
5626: L = NODE(K) + SYMLEN + 2
5627: L = LAT(L)
5628: 60 IF (L.EQ.0) GO TO 90
5629: IF (LAT(L).NE.LK) GO TO 80
5630: C
5631: C FOUND COMMON LK AT THIS NODE
5632: C MARK NODE TO A 3
5633: C
5634: NN(K) = 3
5635: ICNT = ICNT + 1
5636: IF (ICNT.LE.1) GO TO 30
5637: CALL ERROR2(31H ILLEGAL USAGE OF COMMON BLOCK , 31, COM(LK),
5638: * 1, 1, 0)
5639: K = PNODE - 1
5640: DO 70 I=1,K
5641: L = NODE(I)
5642: IF (NN(I).EQ.3) CALL ERROR2(19H WHICH APPEARED IN , 19, LAT(L),
5643: * 1, 0, 0)
5644: 70 CONTINUE
5645: CALL ERROR2( 1H1, 0, ZERO(1), -3, 0, 1)
5646: GO TO 120
5647: 80 L = LAT(L+2)
5648: GO TO 60
5649: C
5650: C ARE DONE SEARCHING FOR COMMON LK AT THIS NODE
5651: C ADD DESCENDENTS ONTO LIST TO BE VISITED
5652: C
5653: 90 L = NODE(K) + SYMLEN + 4
5654: L = LAT(L)
5655: 100 IF (L.EQ.0) GO TO 30
5656: K = PNODE - 1
5657: C
5658: C FIND DESC OF NODE AND IF NOT VISITED SET TO 2
5659: C
5660: DO 110 I=1,K
5661: IF (NODE(I).NE.LAT(L)) GO TO 110
5662: IF (NN(I).EQ.0) NN(I) = 2
5663: 110 CONTINUE
5664: L = LAT(L+1)
5665: GO TO 100
5666: 120 LK = LK + SYMLEN + 5
5667: GO TO 10
5668: 130 RETURN
5669: END
5670: C XXXXXCOMPAR.f
5671: LOGICAL FUNCTION COMPAR(A, B)
5672: INTEGER SYMLEN, A(2), B(2)
5673: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
5674: C
5675: C ROUTINE TESTS TWO IDENTIFIERS FOR SAMENESS; RETURNS TRUE IF
5676: C SAME, ELSE FALSE
5677: C
5678: DO 10 I=1,SYMLEN
5679: IF (A(I).NE.B(I)) GO TO 30
5680: 10 CONTINUE
5681: COMPAR = .TRUE.
5682: 20 RETURN
5683: 30 COMPAR = .FALSE.
5684: GO TO 20
5685: END
5686: C XXXXXFINDND.f
5687: INTEGER FUNCTION FINDND(K1, K2)
5688: INTEGER K1(2)
5689: INTEGER PLAT, PNODE
5690: LOGICAL COMPAR
5691: COMMON /HEAD/ LNODE, PNODE, NODE(500)
5692: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5693: C
5694: C FINDS SUBPROGRAM WHOSE PACKED NAME IS IN K1(2) AND
5695: C RETURNS INDEX OF ITS LAT ENTRY AS VALUE OF FINFND
5696: C RETURNS IN K2 INDEX IN NODE OF LAT INDEX
5697: C IGNORES ASF NODES IN LAT BY IGNORING NEGATIVE NODE
5698: C ENTRIES
5699: C
5700: IF (PNODE-1) 40, 40, 10
5701: 10 K = PNODE - 1
5702: DO 30 I=1,K
5703: IF (NODE(I)) 30, 30, 20
5704: 20 FINDND = NODE(I)
5705: K2 = I
5706: IF (COMPAR(LAT(FINDND),K1)) GO TO 50
5707: 30 CONTINUE
5708: 40 FINDND = 0
5709: 50 RETURN
5710: END
5711: C XXXXXFINDCM.f
5712: INTEGER FUNCTION FINDCM(K1)
5713: INTEGER K1(2)
5714: INTEGER PCOM, COM, SYMLEN
5715: LOGICAL COMPAR
5716: COMMON /COMS/ LCOM, PCOM, COM(300)
5717: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
5718: C
5719: C ROUTINE FINDS COMMON BLOCK WHOSE NAME IS AT K1 IN COM
5720: C RETURNS INDEX IN COM OR 0 IF CANNOT FIND IT
5721: C
5722: IF (PCOM-1) 30, 30, 10
5723: 10 K = PCOM - 1
5724: KK = SYMLEN + 5
5725: DO 20 I=1,K,KK
5726: FINDCM = I
5727: IF (COMPAR(COM(I),K1)) GO TO 40
5728: 20 CONTINUE
5729: 30 FINDCM = 0
5730: 40 RETURN
5731: END
5732: C XXXXXINREF.f
5733: INTEGER FUNCTION INREF(IDUM)
5734: INTEGER REF, PREF
5735: COMMON /CREF/ LREF, PREF, REF(100)
5736: C
5737: C ROUTINE TO INPUT CALL TEMPLATES, RETURNS -1 FOR EOF, 0 FOR END
5738: C OF REFS FOR THIS PGM UNIT, AND 1 FOR REF RETRIEVED
5739: C
5740: READ (IDUM) PREF, K, (REF(L),L=1,PREF)
5741: IF (K-3) 10, 30, 40
5742: 10 INREF = 1
5743: 20 RETURN
5744: 30 INREF = 0
5745: GO TO 20
5746: 40 INREF = -1
5747: GO TO 20
5748: END
5749: C XXXXXINSYM.f
5750: LOGICAL FUNCTION INSYM(IDUM,II)
5751: INTEGER OUTUT, OUTUT2, OUTUT3, SYMHD, PDSA, SYMLEN, DSA, BNEXT
5752: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3, I1
5753: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
5754: COMMON /FACTS/ NAME, NOST, ITYP, IASF
5755: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
5756: C
5757: C ROUTINE TO INPUT SYMBOL TABLE; RETURNS TRUE FOR SUCCESSFUL, ELSE
5758: C FALSE. KCODE=1 FOR TABLE, 3 FOR DUMMY TABLE, 4 FOR EOF
5759: C DUMMY TABLE CAUSES REFS FOR THIS PU TO BE FLUSHED IF
5760: C IDUM NE 0
5761: C
5762: 5 READ(OUTUT2) PDSA, KCODE, (DSA(I),I=1,PDSA)
5763: IF (KCODE-3) 10, 40, 30
5764: 10 NAME = DSA(PDSA-2)
5765: SYMHD = DSA(PDSA-1)
5766: LABHD = DSA(PDSA)
5767: PDSA = PDSA - 3
5768: INSYM = .TRUE.
5769: 20 RETURN
5770: 30 INSYM = .FALSE.
5771: GO TO 20
5772: C FLUSH REFS FOR DUMMY TABLE IF IDUM NONZERO
5773: 40 IF(IDUM.EQ.0) GOTO 5
5774: 50 IF(INREF(IDUM)) 60, 60, 50
5775: C WRITE END OF REFS FOR DUMMY REFS IF II NE 0; ELSE GOT TO
5776: C NEXT SYMBOL TABLE
5777: 60 IF(II.EQ.0) GOTO 5
5778: L = 1
5779: K = 3
5780: WRITE(II) L,K,L
5781: GOTO 5
5782: END
5783: C XXXXXMATCH.f
5784: INTEGER FUNCTION MATCH(HEAD, INCR, N)
5785: INTEGER PLAT, HEAD
5786: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5787: C
5788: C ROUTINE READS DOEN A LINEAR LINKED LIST IN LAT TO FIND ENTRY
5789: C WHOSE FIRST WORD CONTAINS N; EACH LIST ELEMENT IS INCR+1 LONG;
5790: C HEAD IS POINTER TO FIRST LIST ELEMENT
5791: C RETURNS 0 FOR NO MATCH ON LIST OR THE EMPTY LIST
5792: C
5793: IF (HEAD) 40, 40, 10
5794: 10 MATCH = HEAD
5795: 20 IF (LAT(MATCH).EQ.N) GO TO 50
5796: MATCH = MATCH + INCR
5797: IF (LAT(MATCH)) 40, 40, 30
5798: 30 MATCH = LAT(MATCH)
5799: GO TO 20
5800: 40 MATCH = 0
5801: 50 RETURN
5802: END
5803: C XXXXXMKCOM.f
5804: SUBROUTINE MKCOM(PP, K)
5805: INTEGER PLAT, PDSA, FINDCM, DSA, SYMLEN, PP, PCOM, COM
5806: LOGICAL SYSERR, ERR, ABORT
5807: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5808: COMMON /COMS/ LCOM, PCOM, COM(300)
5809: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
5810: COMMON /DETECT/ ERR, SYSERR, ABORT
5811: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
5812: C
5813: C WANT TO MARK COMMONLIST ENTRY SET FOR SUBPGM PP; MAY HAVE TO
5814: C CREATE ENTRY
5815: C
5816: N = FINDCM(DSA(K+4))
5817: L = SYMLEN + 2 + PP
5818: KK = -K
5819: IF (N.NE.0) KK = N
5820: C
5821: C LOOK FOR DSA ENTRY ON LIST
5822: C
5823: I = MATCH(LAT(L),2,KK)
5824: IF (I) 30, 30, 10
5825: 10 LAT(I+1) = 1
5826: 20 RETURN
5827: C
5828: C CREATE NEW ENTRY
5829: C
5830: 30 IF (PLAT+3.GT.LLAT) GO TO 40
5831: LAT(PLAT+1) = 1
5832: LAT(PLAT+2) = LAT(L)
5833: LAT(L) = PLAT
5834: LAT(PLAT) = KK
5835: PLAT = PLAT + 3
5836: GO TO 20
5837: 40 SYSERR = .TRUE.
5838: CALL ERROR1(32H IN MKCOM, TABLE OVERFLOW OF LAT, 32)
5839: GO TO 20
5840: END
5841: C XXXXXOUTCOM.f
5842: INTEGER FUNCTION OUTCOM(IH, L)
5843: INTEGER STACK,PLAT
5844: LOGICAL ERR, SYSERR, ABORT
5845: COMMON /DETECT/ ERR, SYSERR, ABORT
5846: COMMON /CEXPRS/ LSTACK, STACK(620)
5847: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5848: C
5849: C READS DOWN COM LIST OF PU NODE, PUTS INDICES OF ENTRIES
5850: C IN STACK. IH IS HEAD OF LIST, L RETURNS NO OF ENTRIES
5851: C
5852: OUTCOM = 0
5853: IF (IH) 40, 40, 10
5854: 10 L = 1
5855: K = IH
5856: 20 IF (L+1.GT.LSTACK) GOTO 50
5857: STACK(L) = LAT(K)
5858: IF (LAT(K+1).EQ.1) STACK(L) = -STACK(L)
5859: L = L + 1
5860: K = LAT(K+2)
5861: IF (K) 30, 30, 20
5862: 30 L = L - 1
5863: IF(L.GT.0) OUTCOM=1
5864: 40 RETURN
5865: 50 SYSERR = .TRUE.
5866: CALL ERROR1(35H IN OUTCOM, TABLE OVERFLOW OF STACK, 35)
5867: GO TO 40
5868: END
5869: C XXXXXOUTLAT.f
5870: INTEGER FUNCTION OUTLAT(IH, L, ISR)
5871: INTEGER STACK, PLAT
5872: LOGICAL ERR, SYSERR, ABORT
5873: COMMON /DETECT/ ERR, SYSERR, ABORT
5874: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5875: COMMON /CEXPRS/ LSTACK, STACK(620)
5876: INTEGER SYMLEN
5877: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
5878: C
5879: C IH POINTS TO A PARENTS OR DESCS LIST IN LAT; L IS NUM
5880: C OF ELEMENTS FOUND ON LIST; ISR IS ENTRY IN LAT OF
5881: C SUPERROOT
5882: C
5883: C
5884: OUTLAT = 0
5885: IF (IH) 50, 50, 10
5886: 10 K = IH
5887: L = 1
5888: 20 M = LAT(K)
5889: C SKIP OVER CALLS TO ASFS AND OVER SUPEROOT
5890: IF(MOD(IGATT2(M+SYMLEN+6,1),8).EQ.4 .OR. M.EQ.ISR) GOTO 30
5891: IF(L+1.GT.LSTACK) GOTO 60
5892: STACK(L) = M
5893: L = L + 1
5894: 30 K = LAT(K+1)
5895: IF (K) 40, 40, 20
5896: 40 L = L - 1
5897: IF (L.GT.0) OUTLAT = 1
5898: 50 RETURN
5899: 60 CALL ERROR1(35H IN OUTLAT, TABLE OVERFLOW OF STACK, 35)
5900: SYSERR = .TRUE.
5901: GO TO 50
5902: END
5903: C XXXXXOUT2A.f
5904: SUBROUTINE OUT2A( IT, JJ, N, ISW )
5905: C
5906: C IT CONTINAS TITLE FOR FIRST LINE OF OUTPUT
5907: C JJ CONTAINS NUMBER OF CHARS IN TITLE, J<=25
5908: C N CONTAINS NUMBER OF ELEMENTS TO BE PRINTED
5909: C ISW TELLS IF THESE ARE COMMON NAMES OR PROC NAMES
5910: C
5911: INTEGER IT(25), II(25), BL, PLAT, PCOM, COM, STACK, OUTUT, S
5912: INTEGER BUF(54)
5913: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5914: COMMON /PARAMS/ II1, OUTUT, II2, II3, II4, II5, II6
5915: COMMON /CEXPRS/ LSTACK, STACK(620)
5916: COMMON /COMS/ LCOM, PCOM, COM(300)
5917: DATA BL/1H /,S/1HS/
5918: C
5919: C UNPACK TITLE
5920: C
5921: NN = JJ
5922: IF(JJ.GT.25) NN=25
5923: CALL S5UNPK( IT(1), II(1), NN)
5924: K1 = NN + 1
5925: IF(K1.GT.25) GOTO 15
5926: DO 10 K =K1, 25
5927: II(K) = BL
5928: 10 CONTINUE
5929: C
5930: C SETUP FIRST LINE OF ELEMENTS
5931: C
5932: 15 K = 6
5933: IF (K.GT.N) K = N
5934: IB = 1
5935: DO 50 I = 1, K
5936: IL = STACK(I)
5937: GOTO (20, 30),ISW
5938: C FOR PARE OR DESC LISTS
5939: 20 CALL S5UNPK( LAT(IL), BUF(IB), 6 )
5940: BUF(IB + 7) = BL
5941: GOTO 40
5942: C FOR COMMON LISTS- INDEX TO ELEMENTS IS NEGATIVE
5943: C IF COMMON IS SET BY PGM UNIT
5944: 30 BUF(IB + 7) = BL
5945: IF(IL.LT.0) BUF(IB + 7) = S
5946: IL = IABS(IL)
5947: CALL S5UNPK( COM(IL), BUF(IB), 6 )
5948: 40 BUF(IB + 6) = BL
5949: BUF(IB + 8) = BL
5950: IB = IB + 9
5951: 50 CONTINUE
5952: IB = IB - 1
5953: WRITE(OUTUT,99999) (II(L),L=1,25), (BUF(I),I=1,IB)
5954: 99999 FORMAT(80A1)
5955: IF(K.EQ.N) GOTO 110
5956: C WRITE SUBSEQUENT LINES
5957: 60 IB = 1
5958: K1 = K + 1
5959: K = K + 6
5960: IF (K.GT.N) K = N
5961: DO 100 I = K1, K
5962: IL = STACK(I)
5963: GOTO (70, 80), ISW
5964: C FOR PAR OR DESC LISTS
5965: 70 CALL S5UNPK( LAT(IL), BUF(IB), 6 )
5966: BUF(IB + 7) = BL
5967: GOTO 90
5968: C FOR COMMON LISTS
5969: 80 BUF(IB + 7) = BL
5970: IF(IL.LT.0) BUF(IB + 7) = S
5971: IL = IABS(IL)
5972: CALL S5UNPK( COM(IL), BUF(IB), 6 )
5973: 90 BUF(IB + 6) = BL
5974: BUF(IB +8) = BL
5975: IB = IB + 9
5976: 100 CONTINUE
5977: IB = IB - 1
5978: WRITE(OUTUT,99998) (BUF(I),I =1,IB)
5979: 99998 FORMAT(25X,55A1)
5980: IF(K.LT.N) GOTO 60
5981: 110 RETURN
5982: END
5983: C XXXXXOUT2C.f
5984: SUBROUTINE OUT2C
5985: INTEGER COM, PCOM, STACK, BL, SYMLEN, OUTUT, S, PLAT
5986: EXTERNAL EXCH
5987: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, I1, I2, I3
5988: COMMON /COMS/ LCOM, PCOM, COM(300)
5989: COMMON /CEXPRS/ LSTACK, STACK(620)
5990: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
5991: COMMON /SCR2/ LICOM, ICOM(500)
5992: DATA BL /1H /, S /1HS/
5993: C
5994: C PRINTS COM ARRAY
5995: C
5996: IF (PCOM-1) 80, 80, 10
5997: 10 K1 = SYMLEN + 5
5998: K = 1
5999: LCOMS = (PCOM-1)/(SYMLEN+5)
6000: DO 20 I=1,LCOMS
6001: ICOM(I) = K
6002: K = K + K1
6003: 20 CONTINUE
6004: CALL SSORT(EXCH, COM, LCOM, ICOM, LCOMS, 0)
6005: WRITE (OUTUT,99999)
6006: 99999 FORMAT (///14H1COMMON BLOCKS///1X, 4HNAME, 3X, 3HSET, 1X,
6007: * 18H DP,COM INT,RL,LOG//)
6008: DO 70 IBR=1,LCOMS
6009: I = ICOM(IBR)
6010: CALL S5UNPK(COM(I), STACK(1), 6)
6011: DO 30 L=1,3
6012: II = I + SYMLEN + L
6013: KK = 7 + L
6014: STACK(KK) = COM(II)
6015: 30 CONTINUE
6016: IF (STACK(8)) 40, 40, 50
6017: 40 STACK(8) = BL
6018: GO TO 60
6019: 50 STACK(8) = S
6020: 60 WRITE (OUTUT,99998) (STACK(II),II=1,6), STACK(8),
6021: * (STACK(II),II=9,10)
6022: 99998 FORMAT (1X, 6A1, 3X, A1, I8, 3X, I8)
6023: 70 CONTINUE
6024: 80 RETURN
6025: END
6026: C XXXXXSCAN.f
6027: SUBROUTINE SCAN(MAINND)
6028: INTEGER PLAT, SYMLEN, PNODE, STACK
6029: LOGICAL ERR, SYSERR, ABORT
6030: COMMON /DETECT/ ERR, SYSERR, ABORT
6031: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6032: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
6033: COMMON /CEXPRS/ LSTACK, STACK(620)
6034: COMMON /HEAD/ LNODE, PNODE, NODE(500)
6035: COMMON/ SCR1/ LINODE, INODE(500)
6036: COMMON /SCR2/ LICOM, ICOM(500)
6037: C
6038: C SUBROUTINE PERCOLATES SETTING INFO ABOUT ARGUMENTS AND COMMON
6039: C UP THE LATTICE---IN ORDER THAT UNSAFE REFS CAN BE CHECKED
6040: C
6041: C
6042: C STACK(1)-(LSTACK) KEEPS TRACK OF PATH FROM CURRENT TERMINAL NODE
6043: C TO SUPEROOT NODE
6044: C INODE(J) IS 0 IF A NODE IS UNVISITED SO FAR ON ALL PATHS
6045: C 1 IF A NODE HAS BEEN VISITED ON AT LEAST ONE PATH
6046: C SYSERR IS SET BY SCAN
6047: C
6048: DO 10 I=1,PNODE
6049: INODE(I) = 0
6050: 10 CONTINUE
6051: INODE(MAINND) = 1
6052: MAIN = NODE(MAINND)
6053: NUM = 0
6054: C
6055: C CYCLE THROUGH ALL TERMINAL NODES
6056: C
6057: 20 NUM = NUM + 1
6058: IF (NUM.GT.PNODE-1) GO TO 240
6059: C
6060: C CHECK IF AN NODE IS ASF OR IF IT HAS DESC
6061: C OR IF IT HAS NO PARENTS
6062: C
6063: IF (NODE(NUM).LE.0) GO TO 20
6064: I = NODE(NUM) + SYMLEN + 4
6065: C
6066: C NO PARENTS
6067: C
6068: IF (LAT(I-1).EQ.0) GO TO 20
6069: C
6070: C TEST DESC FOR BEING ALL ASFS
6071: C
6072: IF (LAT(I).EQ.0) GO TO 40
6073: L = LAT(I)
6074: 30 K = LAT(L) + SYMLEN + 6
6075: IF (MOD(LAT(K),8).NE.4) GO TO 20
6076: L = LAT(I+1)
6077: IF (L) 40, 40, 30
6078: C
6079: C HAVE A TERMINAL NODE;NOW CAN START RECURSIVE TRAVERSE OF ALL
6080: C PATHS UPWARDS FROM IT TO ROOT
6081: C ILEN--POINTER TO TOP OF CURRENT PATH
6082: C JNODE--CURRENT NODE
6083: C
6084: 40 INODE(NUM) = 1
6085: ILEN = 2
6086: STACK(2) = NODE(NUM)
6087: STACK(1) = 0
6088: C
6089: C STACK ENTRY IS 1ST WORD-POINTER TO NODE ON LIST OF PARS OFPREV
6090: C NODE; 2ND WORD-NODE INDEX
6091: C PROCESS NODE
6092: C 1. CHECK EACH ARG. IF NOT SET OR IF PARENTS ARGLINKS NONEXISTANT
6093: C SKIP TO NEXT ARG (IF NO ARGS GOTO 2); ELSE MARK EACH PARENT
6094: C ARGLIST ENTRY AS SET FOR A SET ARG.
6095: C 2. ADD EACH COMMON REGION TO PARENTS' LIST OF COMMON REGIONS
6096: C 3. GET NEW NODE
6097: C
6098: 50 J = STACK(ILEN) + SYMLEN + 1
6099: C
6100: C ARG PROCESSING
6101: C
6102: J = LAT(J)
6103: 60 IF (J.EQ.0) GO TO 90
6104: I = IGATT2(J,5)
6105: IF (I.NE.1 .OR. LAT(J+2).EQ.0) GO TO 80
6106: L = LAT(J+2)
6107: 70 IF (L.EQ.0) GO TO 80
6108: C
6109: C SET PARENT ARGS
6110: C
6111: CALL SATT2(LAT(L), 5, 1)
6112: L = LAT(L+1)
6113: GO TO 70
6114: C
6115: C GO ON TO NEXT ARG
6116: C
6117: 80 J = LAT(J+3)
6118: GO TO 60
6119: C
6120: C COMMON PROCESSING
6121: C
6122: 90 J = STACK(ILEN) + SYMLEN + 2
6123: II = 0
6124: J = LAT(J)
6125: C
6126: C ACCUMULATE COMMON REGIONS
6127: C
6128: 100 IF (J.EQ.0) GO TO 110
6129: ICOM(II+1) = LAT(J)
6130: IF (LAT(J+1).NE.0) ICOM(II+1) = -ICOM(II+1)
6131: II = II + 1
6132: J = LAT(J+2)
6133: GO TO 100
6134: 110 IF (II.EQ.0) GO TO 150
6135: C
6136: C GET PARENT NODE AND ADD COMMON REGIONS TO IT
6137: C
6138: K = STACK(ILEN) + SYMLEN + 3
6139: K = LAT(K)
6140: 120 L = LAT(K) + SYMLEN + 2
6141: DO 140 I=1,II
6142: LL = MATCH(LAT(L),2,IABS(ICOM(I)))
6143: IF (LL.EQ.0) GO TO 130
6144: IF (ICOM(I).LT.0) LAT(LL+1) = 1
6145: GO TO 140
6146: C
6147: C COPY COMMONNODE ENTRIES ONTO PARENTS LIST
6148: C
6149: 130 IF (PLAT+3.GT.LLAT) GO TO 270
6150: LAT(PLAT+2) = LAT(L)
6151: LAT(PLAT+1) = 0
6152: LAT(PLAT) = IABS(ICOM(I))
6153: IF (ICOM(I).LT.0) LAT(PLAT+1) = 1
6154: LAT(L) = PLAT
6155: PLAT = PLAT + 3
6156: 140 CONTINUE
6157: C
6158: C GOONTO NEW PARENT
6159: C
6160: K = LAT(K+1)
6161: IF (K.NE.0) GO TO 120
6162: C
6163: C FIND A PARENT OF THIS NODE AND TRY TO VISIT IT NEXT
6164: C I CONTAINS POINTER TO PARENT LIST POSITION OF THE PARENT;
6165: C J CONTAINS PARENTS INDEX IN LAT
6166: C IF NO MORE PARENTS, MUST BACKUP A LEVEL
6167: C
6168: 150 I = STACK(ILEN) + SYMLEN + 3
6169: 160 IF (LAT(I).EQ.0) GO TO 200
6170: I = LAT(I)
6171: 170 J = LAT(I)
6172: C
6173: C CHECK THAT NEW ENTRY HAS PARENTS
6174: C AND THAT IT IS NOT THE SUPEROOT
6175: C
6176: K = J + SYMLEN + 3
6177: IF (LAT(K).GT.0) GO TO 210
6178: C
6179: C IF THIS PARENT UNACCEPTIBLE GO ONTO NEXT PARENT
6180: C MARK UNACCEPTIBLE AS VISITED SO WONT BE RECURSIVE
6181: C
6182: LL = PNODE - 1
6183: DO 180 L=1,LL
6184: IF (J.NE.NODE(L)) GO TO 180
6185: INODE(L) = 1
6186: GO TO 190
6187: 180 CONTINUE
6188: 190 I = I + 1
6189: GO TO 160
6190: C
6191: C MUST BACK DOWN THE PATH TO THE NEXT JUNCTURE WITH
6192: C AN UNTRIED PATH; CHECK FIRST FOR DONE WITH ENTIRE PATH
6193: C
6194: 200 IF (STACK(ILEN-1).EQ.0) GO TO 20
6195: ILEN = ILEN - 2
6196: J = STACK(ILEN+1)
6197: IF (LAT(J+1).EQ.0) GO TO 200
6198: C
6199: C FOUND AN UNTRIED PATH ON THE STACK
6200: C
6201: I = LAT(J+1)
6202: GO TO 170
6203: C
6204: C MARK ENTRY AS VISITED
6205: C
6206: 210 LL = PNODE - 1
6207: DO 220 L=1,LL
6208: IF (J.NE.NODE(L)) GO TO 220
6209: INODE(L) = 1
6210: GO TO 230
6211: 220 CONTINUE
6212: C
6213: C ENTER ON STACK
6214: C
6215: 230 IF (ILEN+2.GT.LSTACK) GO TO 260
6216: STACK(ILEN+1) = I
6217: STACK(ILEN+2) = J
6218: ILEN = ILEN + 2
6219: GO TO 50
6220: 240 RETURN
6221: 250 SYSERR = .TRUE.
6222: GO TO 240
6223: 260 CALL ERROR1(33H IN SCAN, TABLE OVERFLOW OF STACK, 33)
6224: GO TO 250
6225: 270 CALL ERROR1(31H IN SCAN, TABLE OVERFLOW OF LAT, 31)
6226: GO TO 250
6227: END
6228: C XXXXXSETARG.f
6229: INTEGER FUNCTION SETARG(PP, N)
6230: INTEGER PLAT, DSA, PP, SYMLEN, PDSA
6231: LOGICAL ERR, SYSERR, ABORT
6232: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
6233: COMMON /DETECT/ ERR, SYSERR, ABORT
6234: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6235: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
6236: C
6237: C SETS UP LIST OF ARGUMENTS , HANGING OFF NODE AT LAT(PP)
6238: C ARGES ARE KEPT IN ORDERED LINEAR LINKED LIST
6239: C ORDERING CORRESPONDS TO LEFT TO RIGHT APPEARENCE IN DEFN
6240: C N-SUBPRGM ENTRY IN DSA
6241: C PP- CURRENT RTNE NODE IN LAT
6242: C ARGUMENT NODE
6243: C WD 1 ATTRIBUTES
6244: C WD2 LENGTH WITH -1 FOR VARIABLEY DIMENSIONED ARRAYS
6245: C WD3 HEAD OF PARENT REFS LIST
6246: C WD4 HEAD OF DESCENDENTS REFS LIST
6247: C WD5 PTR TO NEXT ARG
6248: C
6249: C FIND FIRST ARGUMENT & ZERO COUNT
6250: C
6251: J = DSA(N+2)
6252: SETARG = 0
6253: IPROC = 0
6254: C
6255: C FIND FIRST ENTRY ON DSA ARGLIST;
6256: C KK HEAD OF TO BE CREATED ARGLIST IN LAT
6257: C
6258: I = DSA(J)
6259: KK = PP + SYMLEN + 1
6260: C
6261: C SETUP STORAGE FOR ARG ENTRY
6262: C
6263: 10 IF (PLAT+4.GE.LLAT) GO TO 80
6264: C
6265: C ENTER ATTRIBUTE WORD AND ZERO REST OF ENTRY
6266: C
6267: LAT(PLAT) = DSA(I)
6268: LAT(KK) = PLAT
6269: KK = PLAT + 3
6270: DO 20 IA=1,3
6271: L = IA + PLAT
6272: LAT(L) = 0
6273: 20 CONTINUE
6274: K = IGATT1(I,8)
6275: IF (K.NE.10) GO TO 50
6276: C
6277: C GET STRUCTURE OF ARG
6278: C
6279: K = IGATT1(I,7)
6280: IF (K) 40, 40, 30
6281: C
6282: C ARRAY
6283: C
6284: 30 K = DSA(I+2)
6285: LAT(PLAT+1) = DSA(K)
6286: GO TO 60
6287: C
6288: C SCALAR
6289: C
6290: 40 LAT(PLAT+1) = 1
6291: GO TO 60
6292: C SET RELATIVE ORDER OF PROC ARGS IN ITS 2ND WORD
6293: 50 IPROC = IPROC + 1
6294: LAT(PLAT+1) = IPROC
6295: C
6296: C CHECK FOR MORE ARGS; ADVANCE PLAT
6297: C
6298: 60 PLAT = PLAT + 4
6299: SETARG = SETARG + 1
6300: IF (DSA(J+1)) 90, 90, 70
6301: 70 J = DSA(J+1)
6302: I = DSA(J)
6303: GO TO 10
6304: 80 SYSERR = .TRUE.
6305: CALL ERROR1(33H IN SETARG, TABLE OVERFLOW OF LAT, 33)
6306: 90 RETURN
6307: END
6308: C XXXXXSETASF.f
6309: SUBROUTINE SETASF(PP, K)
6310: INTEGER PP, SYMLEN, PLAT, PDSA, SETARG, PNODE, DSA
6311: LOGICAL ERR, SYSERR, ABORT
6312: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6313: COMMON /HEAD/ LNODE, PNODE, NODE(500)
6314: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
6315: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
6316: COMMON /DETECT/ ERR, SYSERR, ABORT
6317: C
6318: C SETUP ASF NODE; IT HAS A NODE JUST LIKE A RTNE
6319: C EXCEPT ITS INDEX IN NODE IS NEGATIVE
6320: C PP-COM ADDRESS OF PARENT SUBPGM
6321: C K-DSA ADDRESS OF ASF ENTRY
6322: C
6323: IF (PNODE+1.GT.LNODE) GO TO 40
6324: IF (PLAT+SYMLEN+11.GT.LLAT) GO TO 60
6325: C
6326: C CREATE NEW NODE ENTRY
6327: C
6328: NODE(PNODE) = -PLAT
6329: PNODE = PNODE + 1
6330: C
6331: C ENTER NAME AND ZERO REST OF NODE
6332: C
6333: DO 10 I=1,SYMLEN
6334: L = K + 3 + I
6335: LL = PLAT + I - 1
6336: LAT(LL) = DSA(L)
6337: 10 CONTINUE
6338: DO 20 I=1,6
6339: L = LL + I
6340: LAT(L) = 0
6341: 20 CONTINUE
6342: C
6343: C SET LAST ELEMENT TO TYPE OF PGM UNIT
6344: C STORE IN SAME WORD ASF TYPE
6345: C
6346: I = IGATT1(K,1)
6347: LAT(L+1) = 4 + 8*MOD(I,8)
6348: C
6349: C SETUP PARENT'S LIST TO POINT TO PP IN ASF NODE
6350: C
6351: L = PLAT + SYMLEN + 3
6352: LAT(L) = L + 4
6353: LAT(L+4) = PP
6354: LAT(L+5) = 0
6355: KQ = PLAT
6356: PLAT = L + 6
6357: C
6358: C SETUP REFERENCE IN PP'S DESCENDENTS LIST
6359: C
6360: II = PP + SYMLEN + 4
6361: LAT(PLAT) = KQ
6362: LAT(PLAT+1) = LAT(II)
6363: LAT(II) = PLAT
6364: PLAT = PLAT + 2
6365: C
6366: C SETUP ARGUMENTS
6367: C
6368: L = KQ + SYMLEN
6369: LAT(L) = SETARG(KQ,K)
6370: 30 RETURN
6371: 40 CALL ERROR1(34H IN SETASF, TABLE OVERFLOW OF NODE, 34)
6372: 50 SYSERR = .TRUE.
6373: GO TO 30
6374: 60 CALL ERROR1(33H IN SETASF, TABLE OVERFLOW OF LAT, 33)
6375: GO TO 50
6376: END
6377: C XXXXXSETCOM.f
6378: SUBROUTINE SETCOM(PP, K)
6379: LOGICAL SYSERR, ERR, ABORT, BLANK
6380: INTEGER PLAT, DSA, SYMLEN, PP, PDSA, COM, PCOM, R(5), S(3),
6381: * FINDND, ST, SS(1), FINDCM
6382: INTEGER ZERO(1)
6383: COMMON /FACTS/ NAME, NOST, ITYP, IASF
6384: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6385: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
6386: COMMON /DETECT/ ERR, SYSERR, ABORT
6387: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
6388: COMMON /COMS/ LCOM, PCOM, COM(300)
6389: C
6390: C COM ENTRY
6391: C WORD 1.....PACKED CHARACTERS OF COMMON-NAME
6392: C WORD 2....TOTAL LENGTH OF COMMON BLOCK
6393: C WORD 3.....1 IF COMMON INITIALIZED BY BLOCK DATA SUBPGM
6394: C 0 IF NOT
6395: C WORDS 4-8...TOTAL LENGTHS OF COMPLEX, DOUBLE PRECIS,
6396: C REAL, INTEGER, LOGICAL DATA TYPES RESPECTIVELY
6397: C WORD 9.....INDEX IN LAT OF ENTRY OF P.U. WHICH CONTAINS
6398: C THIS DEFN OF THE COMMON BLOCK
6399: C
6400: C FINDS COMMON BLOCK ENTRY IN COM- ELSE CREATES AND INITIALIZES NEW
6401: C ENTRY. CHECKS NEW ENTRY BLOCK NOT ALREADY A SUBPGM NAME.
6402: C GATHERS INFO ON ORDER, TYPE, LENGTH OF ENTRIES IN THE COMMON-
6403: C CHECKS FOR VARIABLY DIMENSIONED ARRAYS.
6404: C FORMS COMMONLIST ENTRY FOR BLOCK OFF SUBPGM AT LAT(PP)
6405: C IF FOUND COMMON IN COM, COMPARES OLD DEFN TO NEW FOR ORDER, LEN,
6406: C TYPE OF ENTRIES; FLAGS INCONSISTENCIES; NOTES IF COMMON IN
6407: C TWO BLOCK DATA PGMS. COMMON IS AT DSA(K)
6408: C
6409: DATA R(1), R(4) /2*1/, R(2), R(3), R(5) /3*2/, ST /1H*/
6410: DATA ZERO(1) /0/
6411: C
6412: C CHECK ISNT IN NODE AS PROCEDURE NAME
6413: C
6414: IF (FINDND(DSA(K+4),KK)) 20, 20, 10
6415: 10 CALL ERROR2(41H COMMON BLOCK HAS SAME NAME AS SUBPROGRAM, 41,
6416: * DSA(K+4), 1, 1, 1)
6417: C
6418: C CHECK IF IN COM ALREADY
6419: C
6420: 20 KK = FINDCM(DSA(K+4))
6421: IF (KK) 30, 30, 60
6422: C
6423: C CREATE NEW ENTRY
6424: C
6425: 30 IF (PCOM+SYMLEN+5.GT.LCOM) GO TO 260
6426: DO 40 I=1,SYMLEN
6427: L = PCOM + I - 1
6428: LL = K + I + 3
6429: COM(L) = DSA(LL)
6430: 40 CONTINUE
6431: C
6432: C MARK COMMON SET WHEN IT IS CREATED BY A BLOCK-DATA
6433: C SUBPROGRAM WHICH SET IT
6434: C
6435: DO 50 I=1,4
6436: LL = L + I
6437: COM(LL) = 0
6438: 50 CONTINUE
6439: COM(LL+1) = PP
6440: IF (IGATT1(NAME,8).EQ.11 .AND. IGATT1(K,2).EQ.1) COM(L+2) = 1
6441: KK = PCOM
6442: PCOM = PCOM + SYMLEN + 5
6443: C
6444: C GATHER INFO ABT LENGTH,TYPE,ORDER OF ELEMENTS
6445: C
6446: 60 L = 0
6447: S(1) = 0
6448: S(2) = 0
6449: S(3) = 0
6450: I = DSA(K+2)
6451: 70 IF (I) 130, 130, 80
6452: C
6453: C READING LIST OF ELEMENTS IN COMMON-CHECK TYPE,STRUCTURE
6454: C
6455: 80 K1 = IGATT1(DSA(I),1)
6456: K2 = IGATT1(DSA(I),7)
6457: K1 = MOD(K1,8)
6458: IF (K1.EQ.5) K1 = 2
6459: C
6460: C R(I) CONTAINS PROPER ORDER OF TYPE I IN DEFN OF COMMON
6461: C
6462: LL = R(K1+1)
6463: IF (LL.LT.L) GO TO 120
6464: IF (K2) 90, 90, 100
6465: 90 S(LL) = S(LL) + 1
6466: GO TO 110
6467: 100 K2 = DSA(I)
6468: K2 = DSA(K2+2)
6469: S(LL) = S(LL) + DSA(K2)
6470: 110 I = DSA(I+1)
6471: L = LL
6472: GO TO 70
6473: C
6474: C ACCUMULATE COUNTS OF TYPES-NOTE TYPES OUT OF ORDER CAUSES
6475: C TRUNCATION OF THE DEFINITION
6476: C
6477: 120 CALL ERROR2(41H ILLEGAL ORDERING OF DATA-TYPES IN COMMON, 41,
6478: * COM(KK), 1, 1, 0)
6479: CALL ERROR2(1H1, 0, ZERO(1), -1, 0, 1)
6480: 130 S(3) = S(1) + S(2)
6481: C
6482: C HANG COMMONLIST ENTRY OFF PP NODE, IF NOT ALREADY THERE FROM SET
6483: C
6484: L = PP + SYMLEN + 2
6485: I = MATCH(LAT(L),2,-K)
6486: IF (I.GT.0) GO TO 140
6487: I = MATCH(LAT(L),2,KK)
6488: IF (I.LE.0) GO TO 150
6489: 140 LAT(I) = KK
6490: GO TO 160
6491: C
6492: C CREATE NEW ENTRY
6493: C
6494: 150 IF (PLAT+3.GT.LLAT) GO TO 280
6495: LAT(PLAT) = KK
6496: LAT(PLAT+1) = 0
6497: LAT(PLAT+2) = LAT(L)
6498: LAT(L) = PLAT
6499: PLAT = PLAT + 3
6500: 160 I = KK + SYMLEN
6501: IF (COM(I)) 170, 170, 190
6502: C
6503: C NEW DEFN
6504: C
6505: 170 COM(I) = S(3)
6506: COM(I+2) = S(1)
6507: COM(I+3) = S(2)
6508: 180 RETURN
6509: C
6510: C COMPARE LENGTHS OF EACH TYPE
6511: C
6512: 190 L = KK + SYMLEN + 2
6513: BLANK = .FALSE.
6514: CALL S5UNPK(COM(KK), SS(1), 1)
6515: IF (SS(1).EQ.ST) BLANK = .TRUE.
6516: IBR = 0
6517: IF (COM(L+1).NE.S(2)) IBR = 1
6518: IF (COM(L).NE.S(1)) IBR = -1
6519: C BLANK COMMON DEFNS MATCH
6520: IF (IBR.EQ.0 .AND. BLANK) GO TO 180
6521: C NAMED COMMON DEFNS MATCH
6522: IF (IBR.EQ.0 .AND. .NOT.BLANK) GO TO 210
6523: C BLANK COMMON DONT MATCH
6524: IF (IBR.NE.0 .AND. BLANK) GO TO 230
6525: C NAMED COMMONS DONT MATCH -- ERROR
6526: 200 CALL ERROR2(25H INCOMPATIBLE COMMON DEFN, 25, COM(KK), 1, 1,
6527: * 0)
6528: K1 = KK + SYMLEN + 4
6529: K1 = COM(K1)
6530: CALL ERROR2(3H IN, 3, LAT(K1), 1, 0, 0)
6531: CALL ERROR2(4H AND, 4, LAT(PP), 1, 0, 1)
6532: IF (BLANK) GO TO 180
6533: C
6534: C CHECK DOUBLE SETTING OF BLOCK
6535: C
6536: 210 IF (IGATT1(K,2).NE.1 .OR. IGATT1(NAME,8).NE.11) GO TO 180
6537: IF (COM(L-1).NE.1) GO TO 220
6538: CALL ERROR2(
6539: * 53H COMMON BLOCK INITIALIZED IN TWO BLOCK DATA SUBPGMS , 53,
6540: * COM(KK), 1, 1, 1)
6541: GO TO 180
6542: 220 COM(L-1) = 1
6543: GO TO 180
6544: C
6545: C CHECK ARE LENGTHENING BLANK COMMON OFF THE END
6546: C
6547: 230 IF(IBR.EQ.(-1)) GOTO 250
6548: C ARE LENGTHENING OFF END
6549: C KEEP LONGEST DEFN
6550: IF (COM(L+1).GT.S(2)) GO TO 180
6551: 240 COM(L+1) = S(2)
6552: LL = SYMLEN + KK
6553: COM(LL) = S(3)
6554: COM(LL+4) = PP
6555: GO TO 180
6556: C SEE ARE REALLY LENGTHENING OFF END IF
6557: C DEFNS DIFFER IN FIRST DATA TYPE AREAS
6558: 250 IF (S(1).LT.COM(L) .AND. S(2).EQ.0) GO TO 180
6559: IF (.NOT.(S(1).GT.COM(L) .AND. COM(L+1).EQ.0)) GO TO 200
6560: COM(L) = S(1)
6561: GO TO 240
6562: 260 CALL ERROR1(33H IN SETCOM, TABLE OVERFLOW OF COM, 33)
6563: 270 SYSERR = .TRUE.
6564: GO TO 180
6565: 280 CALL ERROR1(33H IN SETCOM, TABLE OVERFLOW OF LAT, 33)
6566: GO TO 270
6567: END
6568: C XXXXXSETEXT.f
6569: SUBROUTINE SETEXT
6570: INTEGER Z, FINDND, PLAT, PNODE, PP, SS(3), SYMLEN
6571: INTEGER BLANK
6572: LOGICAL ERR, SYSERR, ABORT
6573: COMMON /SCR1/ LINODE, INODE(500)
6574: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6575: COMMON /INTS/ Z(346)
6576: COMMON /DETECT/ ERR, SYSERR, ABORT
6577: COMMON /HEAD/ LNODE, PNODE, NODE(500)
6578: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
6579: DATA BLANK /1H /
6580: C
6581: C SUBROUTINE SETS UP DEFNS FOR BASIC EXTERNAL FCNS USED IN PASS 1
6582: C FLUSH PAST INTRINSICS IN TABLE
6583: C
6584: K = 1
6585: DO 10 I=1,31
6586: K = K + Z(K) + 2
6587: 10 CONTINUE
6588: C
6589: C SEARCH EXTERNAL ENTRIES IN TABLE TO SEE WHICH HAVE BEEN USED
6590: C
6591: DO 90 I=1,24
6592: N = K + Z(K) + 1
6593: L = Z(N)/1024
6594: IF (L) 80, 80, 20
6595: C
6596: C SEE IF THIS EXTERNAL FCN HAS BEEN USER DEFINED
6597: C
6598: 20 L = Z(K)
6599: DO 30 J=1,SYMLEN
6600: SS(J) = BLANK
6601: 30 CONTINUE
6602: CALL S5PACK(Z(K+1), SS, L)
6603: LL = FINDND(SS(1),J)
6604: IF (LL.NE.0) GO TO 80
6605: C
6606: C SETUP LATTICE ENTRY FOR THIS EXERNAL FCN
6607: C
6608: IF (PNODE+1.GE.LNODE) GO TO 120
6609: IF (PLAT+SYMLEN+8.GE.LLAT) GO TO 110
6610: C SET LEVEL OF BASIC EXTERNAL FUNCTION TO -2
6611: INODE(PNODE) = -2
6612: NODE(PNODE) = PLAT
6613: PNODE = PNODE + 1
6614: DO 40 J=1,SYMLEN
6615: L = PLAT + J - 1
6616: LAT(L) = SS(J)
6617: 40 CONTINUE
6618: PP = PLAT
6619: PLAT = PLAT + SYMLEN
6620: LAT(PLAT) = MOD(Z(N),512)/128
6621: L = PLAT + 1
6622: LL = PLAT + 5
6623: DO 50 NN=L,LL
6624: LAT(NN) = 0
6625: 50 CONTINUE
6626: LAT(PLAT+6) = 6 + 8*MOD(Z(N),8)
6627: NO = LAT(PLAT)
6628: PLAT = PLAT + 7
6629: C
6630: C FILL IN ARG ENTRIES
6631: C NO CONTAINS NUMBER OF ARGS
6632: C
6633: IF ((PLAT+4)*NO.GE.LLAT) GO TO 110
6634: L = PP + SYMLEN + 1
6635: 60 LL = PLAT + 3
6636: DO 70 NN=PLAT,LL
6637: LAT(NN) = 0
6638: 70 CONTINUE
6639: CALL SATT2(PLAT, 1, MOD(Z(N),64)/8)
6640: CALL SATT2(PLAT, 4, 1)
6641: CALL SATT2(PLAT, 8, 10)
6642: LAT(L) = PLAT
6643: LAT(PLAT+1) = 1
6644: L = PLAT + 3
6645: PLAT = PLAT + 4
6646: IF (NO.EQ.1) GO TO 80
6647: NO = NO - 1
6648: GO TO 60
6649: 80 K = N + 1
6650: 90 CONTINUE
6651: 100 RETURN
6652: 110 CALL ERROR1(33H IN SETEXT, TABLE OVERFLOW OF LAT, 33)
6653: GO TO 130
6654: 120 CALL ERROR1(34H IN SETEXT, TABLE OVERFLOW OF NODE, 34)
6655: 130 SYSERR = .TRUE.
6656: GO TO 100
6657: END
6658: C XXXXXSETPD.f
6659: SUBROUTINE SETPD(I, K2)
6660: INTEGER PDSA, DSA, PLAT, SYMLEN
6661: LOGICAL ERR, SYSERR, ABORT
6662: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
6663: COMMON /DETECT/ ERR, SYSERR, ABORT
6664: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6665: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
6666: C
6667: C SUBROUTINE ADDS PGM UNIT AT LAT(I) ONTO K2 DESC-LIST
6668: C ADDS K2 ONTO I PARENTS LIST
6669: C
6670: IF (PLAT+4.GT.LLAT) GO TO 20
6671: C
6672: C SEE THAT K2 IS NOT ALREADY ON I PARENTS LIST
6673: C 0 RETURN INDICATES EMPTY LIST OR NO MATCH
6674: C
6675: J = I + SYMLEN + 3
6676: IF (MATCH(LAT(J),1,K2).NE.0) GO TO 10
6677: LAT(PLAT+1) = LAT(J)
6678: LAT(PLAT) = K2
6679: LAT(J) = PLAT
6680: J = K2 + SYMLEN + 4
6681: LAT(PLAT+3) = LAT(J)
6682: LAT(PLAT+2) = I
6683: LAT(J) = PLAT + 2
6684: PLAT = PLAT + 4
6685: 10 RETURN
6686: C
6687: C ERROR RETURNS
6688: C
6689: 20 SYSERR = .TRUE.
6690: CALL ERROR1(32H IN SETPD, TABLE OVERFLOW OF LAT, 32)
6691: GO TO 10
6692: END
6693: C XXXXXSETREF.f
6694: SUBROUTINE SETREF(GREEN,INDIR)
6695: INTEGER CHK1, KBR(1)
6696: INTEGER REF, PREF, PDSA, DSA, PLAT, PNODE, FINDND, SYMLEN
6697: LOGICAL ERR, SYSERR, ABORT, COMPAR, GREEN, INDIR
6698: COMMON /HEAD/ LNODE, PNODE, NODE(500)
6699: COMMON/ SCR1/ LINODE, INODE(500)
6700: COMMON /FACTS/ NAME, NOST, ITYP, IASF
6701: COMMON /CREF/ LREF, PREF, REF(100)
6702: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
6703: COMMON /DETECT/ ERR, SYSERR, ABORT
6704: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6705: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
6706: COMMON /TABL/ NEXT, LABHD, ISYM, IBNEXT
6707: DATA IBR /1/, JBR /3/, KBR(1) /0/
6708: C
6709: C GREEN = T IF ENCOUNTER EXTERNAL ENTITIES AT ALL
6710: C INDIR = T IF ENCOUNTER ANY INDIRECT REFS
6711: C READS IN ALL REFS FOR A PROGRAM UNIT; FINDS MISSING
6712: C SUBPROGRAM REFS AND DISCARDS THEM; CHECKS ASF REFS AND
6713: C DISCARDS THEM; WRITES INDIRECT REFS OUT ON I6 WITHOUT
6714: C PROCESSING; DOES MINIMAL CHECKING OF DIRECT REFS
6715: C CREATING PAR/DESC LINKS AND WRITING GOOD
6716: C REFS OUT ON I6, AFTER DONE WITH REFS, SEARCHES
6717: C FOR EXTERNAL ENTITIES (USAGE 13) TO FIX UP LEVELS
6718: C
6719: IJK = FINDND(DSA(NAME+4),IIJK)
6720: C READ IN A NEW REF; IF HIT END OF REFS RECORD
6721: C END OF REFS ON I6 AND RETURN
6722: 10 IF (INREF(I5)) 20, 20, 80
6723: C WRITE END OF REFS
6724: 20 WRITE (I6) IBR, JBR, IBR
6725: C CHECK FOR NON DUMMY EXTERNALS IN SYMBOL TABLE WHICH
6726: C C AUSE CHANGES IN LEVEL CALCS
6727: K = ISYM
6728: 30 IF (K) 40, 40, 50
6729: 150 SYSERR=.TRUE.
6730: CALL ERROR1(33H IN SETREF, TABLE OVERFLOW OF LAT,33)
6731: 40 RETURN
6732: 50 IF (IGATT1(K,8).NE.13 .OR. IGATT1(K,4).EQ.1) GO TO 70
6733: L = FINDND(DSA(K+4),IL)
6734: IF (L.NE.0) GO TO 60
6735: CALL ERROR2(18H MISSING EXTERNAL , 18, DSA(K+4), 1, 1, 0)
6736: CALL ERROR2(1H1,0,KBR(1),-1, 0, 1)
6737: GO TO 70
6738: C FOUND AN EXTERNAL ENTITY
6739: 60 GREEN = .TRUE.
6740: C ENTER ONTO GREEN LINKS LIST AT NODE
6741: N = IJK + SYMLEN + 3
6742: C J IS HEAD OF GREEN LINKS LIST (SEE SETPD)
6743: 160 IF(LAT(N+1).LE.0) GOTO 170
6744: N = LAT(N+1)
6745: GOTO 160
6746: 170 J = N+1
6747: IF(PLAT+2.GT.LLAT) GOTO 150
6748: LAT(PLAT) = -L
6749: LAT(PLAT+1) = LAT(J)
6750: LAT(J) = -PLAT
6751: PLAT = PLAT+2
6752: IF(-2.EQ.INODE(IL).OR.INODE(IL).GT.INODE(IIJK)) GOTO 70
6753: INODE(IL) = INODE(IIJK) + 1
6754: CALL ASLEV(-IL)
6755: IF (ABORT .OR. SYSERR) GO TO 40
6756: 70 K = DSA(K+3)
6757: GO TO 30
6758: C
6759: C REF IS WD1--NUMBER OF ARGS(2 WD ENTRIES)
6760: C WD2--PTR TO PGM UNIT CALLED IN DSA
6761: C WD3--STMT NO OF CALL
6762: C WD4--CODE, 0 FOR SUBR REFS; 1 FOR FCN REFS
6763: C WD5+-ARG ENTRIES (WD1-SYMBOL TABLE INDEX OR 0
6764: C WD2-TYPE/STRUCTURE INFO)
6765: C
6766: 80 IF (REF(4).LT.4) GO TO 100
6767: C
6768: C ASF REFERENCE; CHECKED AND THEN DISCARDED
6769: C
6770: K1 = PNODE - 1
6771: DO 90 I=1,K1
6772: IF (NODE(I).GE.0) GO TO 90
6773: IJR = IABS(NODE(I))
6774: L = IJR + SYMLEN + 3
6775: L = LAT(L)
6776: K = REF(2)
6777: C
6778: C IF HAVE ASF REF, FIND ASF BY NAME AND PAR CHECKS
6779: C
6780: IF (COMPAR(DSA(K+4),LAT(IJR)) .AND. LAT(L).EQ.IJK) GO TO 110
6781: 90 CONTINUE
6782: L = REF(2) + 4
6783: CALL ERROR2(18H MISSING ASF DEFN , 18, DSA(L), 1, 1, 0)
6784: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
6785: GO TO 10
6786: C
6787: C WRITE INDIRECT REF OUT ON I6
6788: C
6789: 100 K2 = IGATT1(REF(2),4)
6790: IF(K2.EQ.0) GOTO 140
6791: INDIR = .TRUE.
6792: GOTO 130
6793: C CHECK FOR MISSING SUBPROGRAM
6794: 140 K1 = REF(2)
6795: IJR = FINDND(DSA(K1+4),IIJR)
6796: IF (IJR.NE.0) GO TO 110
6797: CALL ERROR2(20H MISSING SUBPROGRAM , 20, DSA(K1+4), 1
6798: * ,1, 0)
6799: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
6800: GO TO 10
6801: C CHECK DIRECT REFS AND ASF REFS
6802: C 1 MEANS OK 0 MEANS N.G.
6803: 110 IF (CHK1(IJK,IJR)) 10, 10, 120
6804: 120 IF (REF(4).EQ.4) GO TO 10
6805: C GOOD DIRECT REF; CREATE PAR/DES LINKS
6806: CALL SETPD(IJR, IJK)
6807: IF (SYSERR) GO TO 40
6808: IF (-2.EQ.INODE(IIJR) .OR. INODE(IIJR).GT.INODE(IIJK)) GO TO 130
6809: C FIX UP LEVELS
6810: INODE(IIJR) = INODE(IIJK) + 1
6811: CALL ASLEV(IIJR)
6812: IF (SYSERR .OR. ABORT) GO TO 40
6813: 130 WRITE (I6) PREF, IBR, (REF(L),L=1,PREF)
6814: GO TO 10
6815: END
6816: C XXXXXUNSAFE.f
6817: SUBROUTINE UNSAFE
6818: C
6819: C ROUTINE READS IN ALL DIRECT AND INDIRECT REFS FOR THE CURRENT
6820: C PGM-UNIT; CHECKS FOR THE 3 UNSAFE REFS
6821: C
6822: LOGICAL IBR
6823: INTEGER PLAT, PDSA, DSA, SYMLEN, PREF, REF, INREF, FINDCM
6824: COMMON /CREF/ LREF, PREF, REF(100)
6825: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6826: COMMON /FACTS/ NAME, I1, I2, IASF
6827: COMMON /PARAMS/ I3, I4, I5, SYMLEN, I6, I7, I8
6828: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
6829: 10 IF (INREF(I7).LE.0) RETURN
6830: C CHECK FOR REF WITHOUT ARGS
6831: I = REF(1)
6832: IF (I.EQ.0) GO TO 10
6833: LL = REF(2)
6834: L = LL + SYMLEN + 1
6835: L = LAT(L)
6836: C
6837: C LPOINTS TO DUMMY ARGUMENT IN LAT
6838: C
6839: DO 70 K=1,I,2
6840: J = 4 + K
6841: IF (REF(J).EQ.0) GO TO 20
6842: N = IGATT1(REF(J),8)
6843: IF (N.EQ.10 .OR. N.EQ.4) GO TO 30
6844: GO TO 60
6845: C
6846: C LOOK FOR EXPRESSION BEING MATCHED TO AN ARG WHICH
6847: C IS SET; TYPE 1 UNSAFE REF
6848: C
6849: 20 IF (IGATT2(L,5).EQ.0) GO TO 60
6850: CALL ERROR2(
6851: * 56H EXPRESSION MATCHED TO POSSIBLY SET ARG IN REFERENCE TO ,
6852: * 56, LAT(LL), 1, 1, 0)
6853: CALL ERROR2(24H TYPE 1 UNSAFE REFERENCE, 24, REF(3), -1, 0, 1)
6854: GO TO 60
6855: C
6856: C CHECK FOR ACTUAL ARG IN COMMON BEING SENT DOWN WHERE RTNE
6857: C BENEATH CHANGES ARG OR COMMON REGION
6858: C TYPE 3 UNSAFE REFERENCE
6859: C
6860: 30 N = IGATT1(REF(J),2)
6861: IF (N.NE.1) GO TO 40
6862: C
6863: C SEE IF ACTUAL IS AN ARRAY
6864: C
6865: N = IGATT2(L,7)
6866: IF (N.NE.0) GO TO 40
6867: N = REF(J) + 2
6868: N = DSA(N)
6869: N = DSA(N+1) + 4
6870: N = FINDCM(DSA(N))
6871: NN = LL + SYMLEN + 2
6872: NN = MATCH(LAT(NN),2,N)
6873: IF (NN.EQ.0) GO TO 40
6874: N = IGATT2(L,5)
6875: IF (N.EQ.0 .AND. LAT(NN+1).EQ.0) GO TO 40
6876: CALL ERROR2(42H ARG OR COMMON MAY BE SET BY REFERENCE TO , 42,
6877: * LAT(LL), 1, 1, 0)
6878: CALL ERROR2(24H TYPE 3 UNSAFE REFERENCE, 24, REF(3), -1, 0, 1)
6879: C
6880: C CHECK FOR DO CONTROL VAR OR LIMIT MATCHED
6881: C TO DUMMY ARG POSSIBLY SET
6882: C
6883: 40 NN = IGATT2(L,5)
6884: IF (NN.EQ.0) GO TO 60
6885: NN = REF(J+1)/32
6886: IF (NN.NE.1) GO TO 50
6887: CALL ERROR2(
6888: * 51H DO CONTROL VARIABLE OR LIMIT CAN BE SET IN REF TO , 51,
6889: * LAT(LL), 1, 1, 0)
6890: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
6891: C
6892: C CHECK FOR ADJUSTIBLE DIMENSION VARIABLE MATCHED TO DUMMY
6893: C ARG POSSIBLY SET
6894: C
6895: 50 NN = REF(J+1)/64
6896: IF (NN.NE.1) GO TO 60
6897: CALL ERROR2(
6898: * 52H ADJUSTIBLE DIMENSION VARIABLE CAN BE SET IN REF TO ,
6899: * 52, LAT(LL), 1, 1, 0)
6900: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
6901: 60 L = LAT(L+3)
6902: 70 CONTINUE
6903: C
6904: C CHECK FOR SAME ACTUAL ARG SENT DOWN FOR DIFFERENT DUMMY-ARGS
6905: C AND ONE OF DUMMIES MAY BE SET
6906: C
6907: C TYPE 2 UNSAFE REFERENCE
6908: IF (REF(1).LE.2) GO TO 130
6909: LR = LL + SYMLEN + 1
6910: LR = LAT(LR)
6911: C
6912: C OUTER LOOP GOES TO NEXT TO LAST ARG
6913: C
6914: I = REF(1) + 3
6915: II = I - 2
6916: DO 120 K=5,II,2
6917: J = REF(K)
6918: IF (J.EQ.0) GO TO 110
6919: JBR = IGATT1(J,8)
6920: IF (JBR.NE.10 .AND. JBR.NE.4) GO TO 110
6921: L = LAT(LR+3)
6922: MM = K + 2
6923: DO 100 M=MM,I,2
6924: IF (REF(M).NE.J) GO TO 90
6925: C
6926: C HAVE TWO ACTUALS MAPPED ONTO DIFFERENT DUMMIES
6927: C
6928: C IF BOTH DUMMIES ARE ARRAYS OR BOTH ARE UNSET, NO UNSAFE
6929: IF( IGATT2(L,7).NE.0 .AND. IGATT2(LR,7).NE.0 ) GOTO 90
6930: IF( IGATT2(L,5).EQ.0 .AND. IGATT2(LR,5).EQ.0 ) GOTO 90
6931: 80 CALL ERROR2(64
6932: *H ACTUAL ARG ASSOCIATED WITH 2 DUMMY ARGS POSSIBLY SET IN REF TO
6933: *, 64, LAT(LL), 1, 1, 0)
6934: CALL ERROR2(24H TYPE 2 UNSAFE REFERENCE, 24, REF(3), -1, 0, 1)
6935: 90 L = LAT(L+3)
6936: 100 CONTINUE
6937: 110 LR = LAT(LR+3)
6938: 120 CONTINUE
6939: C
6940: C CHECK FOR EXTERNAL FCNS WITHIN ASF-DEFS WHICH CONTAIN
6941: C ASF-DUMMIES AND WHICH SET THEIR ARGS
6942: C
6943: 130 IF (REF(4).NE.1) GO TO 10
6944: II = REF(1) + 3
6945: IBR = .FALSE.
6946: DO 140 K=5,II,2
6947: J = REF(K)
6948: IF (J.EQ.0) GO TO 140
6949: IF (IGATT1(J,8).EQ.1) IBR = .TRUE.
6950: 140 CONTINUE
6951: IF (.NOT.IBR) GO TO 10
6952: C
6953: C SEE IF EXTERNAL FCN SETS ANY OF ITS ARGS
6954: C
6955: K = LL + SYMLEN + 1
6956: K = LAT(K)
6957: II = REF(1)/2
6958: DO 150 L=1,II
6959: IF (IGATT2(K,8).EQ.10 .AND. IGATT2(K,5).EQ.1) IBR = .FALSE.
6960: 150 CONTINUE
6961: IF (IBR) GO TO 10
6962: CALL ERROR2(37H ILLEGAL USAGE OF ASF-DUMMY IN REF TO, 37,
6963: * LAT(LL), 1, 1, 0)
6964: CALL ERROR2(1H , 0, REF(3), -1 ,0, 1)
6965: GO TO 10
6966: END
6967: C XXXXXCHECKS.f
6968: SUBROUTINE CHECKS(IROOT)
6969: C
6970: C MAIN IS INDEX IN NODE OF SUPEROOT IN LAT
6971: C
6972: LOGICAL ERR, SYSERR, ABORT, INSYM
6973: COMMON /PARAMS/ I1, I2, I3, I4, I5, I6, I7
6974: COMMON /DETECT/ ERR, SYSERR, ABORT
6975: CALL COMCHK(IROOT)
6976: CALL SCAN(IROOT)
6977: IF (SYSERR) GO TO 20
6978: 10 IF(.NOT.INSYM(I6,0)) GOTO 30
6979: CALL UNSAFE
6980: GO TO 10
6981: 20 WRITE (I2,99999)
6982: 99999 FORMAT (31H1UNSAFE REFERENCES NOT VERIFIED)
6983: 30 RETURN
6984: END
6985: C XXXXXCONSTR.f
6986: SUBROUTINE CONSTR(MAINND)
6987: LOGICAL SYSERR, ERR, ABORT, INSYM, GREEN, INDIR
6988: LOGICAL OVER
6989: C NOTE SETNOD SETS ABORT FOR 2 P.U. WITH SAME NAME
6990: C CONSTR SETS ABORT IF IT FINDS NO SYMBOL TABLES FROM PASS1
6991: C ASLEV SETS ABORT IF IT FINDS RECURSION IN CALLING GRAPH
6992: INTEGER OUTUT2, OUTUT3, OUTUT4, SYMLEN
6993: INTEGER PNODE, PLAT, LS(2)
6994: COMMON /HEAD/ LNODE, PNODE, NODE(500)
6995: COMMON /SCR1/ LINODE, INODE(500)
6996: COMMON /PARAMS/ I1, I2, I3, SYMLEN, OUTUT2, OUTUT3, OUTUT4
6997: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
6998: COMMON /DETECT/ ERR, SYSERR, ABORT
6999: DATA IBR /1/, JBR /4/
7000: DATA LS(1) /1H,/, LS(2) /1H /
7001: C
7002: C CONSTR DIRECTS THE FIRST PORTION OF PASS2
7003: C CALLS SETNOD TO CONSTRUCT THE LAT NODES FOR EACH P.U..
7004: C CALLS SETEXT TO SETUP BASIC EXERNALS NODES
7005: C AS NEEDED.
7006: C CALLS SETREF TO MAKE CONNECTS BETWEEN THE NODES
7007: C CALLS INVOKE TO CALCULATE LEVELS AND ASSIMILATE
7008: C ALL PROC INFO NECESSARY
7009: C CALLS ERASE TO GET RID OF NON-REFERENCE LINKS IN
7010: C CALLING GRAPH
7011: C CALLS CHKALL TO DO FINAL CHECKS OF ALL REFS AND TO
7012: C WRITE ALL GOOD REFS OUT FOR FUTURE PROCESSING
7013: C FORMS SUPERROOT IN GRAPH
7014: C CALLS OUTPUT ROUTINES WHENEVER CAN, TO GIVE PARTIAL
7015: C LISTINGS OF CURRENT DATA STRUCTURE
7016: C
7017: C USE INSYM TO POSSIBLY SKIP OVER BAD REFS WITH DUMMY SYM TBL
7018: C SETREF READS REFS FROM OUTUT3, WRITES ON OUTUT4
7019: C INVOKE READS FROM OUTUT4
7020: C CHKALL READS FROM OUTUT4, WRITES OUTUT3
7021: C UNSAFE READS FROM OUTUT3
7022: C INITIALIZE LEVEL ARRAY AND ISR
7023: ISR = 0
7024: DO 10 I=1,LNODE
7025: INODE(I) = 0
7026: 10 CONTINUE
7027: C INITIALIZE LOGICAL FLAGS FOR DETECTION OF PRESENCE OF
7028: C EXTERNAL ENTITIES (GREEN) AND INDIRECT REFS(INDIR)
7029: GREEN = .FALSE.
7030: INDIR = .FALSE.
7031: 20 IF(.NOT.INSYM(0,0)) GOTO 30
7032: C
7033: C SUCCESSFULLY READ SYMBOL TABLE
7034: C
7035: CALL SETNOD
7036: IF (SYSERR .OR. ABORT) GO TO 130
7037: GO TO 20
7038: 30 REWIND OUTUT2
7039: IF (PNODE.EQ.1) GO TO 150
7040: C CHANGE LEVEL ON ASFS SO DONT PROCESS THEM
7041: L = PNODE - 1
7042: DO 40 I=1,L
7043: IF (NODE(I).LT.0) INODE(I) = -2
7044: 40 CONTINUE
7045: C
7046: C SETUP BASIC EXTERNAL DEFNS AS NEEDED
7047: C
7048: CALL SETEXT
7049: IF (SYSERR) GO TO 130
7050: C
7051: C READ IN SYMBOL TABLES
7052: C SETREF WILL READ IN REFS
7053: C
7054: 50 IF(.NOT.INSYM(OUTUT3, OUTUT4)) GOTO 60
7055: CALL SETREF ( GREEN, INDIR )
7056: IF (SYSERR .OR. ABORT) GO TO 130
7057: GO TO 50
7058: 60 REWIND OUTUT2
7059: REWIND OUTUT3
7060: WRITE (OUTUT4) IBR, JBR, IBR
7061: REWIND OUTUT4
7062: IF(.NOT.INDIR) GOTO 70
7063: C
7064: C CALL LEVEL ALG
7065: C
7066: CALL INVOKE
7067: IF (ABORT .OR. SYSERR) GO TO 130
7068: REWIND OUTUT2
7069: REWIND OUTUT4
7070: C
7071: C CHECK AND EXPAND REFS AND SAVE ALL GOOD ONES FOR LATER
7072: C
7073: 70 IF(.NOT.INSYM(OUTUT4,OUTUT3)) GOTO 80
7074: CALL CHKALL
7075: IF (SYSERR) GO TO 130
7076: GO TO 70
7077: 80 WRITE (OUTUT3) IBR, JBR, IBR
7078: C
7079: C CONSTRUCT SUPEROOT IN LAT
7080: C
7081: IF (PNODE+1.GT.LNODE) GO TO 180
7082: IF (PLAT+SYMLEN+7.GT.LLAT) GO TO 160
7083: NODE(PNODE) = PLAT
7084: C MAINND IS SUPEROOT INDEX IN NODE
7085: C ISR IS SUPEROOT INDEX IN LAT
7086: MAINND = PNODE
7087: ISR = PLAT
7088: PNODE = PNODE + 1
7089: LAT(PLAT) = LS(1)
7090: PLAT = PLAT + 1
7091: IF (SYMLEN.EQ.1) GO TO 100
7092: DO 90 I=2,SYMLEN
7093: L = PLAT + I - 2
7094: LAT(L) = LS(2)
7095: 90 CONTINUE
7096: PLAT = L + 1
7097: 100 L = PLAT + 5
7098: DO 110 I=PLAT,L
7099: LAT(I) = 0
7100: 110 CONTINUE
7101: LAT(L+1) = 5
7102: PLAT = L + 2
7103: C
7104: C LOOK FOR CALLABLE PGM UNITS WITHOUT PARENTS
7105: C
7106: L = PNODE - 2
7107: DO 120 I=1,L
7108: K = SYMLEN + 3 + IABS(NODE(I))
7109: IF (LAT(K).EQ.0) CALL SETPD(IABS(NODE(I)), ISR)
7110: IF (SYSERR) GO TO 130
7111: 120 CONTINUE
7112: 130 IF(.NOT.GREEN) GOTO 190
7113: C ERASE GREEN LINKS
7114: L = PNODE - 2
7115: DO 210 I = 1,L
7116: C SKIP ASF NODES
7117: IF(NODE(I) .LT. 0) GOTO 210
7118: C FIND HEAD OF GREEN LINKS
7119: N = NODE(I) + SYMLEN + 3
7120: 220 IF(LAT(N+1) .LE. 0) GOTO 230
7121: N = LAT(N+1)
7122: GOTO 220
7123: 230 LAT(N+1) = 0
7124: 210 CONTINUE
7125: 190 OVER = SYSERR
7126: SYSERR = .FALSE.
7127: CALL OUT2 (ISR)
7128: SYSERR = SYSERR.OR.OVER
7129: IF(SYSERR) CALL ERROR1(
7130: * 56H ILLEGAL COMMON USAGE AND UNSAFE REFERENCES NOT VERIFIED,
7131: * 56)
7132: CALL OUT2C
7133: 140 RETURN
7134: 150 ABORT = .TRUE.
7135: GO TO 140
7136: 160 CALL ERROR1(33H IN CONSTR, TABLE OVERFLOW OF LAT, 33)
7137: 170 SYSERR = .TRUE.
7138: GO TO 130
7139: 180 CALL ERROR1(34H IN CONSTR, TABLE OVERFLOW OF NODE, 34)
7140: GO TO 170
7141: END
7142: C XXXXXOUT2.f
7143: SUBROUTINE OUT2(ISR)
7144: INTEGER SYMLEN, PNODE, BL, PLAT, STACK, Q(3), C(12),
7145: * OUTLAT, OUTCOM, OUTUT
7146: LOGICAL ERR, SYSERR, ABORT
7147: EXTERNAL EXCH
7148: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, I1, I2, II1
7149: COMMON /DETECT/ ERR, SYSERR, ABORT
7150: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7151: COMMON /CEXPRS/ LSTACK, STACK(620)
7152: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7153: COMMON /SCR1/ LINODE, INODE(500)
7154: DATA C(1) /1HE/, C(2) /1HD/, C(3) /1HR/, C(4) /1HI/, C(5) /1HC/,
7155: * C(6) /1HL/, C(7) /1HS/, C(8) /1HA/, C(9) /1HF/, IP /1HP/, IBL
7156: * /1H-/, C(12) /1HU/, C(10) /1HB/, C(11) /1HN/
7157: DATA BL /1H /
7158: C
7159: C ROUTINE PRINTS CALLING GRAPH
7160: C
7161: IF (PNODE.LE.2) GO TO 110
7162: C
7163: C GRAPH
7164: C
7165: I3 = PNODE - 1
7166: IF (ISR.NE.0) I3 = I3 - 1
7167: C
7168: C SORT LATTICE
7169: C
7170: DO 10 I=1,I3
7171: INODE(I) = IABS(NODE(I))
7172: 10 CONTINUE
7173: CALL SSORT(EXCH, LAT, LLAT, INODE, I3, 0)
7174: DO 100 IA=1,I3
7175: I = INODE(IA)
7176: L = I + SYMLEN + 6
7177: IF (MOD(LAT(L),8).EQ.4) GO TO 100
7178: CALL S5UNPK(LAT(I), STACK(1), 6)
7179: WRITE (OUTUT,99999) (STACK(L),L=1,6)
7180: 99999 FORMAT (///1X, 6A1//)
7181: C
7182: C GET ARGS IF ANY
7183: C
7184: IS = 1
7185: K = SYMLEN + I
7186: L = LAT(K)
7187: IF (L) 70, 70, 20
7188: 20 K = K + 1
7189: K = LAT(K)
7190: IF (L*8.GT.LSTACK) GO TO 120
7191: DO 60 LL=1,L
7192: Q(1) = IGATT2(K,8)
7193: IF (Q(1).EQ.5 .OR. Q(1).EQ.6 .OR. Q(1).EQ.13) GO TO 30
7194: Q(1) = IGATT2(K,1)
7195: Q(2) = IGATT2(K,5)
7196: Q(3) = IGATT2(K,7)
7197: STACK(IS) = IBL
7198: STACK(IS+2) = IBL
7199: IF (Q(1).GE.8) STACK(IS) = C(1)
7200: L1 = MOD(Q(1),8) + 2
7201: STACK(IS+1) = C(L1)
7202: IF (Q(2).EQ.1) STACK(IS+2) = C(7)
7203: STACK(IS+3) = C(7)
7204: IF (Q(3).NE.0) STACK(IS+3) = C(8)
7205: GO TO 40
7206: 30 STACK(IS) = IP
7207: STACK(IS+1) = IBL
7208: STACK(IS+2) = IBL
7209: STACK(IS+3) = IBL
7210: 40 DO 50 LK=4,7
7211: L1 = LK + IS
7212: STACK(L1) = BL
7213: 50 CONTINUE
7214: IS = IS + 8
7215: K = LAT(K+3)
7216: 60 CONTINUE
7217: IS = IS - 1
7218: C PRINT ARGUMENTS
7219: K = 48
7220: IF (K.GT.IS) K = IS
7221: WRITE(OUTUT,99998)(STACK(LK), LK=1,K)
7222: 99998 FORMAT(20H ARGUMENT ATTRIBUTES ,5X,6(8A1,1X))
7223: IF( K.EQ.IS ) GOTO 70
7224: 65 LK = K + 1
7225: K = LK + 47
7226: IF(K.GT.IS) K = IS
7227: WRITE(OUTUT,99997) (STACK(L1),L1=LK,K)
7228: 99997 FORMAT(25X,6(8A1,1X))
7229: IF(K.LT.IS) GOTO 65
7230: C
7231: C GET COMMON NAMES
7232: C
7233: 70 K = I + SYMLEN + 2
7234: K = OUTCOM(LAT(K),IS)
7235: IF (SYSERR) GO TO 110
7236: IF (K.EQ.0) GO TO 80
7237: CALL OUT2A(14H COMMON BLOCKS, 14, IS, 2)
7238: C
7239: C FIND PARENTS
7240: C
7241: 80 K = I + SYMLEN + 3
7242: K = OUTLAT(LAT(K),IS,ISR)
7243: IF (SYSERR) GO TO 110
7244: IF (K.EQ.0) GO TO 90
7245: CALL OUT2A(22H CALLED BY SUBPROGRAMS, 22, IS, 1)
7246: C
7247: C FIND DESCENDENTS
7248: C
7249: 90 K = I + SYMLEN + 4
7250: K = OUTLAT(LAT(K),IS,ISR)
7251: IF (SYSERR) GO TO 110
7252: IF (K.EQ.0) GO TO 100
7253: CALL OUT2A(18H CALLS SUBPROGRAMS, 18, IS, 1)
7254: 100 CONTINUE
7255: 110 RETURN
7256: 120 SYSERR = .TRUE.
7257: CALL ERROR1(33H IN OUT2, TABLE OVERFLOW OF STACK, 33)
7258: GO TO 110
7259: END
7260: C XXXXXSETNOD.f
7261: SUBROUTINE SETNOD
7262: INTEGER PLAT, COM, PNODE, PDSA, DSA, SYMLEN, PP, SYMHD, PCOM,
7263: * SETARG, FINDND, FINDCM
7264: LOGICAL ERR, SYSERR, ABORT
7265: COMMON /COMS/ LCOM, PCOM, COM(300)
7266: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7267: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7268: COMMON /DETECT/ ERR, SYSERR, ABORT
7269: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
7270: COMMON /PARAMS/ INUT, I1, NOCHAR, SYMLEN, I2, I3, I4
7271: COMMON /FACTS/ NAME, NOST, ITYP, IASF
7272: COMMON /TABL/ NEXT, LABHD, SYMHD, IBNEXT
7273: COMMON /SCR1/ LINODE, INODE(500)
7274: C
7275: C LAT-IS THE CALLING GRAPH PLUS AUXILIARY NODES
7276: C PLAT-IS NEXT FREE WORD IN LAT
7277: C LLAT-IS LENGTH OF LAT
7278: C NODE-IS LIST OF ALL CALLING NODES INDICES IN LAT
7279: C (WILL BE IN ALPHABETIC ORDER BEFORE CHECKING COMMENCES)
7280: C PNODE-IS NEXT FREE WORD IN NODE
7281: C LNODE-IS LENGTH OF NODE
7282: C
7283: C P.U. NODE IN LAT
7284: C WD 1.....PACKED CHARACTERS OF NAME OF SUBPGM
7285: C WD2.....NUMBER OF ARGS
7286: C WD3.....PTR TO HEAD OF LINEAR LINKED ORDERED LIST OF
7287: C ARGUMENT NODES IN LAT
7288: C WD4.....PTR TO HEAD OF LINEAR LINKED LIST OF COMMON NODES
7289: C IN LAT
7290: C WD5.....PTR TO HEAD OF LINEAR LINKED LIST OF INDICES IN
7291: C LAT OF ENTRIES FOR PARENT NODES
7292: C WD6.....PTR TO HEAD OF LINEAR LINKED LIST OF INDICES IN
7293: C LAT OF ENTRIES FOR DESCENDENT NODES
7294: C WD7.....PTR TO HEAD OF LINEAR LINKED LIST OF SEQUENCE NOS OF
7295: C BAD REFERENCES; INCONSISTANT TYPE OF FCN/SUBR REFERENCE, INCORR
7296: C NUMBER OF ARGS, AND RECURSIVE CALL OF SELF ARE THE THREE
7297: C TYPES OF BAD REFS
7298: C WD8.....BITS 0-2 TYPE OF SUBPGM: 0 SUBR, 1 FCN, 2 BLOCK DATA,
7299: C 3 MAIN, 4 ASF, 5 SUPEROOT
7300: C BITS 3-5 (IF FCN OR ASF) CONTAIN TYPE OF FCN: 0 DP, 1 RL,
7301: C 2 INT, 3 COMP, 4 LOG
7302: C
7303: C ARGUMENT NODE IN LAT
7304: C WD1.....ATTRIBUTES (SAME AS IN DSA, SEE LOOKUP)
7305: C WD2.....LENGTH (IN PROCEDURE ARGS THIS WORD POINTS TO
7306: C HEAD OF LINEAR LINKED LIST OF ACTUAL SUBPGM NAMES ASSOCIATED
7307: C WITH THIS ARG IN THE PROGRAM; ALSO HAVE INDEX IN LAT OF
7308: C SUBPRGM IN WHICH THE ASSOC OCCURS
7309: C WD 3.....PTR TO HEAD OF LINEAR LINKED LIST OF PARENT ARGS
7310: C (ARGS FROM PARENT RTNES SENT DOWN TO BE ASSOC. WITH THIS ARG)
7311: C WD 4.....PTR TO HEAD OF LINEAR LINKED LIST OF DESC. ARGS
7312: C (ARGS FROM DESC RTNES WHICH THIS ARG IS ASSOC. WITH)
7313: C WD 5.....PTR TO NEXT ARG NODE OR 0
7314: C
7315: C COMMON NODE IN LAT
7316: C WD 1.....INDEX OF ENTRY FOR THIS COMMON IN COM
7317: C WD 2.....1 IF COMMON STORED INTO BY THIS P.U. ELSE 0
7318: C WD 3.....PTR TO NEXT COMMON NODE
7319: C CREATE NODE PTR TO NEW NODE IN LAT
7320: C
7321: IF (PNODE.GT.LNODE) GO TO 170
7322: IF (PLAT+SYMLEN+7.GT.LLAT) GO TO 190
7323: C
7324: C CHECK IF SUBPROGRAM HAS NAME SAME AS ANOTHER SUBPROGRAM
7325: C OR A COMMON BLOCK
7326: C
7327: II = IGATT1(NAME,8)
7328: IF (II.EQ.11) GO TO 10
7329: IF (FINDND(DSA(NAME+4),IROOT)) 10, 10, 20
7330: 10 IF (FINDCM(DSA(NAME+4))) 40, 40, 30
7331: 20 ERR = .TRUE.
7332: 30 CALL ERROR2(45H SUBPROGRAM AND/OR COMMON BLOCK NAME CONFLICT, 45,
7333: * DSA(NAME+4), 1, 1, 1)
7334: IF (.NOT.ERR) GO TO 40
7335: ERR = .FALSE.
7336: ABORT = .TRUE.
7337: GO TO 160
7338: 40 NODE(PNODE) = PLAT
7339: IROOT = PNODE
7340: PNODE = PNODE + 1
7341: C
7342: C ENTER NAME INTO NODE
7343: C
7344: DO 50 I=1,SYMLEN
7345: L = NAME + 3 + I
7346: LL = PLAT - 1 + I
7347: LAT(LL) = DSA(L)
7348: 50 CONTINUE
7349: C
7350: C PP POINTS TO CURRENT RTNE NODE IN LAT
7351: C
7352: PP = PLAT
7353: PLAT = LL + 6
7354: LL = LL + 1
7355: DO 60 I=LL,PLAT
7356: LAT(I) = 0
7357: 60 CONTINUE
7358: C
7359: C 0 SUBR, 1 FCN, 2 BLOCK DATA, 3 MAIN, 4 ASF, 5 SUPEROOT
7360: C
7361: LAT(PLAT+1) = II/4
7362: C INITIALIZE LEVEL OF BLOCK DATA TO -2
7363: IF (LAT(PLAT+1).EQ.2) INODE(IROOT) = -2
7364: IF (LAT(PLAT+1).NE.1) GO TO 70
7365: L = IGATT1(NAME,1)
7366: LAT(PLAT+1) = LAT(PLAT+1) + 8*MOD(L,8)
7367: 70 PLAT = PLAT + 2
7368: C
7369: C HAVING INITIALIZED NODE TO 0, LOOK FOR ARGS
7370: C
7371: IF (DSA(NAME+2)) 80, 90, 80
7372: 80 L = PP + SYMLEN
7373: LAT(L) = SETARG(PP,NAME)
7374: IF (SYSERR) GO TO 160
7375: C
7376: C READ THROUGH SYMBOL TABLE FOR COMMON BLOCK DEFNS AND ASF DEFS
7377: C AND SETTING OF COMMON REGION
7378: C
7379: 90 K = SYMHD
7380: 100 IF (K) 110, 160, 110
7381: 110 LL = IGATT1(K,8)
7382: C
7383: C CHECK FOR ASF AND COMMON DEFNS OR COMMON
7384: C SETTING INFO
7385: C
7386: GO TO (140, 120, 140, 140, 140, 140, 130, 150, 140, 150, 140,
7387: * 140, 140, 140), LL
7388: C
7389: C CREATE ASF NODE
7390: C
7391: 120 CALL SETASF(PP, K)
7392: IF (SYSERR) GO TO 160
7393: GO TO 140
7394: C
7395: C CREATE COM ENTRY
7396: C
7397: 130 CALL SETCOM(PP, K)
7398: IF (SYSERR) GO TO 160
7399: 140 K = DSA(K+3)
7400: GO TO 100
7401: C
7402: C CHECK IF ELEMENT IN COMMON
7403: C
7404: 150 LL = IGATT1(K,2)
7405: L = IGATT1(K,5)
7406: IF (L.NE.1 .OR. LL.NE.1) GO TO 140
7407: L = DSA(K+2)
7408: L = DSA(L+1)
7409: CALL MKCOM(PP, L)
7410: IF (SYSERR) GO TO 160
7411: GO TO 140
7412: 160 RETURN
7413: 170 CALL ERROR1(34H IN SETNOD, TABLE OVERFLOW OF NODE, 34)
7414: 180 SYSERR = .TRUE.
7415: GO TO 160
7416: 190 CALL ERROR1(33H IN SETNOD, TABLE OVERFLOW OF LAT, 33)
7417: GO TO 180
7418: END
7419: C XXXXXCHK1.f
7420: INTEGER FUNCTION CHK1(IR, IE)
7421: C
7422: C PROGRAM UNIT AT LAT(IR) CALLS PROGRAM UNIT AT LAT(IE)
7423: C CHK1 RETURNS 1 IF REF OK ELSE 0
7424: C CHECKS FOR INCONSISTENT SYBPGM USAGE, CORRECT NO. OF
7425: C ARGS, CORRECT USAGE MATCH UP OF ARGS
7426: C
7427: INTEGER PREF, REF, PDSA, DSA, PLAT, SYMLEN, IBR(1)
7428: COMMON /CREF/ LREF, PREF, REF(100)
7429: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
7430: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7431: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7432: CHK1 = 0
7433: C CHECKS FOR SELF RECURSION
7434: IF (IE.NE.IR) GO TO 10
7435: CALL ERROR2(24H RECURSIVE CALL OF SELF , 24, REF(3), -1, 1, 1)
7436: GO TO 100
7437: C CHECKS FOR USAGE OF SUBPGM CONSISTENT WITH DEF
7438: 10 I = IE + SYMLEN + 6
7439: N = MOD(LAT(I),8)
7440: IF (N.EQ.REF(4) .OR. N.EQ.6 .AND. REF(4).EQ.1) GO TO 20
7441: CALL ERROR2(38H INCONSISTENT REFERENCE TO SUBPROGRAM , 38,
7442: * LAT(IE), 1, 1, 0)
7443: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7444: GO TO 100
7445: C CHECKS FOR CORRECT NO. ARGS
7446: 20 I = IE + SYMLEN
7447: IF (LAT(I).EQ.REF(1)/2) GO TO 30
7448: CALL ERROR2(42H INCORRECT NUMBER OF ARGS IN REFERENCE TO , 42,
7449: * LAT(IE), 1, 1, 0)
7450: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7451: GO TO 100
7452: C ARE DONE WITH REF IF IT HAS NO ARGS
7453: 30 CHK1 = 1
7454: IF(LAT(I)) 100, 100, 40
7455: C CHECK USAGES OF ARGS IN CALL VS USAGES OF ARGS IN DEF
7456: C N POINTS TO DUMMY ARG ENTRY
7457: 40 I = LAT(I)
7458: N = IE + SYMLEN + 1
7459: L = 5
7460: DO 80 K=1,I
7461: MD = IGATT2(LAT(N),8)
7462: IF (MD.NE.13 .AND. MD.NE.5 .AND. MD.NE.6) GO TO 60
7463: C HAVE A PROC ARG IN DEF
7464: C NEED A PROC ARG IN REF
7465: IF (REF(L).EQ.0) GO TO 50
7466: MR = IGATT1(REF(L),8)
7467: IF (MR.EQ.13 .OR. MR.EQ.6 .OR. MR.EQ.5) GO TO 70
7468: 50 IBR(1) = K
7469: CALL ERROR2(36H INCOMPATIBLE USAGE ASSOCIATED WITH ,36,IBR,-2,1,0)
7470: CALL ERROR2(17H IN REFERENCE TO ,17,LAT(IE), 1, 0, 0)
7471: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7472: CHK1 = 0
7473: GOTO 70
7474: C HAVE VARIABLE OR ARRAY AS ARG IN DEF
7475: C NEED SAME IN REF
7476: 60 IF (REF(L).EQ.0) GO TO 70
7477: MR = IGATT1(REF(L),8)
7478: IF (MR.EQ.13 .OR. MR.EQ.5 .OR. MR.EQ.6) GO TO 50
7479: 70 N = LAT(N) + 3
7480: L = L + 2
7481: 80 CONTINUE
7482: 100 RETURN
7483: END
7484: C XXXXXCHK2.f
7485: INTEGER FUNCTION CHK2(IR, IE)
7486: C
7487: C PROGRAM UNIT AT LAT(IR) CALLS PROGRAM UNIT AT LAT(IE)
7488: C CHK2 RETURNS 1 IF REF IS OK, ELSE 0
7489: C CHECKS TYPE OF FCN IF FCN IS REFERENCED,
7490: C CHECKS PROC PARAMETERF FOR COMPATIBLE USAGE AND TYPE
7491: C TYPE AND STRUCTURE OF VARIABLE
7492: C AND ARRAY ARGS, BUILDS UPWARD LINKS BETWEEN
7493: C DUMMIES FOR SETTING INFO TRANSFER IN SCAN
7494: C BAD STRUCTURE MATCHING MAKES REF BAD
7495: C NO DUMMY LINKS CREATED IN THIS CASE
7496: C
7497: INTEGER REF, PREF, PDSA, DSA, PLAT, SYMLEN, FINDND, AER(1)
7498: LOGICAL ERR, SYSERR, ABORT
7499: COMMON /DETECT/ ERR, SYSERR, ABORT
7500: COMMON /CREF/ LREF, PREF, REF(100)
7501: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
7502: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7503: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7504: COMMON /FACTS/ NAME, NOST, ITYP, IASF
7505: CHK2 = 1
7506: C CHECK TYPE OF FCN CALLED IF A FCN
7507: IF (REF(4).NE.1) GO TO 10
7508: I = IE + SYMLEN + 6
7509: IF (MOD(IGATT1(REF(2),1),8).EQ.LAT(I)/8) GO TO 10
7510: IF (MOD(LAT(I),8).EQ.6 .AND. IGATT1(REF(2),1)/8.NE.1) GO TO 10
7511: CALL ERROR2(39H INCOMPATIBLE FCN TYPE IN REFERENCE TO , 39,
7512: * LAT(IE), 1, 1, 0)
7513: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7514: C CYCLE THROUGH ARGS IF ANY
7515: 10 I = IE + SYMLEN
7516: IF (LAT(I).EQ.0) GO TO 170
7517: I = LAT(I)
7518: N = IE + SYMLEN + 1
7519: L = 5
7520: DO 160 K=1,I
7521: AER(1) = K
7522: L1 = IGATT2(LAT(N),8)
7523: IF (L1.EQ.13 .OR. L1.EQ.6 .OR. L1.EQ.5) GO TO 90
7524: C CHECK STRUCTURE AND TYPE OF VARIABLES
7525: C AND ARRAY ARGUMENTS
7526: K1 = MOD(IGATT2(LAT(N),1),8)
7527: K2 = IGATT2(LAT(N),7)
7528: IF (K2.GT.1) K2 = 1
7529: L1 = MOD(REF(L+1),8)
7530: L2 = MOD(REF(L+1),32)/8
7531: C
7532: C CHECK TYPE, CHECK HOLLERITH CONSTANTS MATCHED
7533: C ALWAYS TO INTEGER ARRAYS
7534: C
7535: IF (L1.NE.5 .OR. REF(L).NE.0) GO TO 20
7536: IF (REF(4).EQ.0 .AND. K2.NE.0 .AND. K1.EQ.2) GO TO 40
7537: CALL ERROR2(33H HOLLERITH CONST ASSOCIATED WITH ,33,AER,-2,1,0)
7538: CALL ERROR2(17H IN REFERENCE TO , 17,LAT(IE),1, 0, 0)
7539: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7540: CHK2 = 0
7541: GO TO 150
7542: 20 IF (K1.EQ.L1 .OR. K1.EQ.2 .AND. L1.EQ.5) GO TO 30
7543: CALL ERROR2(33H MISMATCHED TYPE ASSOCIATED WITH ,33,AER,-2,1,0)
7544: CALL ERROR2(17H IN REFERENCE TO ,17,LAT(IE),1, 0, 0)
7545: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7546: C
7547: C CHECK STRUCTURE L2 = 0 SCALAR, 1 ARRAY, 2 ARRAY ELE
7548: C
7549: 30 IF (K2.EQ.1 .AND. L2.GT.0 .OR. K2.EQ.0 .AND. (L2.EQ.2 .OR.
7550: * L2.EQ.0)) GO TO 40
7551: CALL ERROR2(38H MISMATCHED STRUCTURE ASSOCIATED WITH ,38,AER,-2,
7552: * 1, 0)
7553: CALL ERROR2(17H IN REFERENCE TO , 17, LAT(IE),1, 0, 0)
7554: CALL ERROR2(1H1, 0, REF(3), -1,0,1)
7555: CHK2 = 0
7556: GO TO 150
7557: C
7558: C CHECK IF ACTUAL ARG IS NON-PROC DUMMY ARG IN CURRENT PGM UNIT
7559: C IF SO CREATE ARGLINK.
7560: C NO ARGLINK CREATED IF FCN CALLED IS AN ASF
7561: C
7562: 40 IF (REF(L).LE.0 .OR. REF(4).EQ.4) GO TO 150
7563: K1 = IGATT1(REF(L),4)
7564: IF (K1.EQ.0) GO TO 150
7565: C
7566: C FIND REL. POSITION OF CALLING PGM
7567: C DUMMY , L1 PTS TO IT IN LAT
7568: L3 = DSA(NAME+2)
7569: KK = 0
7570: 50 KK = KK + 1
7571: IF (DSA(L3).EQ.REF(L)) GO TO 60
7572: L3 = DSA(L3+1)
7573: GO TO 50
7574: 60 K2 = 0
7575: L1 = IR + SYMLEN - 2
7576: 70 L1 = LAT(L1+3)
7577: K2 = K2 + 1
7578: IF (K2.LT.KK) GO TO 70
7579: C FIND REL POSITION OF CALLED DUMMY ARG
7580: C L2 PTS TO IT IN LAT
7581: K1 = 0
7582: L2 = IE + SYMLEN - 2
7583: 80 L2 = LAT(L2+3)
7584: K1 = K1 + 1
7585: IF (K1.LT.K) GO TO 80
7586: IF (MATCH(LAT(L2+2),1,L1).NE.0) GO TO 150
7587: IF (PLAT+2.GT.LLAT) GO TO 180
7588: LAT(PLAT) = L1
7589: LAT(PLAT+1) = LAT(L2+2)
7590: LAT(L2+2) = PLAT
7591: PLAT = PLAT + 2
7592: GO TO 150
7593: C CHECK PROC ARGUMENTS TO SEE THEY ARE CORRECT USAGE AND TYPE
7594: C LAT(N) PTS TO DUMMY ARG ENTRY IN LAT
7595: C REF(L) PTS TO CORRESP REF ARG IN DSA
7596: 90 IF (IGATT1(REF(L),4).EQ.1) GO TO 110
7597: C REFERENCE CONTAINS AN AACTUAL PROC NAME
7598: C CHECK FOR MISSING SUBPROGRAM
7599: L3 = REF(L)
7600: L2 = FINDND(DSA(L3+4),L3)
7601: IF (L2.NE.0) GO TO 100
7602: L3 = REF(L) + 4
7603: CALL ERROR2(20H MISSING SUBPROGRAM , 20, DSA(L3), 1, 1, 0)
7604: CALL ERROR2(17H IN REFERENCE TO , 17, LAT(IE), 1, 0, 0)
7605: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7606: GO TO 150
7607: C CALL CHK3 TO PREFORM CHECKS
7608: 100 L5 = L2 + SYMLEN + 6
7609: CALL CHK3(LAT(N), L2, L1, MOD(LAT(L5),8), IE, REF(3), AER)
7610: GO TO 150
7611: C REFERENCE CONTAINS A DUMMY ARGUMENT MUST CHECK ALL ACTUALS
7612: C WHICH CAN CORRESPOND TO THAT DUMMY
7613: C FIRST FIND ITS CORRESP ACTUAL, IF ANY
7614: 110 L2 = REF(L)
7615: L2 = DSA(L2+2)
7616: C L2 IS OFFSET AMONG ALL DUMMIES OF LAT(IR)
7617: C OF THE DUMMY ARG AT REF(L)
7618: L3 = IR + SYMLEN + 1
7619: L3 = LAT(L3)
7620: IF (L2.EQ.1) GO TO 130
7621: DO 120 L4=2,L2
7622: L3 = LAT(L3+3)
7623: 120 CONTINUE
7624: C L3 PTS TO DUMMY ARG IN CALLING RTNE
7625: 130 L3 = LAT(L3+1)
7626: C L3 CONTAINS OFFSET FOR PROC ACTUALS
7627: C MATCHED TO THIS DUMMY ARG
7628: C IN TEMPLATED OFF LAT(IR)
7629: L2 = IR + SYMLEN + 5
7630: IF (LAT(L2).NE.0) GO TO 140
7631: L3 = REF(L) + 4
7632: CALL ERROR2(35H NO ACTUAL PROCS SUBSTITUTABLE FOR , 35,
7633: * DSA(L3), 1, 1, 0)
7634: CALL ERROR2(17H IN REFERENCE TO , 17, LAT(IE), 1, 0, 0)
7635: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7636: GO TO 150
7637: C L2 PTS TO ACTUALS TEMPLATE
7638: 140 L2 = LAT(L2)
7639: L4 = L2 + L3
7640: C LAT(L4) IS ACTUAL PAIRED TO REF(L)
7641: L5 = LAT(L4) + SYMLEN + 6
7642: CALL CHK3(LAT(N), LAT(L4), L1, MOD(LAT(L5),8), IE, REF(3), AER)
7643: C CYCLE TO NEXT ACTUAL
7644: L2 = LAT(L2) + L2
7645: IF (LAT(L2)) 150, 150, 140
7646: 150 L = L + 2
7647: N = LAT(N) + 3
7648: 160 CONTINUE
7649: 170 RETURN
7650: 180 SYSERR = .TRUE.
7651: CHK2 = 0
7652: CALL ERROR1(31H IN CHK2, TABLE OVERFLOW OF LAT, 31)
7653: GO TO 170
7654: END
7655: C XXXXXFIND.f
7656: INTEGER FUNCTION FIND(K)
7657: C
7658: C FIND HAS TO FIND THE INDEX IN NODE
7659: C OF THE LATTICE ENTRY AT K, DOES A
7660: C LINEAR SEARCH ON NODE ARRAY
7661: C P.U. ASSUMES NODE ARRAY SET UP PROPERLY
7662: C AND THAT NODES ITS ASKED TO FIND ARE ALWAYS IN THE
7663: C ARRAY SOMEWHERE. CAN BE ASKED TO FIND INDEX OF
7664: C ANY NODE IN LATTICE, EVEN ASFS
7665: C
7666: INTEGER PNODE
7667: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7668: L = PNODE - 1
7669: DO 10 I=1,L
7670: IF (K.NE.IABS(NODE(I))) GO TO 10
7671: FIND = I
7672: GO TO 20
7673: 10 CONTINUE
7674: 20 RETURN
7675: END
7676: C XXXXXASLEV.f
7677: SUBROUTINE ASLEV(IPT)
7678: C
7679: C ASLEV TAKES A SUBLATTICE WITH ITS ROOT AT NODE(IABS(IPT)))
7680: C AND READJUSTS THE LEVELS IN THE SUBLATTICE
7681: C IN ACCORDANCE WITH NEW LEVEL AT ROOT
7682: C NOTE, IPT LT 0 FROM CALL IN SETREF (EXT) AND FROM ACTUALS
7683: C PASSED DOWN IN PROC
7684: C
7685: INTEGER PNODE, STACK, PLAT, FIND, SYMLEN
7686: INTEGER ZERO(1)
7687: LOGICAL SYSERR, ERR, ABORT, GR
7688: COMMON /DETECT/ ERR, SYSERR, ABORT
7689: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7690: COMMON /SCR1/ LINODE, INODE(500)
7691: COMMON /SCR2/ LSTACK, STACK(500)
7692: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7693: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7694: DATA ZERO(1) /0/
7695: C
7696: C STACK (IS) IS SIGNED NODE INDEX OF SUBPGM
7697: C IF GT 0, NODE IS ALONG A RED LINK TO PARENT
7698: C IF LT 0, NODE IS ALONG A GREEN LINK TO PARENT
7699: C
7700: C STACK(IS+1) IS PTR TO TWO WORD DESC ENTRY FOR THIS
7701: C SUBPGM, OR 0 FOR END OF DESC LIST
7702: C
7703: K = IABS (IPT )
7704: K = SYMLEN + NODE(K) + 4
7705: STACK(2) = IPT
7706: STACK (1) = IABS ( LAT(K) )
7707: IS = 2
7708: C DOES TOP OF STACK ENTRY HAVE UNVISITED DESC
7709: 10 IF (STACK(IS-1).NE.0) GO TO 20
7710: C TEST IF ARE DONE WITH SUBLATTICE
7711: IF (IS.EQ.2) RETURN
7712: C POP UP A LEVEL IN PATH
7713: IS = IS - 2
7714: GO TO 10
7715: C UPDATE ENTRY OF NEXT DESCENDENT TO BE CHECKED ON STACK
7716: 20 K = STACK(IS-1)
7717: STACK(IS-1) = IABS (LAT(K+1))
7718: C LAT(K) CONTAINS SIGNED INDEX OF DESC BEING PROCESSED
7719: C SIGN INDICATES COLOR OF LINK TO PARENT, (I.E.
7720: C NODE AT TOP OF STACK)
7721: C LT 0 IS GREEN LINK, GT 0 IS RED LINK
7722: C L IS INDEX IN NODE(*) OF DESC BEING PROCESSED
7723: C KK IS INDEX IN LAT(*) OF DESC BEING PROCESSED
7724: LL = 1
7725: IF( LAT(K) .LT. 0) LL = -1
7726: KK = IABS(LAT(K))
7727: L = FIND(KK)
7728: C SKIP ALL DESC WITH NEGATIVE LEVELS
7729: IF (INODE(L).LT.0) GO TO 10
7730: C SEE IF STACK TOO SHORT FOR LOOPS
7731: IF( IS.LE.2) GOTO 40
7732: C CHECK FOR LOOPS IN PATH STACK DESC
7733: LOOP = 0
7734: GR = .FALSE.
7735: IF(LL.EQ.(-1)) GR = .TRUE.
7736: DO 60 I = 2,IS,2
7737: IF(LOOP) 70,70,90
7738: 90 IF(STACK(I).LT.0) GR = .TRUE.
7739: GOTO 60
7740: 70 IF(L.EQ.IABS(STACK(I))) LOOP = I
7741: 60 CONTINUE
7742: C NO LOOPS
7743: IF(LOOP.EQ.0) GOTO 40
7744: C LOOP OF MIXED COLORED LINKS
7745: C DO NOT STACK DESC
7746: IF(GR) GOTO 10
7747: C RECURSION
7748: ABORT = .TRUE.
7749: CALL ERROR2(19H RECURSIVE CALL OF ,19,LAT(KK), 1, 1, 0)
7750: DO 80 K=LOOP,IS,2
7751: KK = IABS(STACK(K))
7752: KK = NODE(KK)
7753: 80 CALL ERROR2(11H INVOLVING ,11,LAT(KK),1, 0, 0)
7754: CALL ERROR2(1H1, 0, ZERO, -3, 0, 1)
7755: 30 RETURN
7756: C TEST IF DESC LEVEL IS ALREADY GT LEVEL OF PAR
7757: C THEN NEEDNT CHECK PART OF SUBLATTICE UNDER THIS DESC
7758: 40 K = IABS (STACK(IS))
7759: IF (INODE(L).GT.INODE(K)) GO TO 10
7760: C PUSH DESC ONTO STACK AFTER FIXING HIS LEVEL
7761: INODE(L) = INODE(K) + 1
7762: C TEST AGAINST LNODE BECAUSE SCRATCH ARRAY
7763: C IS AS LONG AS NODE ARRAY
7764: IF (IS+2.GT.LNODE) GO TO 50
7765: STACK(IS+2) = LL * L
7766: K = NODE(L) + SYMLEN + 4
7767: STACK(IS+1) = IABS( LAT(K))
7768: IS = IS + 2
7769: GO TO 10
7770: 50 SYSERR = .TRUE.
7771: CALL ERROR1(43H IN ASLEV, PATH LONGER THAN NUMBER OF NODES, 43)
7772: GO TO 30
7773: END
7774: C XXXXXINVOKE.f
7775: SUBROUTINE INVOKE
7776: C
7777: C PGM UNIT STEPS THROUGH NODES IN INVOCATION ORDER
7778: C PUSHING ACTUAL PROC ARGS DOWN LATTICE WHERE NECESSARY
7779: C AND READJUSTING LEVEL IF NECESSARY
7780: C
7781: INTEGER PNODE, PLAT, PDSA, DSA, SYMLEN, PREF, REF, FIND, CHK1,
7782: * ZERO(1), FINDND
7783: LOGICAL ERR, SYSERR, ABORT, OK, AOK
7784: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7785: COMMON /DETECT/ ERR, SYSERR, ABORT
7786: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7787: COMMON /SCR1/ LINODE, INODE(500)
7788: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7789: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
7790: COMMON /CREF/ LREF, PREF, REF(100)
7791: COMMON /FACTS/ NAME, NOST, ITYPE, IASF
7792: DATA ZERO(1)/0/
7793: C NC IS CURRENT NODE, NP IS PREVIOUS NODE PROCESSED
7794: NC = 0
7795: 10 NP = NC
7796: OK = .TRUE.
7797: AOK = .TRUE.
7798: C
7799: C SEARCH FOR NEXT NODE TO DO, NODE WITH LOWEST POSIT LEVEL IN INODE
7800: C UPON ENTRY TO INVOKE, SUPEROOT IS -1, ASFS AND BLOCK DATA
7801: C ARE -2. IF CANT FIND A POSITIVE LEVEL ARE DONE
7802: C
7803: L = PNODE - 1
7804: DO 20 I=1,L
7805: IF (INODE(I).LT.0) GO TO 20
7806: NC = I
7807: GO TO 40
7808: 20 CONTINUE
7809: 30 RETURN
7810: 40 J = NC
7811: DO 50 I=J,L
7812: IF (INODE(I).GE.0 .AND. INODE(I).LT.INODE(NC)) NC = I
7813: 50 CONTINUE
7814: C READ IN SYMBOL TABLE FOR NODE(NC) AND POSITION REFS CORRECTLY
7815: CALL RDSYM(NC, NP)
7816: 60 IF (INREF(I6)) 140, 140, 70
7817: C HAVE A REFERENCE TO PROCESS
7818: 70 IF (IGATT1(REF(2),4).EQ.1) GO TO 80
7819: C PROCESSING A DIRECT REFERENCE
7820: C NEED ONLY PROCESS REF TEMPLATE IF ANY PROC ACTUAL ARGS IN REF
7821: L = REF(2)
7822: L = FINDND(DSA(L+4),K)
7823: CALL PROC(NODE(NC), L, K, AOK)
7824: IF (SYSERR .OR. ABORT) GO TO 30
7825: GO TO 60
7826: C PROCESSING AN INDIRECT REF
7827: 80 K = NODE(NC) + SYMLEN + 5
7828: K = LAT(K)
7829: IF (K.EQ.0) GO TO 150
7830: C K PTS TO A TEMPLATE OF ACTUALS AT LAT(NODE(NC))
7831: C L GIVES REL POSIT AMONG PROC DUMMIES IN LAT(NODE(NC))
7832: C OF PROC DUMMY BEING CALLED
7833: L = REF(2)
7834: L = DSA(L+2)
7835: I = NODE(NC) + SYMLEN + 1
7836: I = LAT(I)
7837: IF (L.EQ.1) GO TO 100
7838: DO 90 M=2,L
7839: I = LAT(I+3)
7840: 90 CONTINUE
7841: C
7842: C I PTS TO DUMMY PROC ARG ENTRY IN LAT
7843: C
7844: 100 M = LAT(I+1) + K
7845: M = LAT(M)
7846: C M PTS TO ACTUAL SUBSTITUTABLE FOR I
7847: L = FIND(M)
7848: C RECURSION DUE TO INDIRECT REF COMPLETING THE LOOP
7849: IF (-1.NE.INODE(L)) GO TO 110
7850: ABORT = .TRUE.
7851: CALL ERROR2(26H RECURSIVE LOOP INVOLVING , 26, DSA(NAME+4), 1,1,0)
7852: CALL ERROR2(14H AND POSSIBLY , 14, LAT(M), 1, 0, 1)
7853: GO TO 30
7854: C NOTE NEED NOT WORRY ABOUT MISSING SUBPGM SINCE
7855: C THEN ITS LAT INDEX COULDNOT BE IN TEMPLATE
7856: 110 IF (CHK1(NODE(NC),M).EQ.0) GO TO 130
7857: C PROCESSED A LEGAL INDIRET REF
7858: CALL SETPD(M, NODE(NC))
7859: IF (SYSERR) GO TO 30
7860: IF (-2.EQ.INODE(L) .OR. INODE(NC).LT.INODE(L)) GO TO 120
7861: INODE(L) = INODE(NC) + 1
7862: CALL ASLEV(L)
7863: IF (ABORT .OR. SYSERR) GO TO 30
7864: C LOOK FOR MORE ACTUALS
7865: 120 CALL PROC(NODE(NC), M, L, AOK)
7866: IF (SYSERR .OR. ABORT) GO TO 30
7867: 130 K = LAT(K) + K
7868: K = LAT(K)
7869: IF (K) 60, 60, 100
7870: C MARK CURRENT NODE DONE
7871: 140 INODE(NC) = -1
7872: GO TO 10
7873: 150 IF (.NOT.OK) GO TO 60
7874: K = NODE(NC)
7875: CALL ERROR2(20H NO ACTUAL PROCS IN ,20, LAT(K), 1, 1, 0)
7876: CALL ERROR2(28H CANNOT PROCESS FORMAL REFS , 28,
7877: * ZERO, -3, 0, 1)
7878: OK = .FALSE.
7879: GO TO 60
7880: END
7881: C XXXXXRDSYM.f
7882: SUBROUTINE RDSYM(IC, IP)
7883: C
7884: C PGM UNIT RDSYM POSITIONS I4,I6 CORRECTLY AND INPUTS SYMBOL
7885: C TABLE OF PGM UNIT AT NODE(IC) WHEN LAST ONE READ WAS THAT OF NODE
7886: C
7887: INTEGER SYMLEN, PDSA, PLAT, FINDND, PNODE, DSA
7888: LOGICAL INSYM, L
7889: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7890: COMMON /FACTS/ NAME, NOST, ITYP, IASF
7891: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
7892: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7893: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7894: IF (IP.LT.IC) GO TO 10
7895: REWIND I4
7896: REWIND I6
7897: 10 L = INSYM(I6,0)
7898: IF (FINDND(DSA(NAME+4),I).EQ.NODE(IC)) RETURN
7899: 20 IF (INREF(I6).EQ.1) GO TO 20
7900: GO TO 10
7901: END
7902: C XXXXXPROC.f
7903: SUBROUTINE PROC(IP, IM, IIM, OK)
7904: C
7905: C P.U. AT LAT(IP) CALLS P.U. AT LAT(IM) (NODE(IIM))
7906: C PROC COLLECTS ACTUAL PROC TEMPLATE(S) FROM THE CALL IF IT CAN
7907: C CHECKS FOR MISSING SUBPGMS AND STORES TEMPLATES OFF PGM UNIT
7908: C AT LAT(IM), THEM PROC CALLS ASLEV TO READJUST LEVELS OF ACTUALS
7909: C SENT TO LAT(IM) VS LEVEL (IM)
7910: C
7911: LOGICAL ERR, SYSERR, ABORT, OK
7912: INTEGER STACK, SYMLEN, PDSA, DSA, REF, PREF, PNODE, PLAT, FINDND,
7913: * FIND, SS(120), KBR(1)
7914: COMMON /CEXPRS/ LSTACK, STACK(620)
7915: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
7916: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
7917: COMMON /CREF/ LREF, PREF, REF(100)
7918: COMMON /HEAD/ LNODE, PNODE, NODE(500)
7919: COMMON /SCR1/ LINODE, INODE(500)
7920: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
7921: COMMON /DETECT/ ERR, SYSERR, ABORT
7922: EQUIVALENCE (SS(1),STACK(501))
7923: DATA KBR(1) /0/
7924: LSS = 501
7925: C ARE THERE ARGS IN THIS REF
7926: IF (REF(1).NE.0) GO TO 20
7927: 10 RETURN
7928: C CYCLE THROUGH REF ARGS
7929: C JJ IS LAST ENTRY IN REF FOR ARGS
7930: C IS PTS TO FIRST FREE WD IN STACK
7931: C MAX IS 1 IF NO DUMMY PROCS IN REF, ELSE IS EQUAL TO THE
7932: C NUMBER OF ACTUAL PROCS SUBSTITUTABLE FOR THE DUMMY PROCS
7933: 20 JJ = REF(1) + 4
7934: IS = 1
7935: MAX = 0
7936: DO 90 I=5,JJ,2
7937: C SKIP OVER EXPR AS ACTUAL ARGS AND ALL ACTUALS BUT PROC ARGS
7938: IF (REF(I).EQ.0) GO TO 90
7939: IF (REF(I+1).NE.6) GO TO 90
7940: C SEE IF ACTUAL ARG IS DUMMY PROC ARG AT LAT(IP)
7941: C OR ACTUAL PROCEDURE
7942: IF (IGATT1(REF(I),4).EQ.1) GO TO 40
7943: C HAVE AN ACTUAL PROCEDURE
7944: L = REF(I)
7945: L = FINDND(DSA(L+4),K)
7946: IF (L.NE.0) GO TO 30
7947: C IF, AS GATHERING ACTUAL PROCS MATCHED TO DUMMY PROC ARGS
7948: C PROC FINDS A MISSING SUBPROGM, PROCESSING OF THIS REF CEASES
7949: L = REF(I)
7950: CALL ERROR2(20H MISSING SUBPROGRAM , 20, DSA(L+4), 1, 1, 0)
7951: CALL ERROR2(1H1, 0, REF(3), -1, 0, 1)
7952: GO TO 10
7953: 30 IF (IS+2.GT.LSS) GO TO 200
7954: C 2 WD STACK ENTRY FOR AN ACTUAL PROC AS AN ACTUAL ARG
7955: C IS FIRST WD - 1, 2ND WD - LAT INDEX OF ACTUAL PROC
7956: STACK(IS) = 1
7957: STACK(IS+1) = L
7958: IF (MAX.EQ.0) MAX = 1
7959: IS = IS + 2
7960: GO TO 90
7961: C HAVE A DUMMY PROC CHECK OUT NO OF ACTUALS
7962: C MATCHED TO IT AND STACK THOSE WITH COUNTER ON TOP
7963: 40 L = IP + SYMLEN + 5
7964: L = LAT(L)
7965: IF (L.NE.0) GO TO 50
7966: IF (.NOT.OK) GOTO 10
7967: CALL ERROR2(26H MISSING ACTUAL PROCEDURES ,26, KBR(1), -1,1,1)
7968: OK = .FALSE.
7969: GO TO 10
7970: C COLLECT ACTUALS CORRESPONDING TO THIS PROC ARG
7971: C K IS REL POSIT OF PROC ARG AMONG ALL ARGS AT LAT(IP)
7972: C L PTS TO TEMPLATE AT LAT(IP)
7973: 50 K = REF(I)
7974: K = DSA(K+2)
7975: C J POINTS TO FIRST ELEMENT ON ARGLIST
7976: J = IP + SYMLEN + 1
7977: J = LAT(J)
7978: IF (K.LE.1) GO TO 70
7979: DO 60 LL=2,K
7980: J = LAT(J+3)
7981: 60 CONTINUE
7982: C K IS REL POSIT OF PROC ARG AMONG PROC ARGS IN LAT(IP)
7983: C THAT IS IT IS OFFSET NECESS TO READ CORRESP ACTUAL
7984: C PROCS OFF TEMPLATES AT LAT(IP)
7985: C J POINTS TO DUMMY PROC ARG ENTRY IN LAT (IP)
7986: 70 K = LAT(J+1)
7987: IF (IS+1.GE.LSS) GO TO 200
7988: C J POINTS TO POSITION IN STACK OF COUNT OF HOW MANY
7989: C ACTUALS ARE MATCHED TO THIS DUMMY
7990: J = IS
7991: STACK(IS) = 0
7992: IS = IS + 1
7993: 80 IF (IS+1.GE.LSS) GO TO 200
7994: C N WD STACK ENTRY FOR DUMMY PROC ARGS USED AS ACTUAL ARGS IN REF
7995: C WD 1 CONTAINS NO OF ACTUAL PROCS MATCHED TO THE DUMMY
7996: C WDS 2 - N CONTAIN THE LAT INDICES OF EACH ACTUAL PROC
7997: STACK(J) = STACK(J) + 1
7998: LL = K + L
7999: STACK(IS) = LAT(LL)
8000: IS = IS + 1
8001: L = LAT(L) + L
8002: L = LAT(L)
8003: IF (L.NE.0) GO TO 80
8004: IF (STACK(J).GT.MAX) MAX = STACK(J)
8005: 90 CONTINUE
8006: C HAVE COLLECTED ALL PROC ACTUALS CORRESP TO THE PROC
8007: C ARGS IN THE REF, NOTE MAX IS NO OF TEMPLATES RESULTING FROM
8008: C THIS REF TO BE PASSED TO LAT(IM) AS LONG AS THEIR DUPS
8009: C ARE NOT THERE ALREADY
8010: C BUILD EACH TEMPLATE IN LOOP AND CHECK FOR DUPLICATION
8011: C IF NOT THERE COPY INTO LAT OFF LAT(IM) AND CHECK LEVEL OF ACTUALS
8012: C PASSED DOWN VS LEVEL OF LAT(IM)
8013: IF (MAX.EQ.0) GO TO 10
8014: DO 190 I=1,MAX
8015: C CREATE PROC INDICES PORTION OF TEMPLATE IN SS
8016: K = 1
8017: ISS = 1
8018: 100 IF (K.GE.IS) GO TO 110
8019: L = 1
8020: IF (STACK(K).GT.1) L = I
8021: IF (ISS+1.GE.120) GO TO 200
8022: J = K + L
8023: SS(ISS) = STACK(J)
8024: K = K + STACK(K) + 1
8025: ISS = ISS + 1
8026: GO TO 100
8027: C HAVE TEMPLATE IN SS(1) THROUGH SS(ISS-1)
8028: C SEE IF IT HAS A DUPLICATE AT LAT(IM)
8029: 110 K = IM + SYMLEN + 5
8030: K = LAT(K)
8031: IST = ISS - 1
8032: 120 IF (K.EQ.0) GO TO 150
8033: DO 130 L=1,IST
8034: J = K + L
8035: IF (LAT(J).NE.SS(L)) GO TO 140
8036: 130 CONTINUE
8037: C FOUND DUPLICATE
8038: GO TO 190
8039: C HAVENT FOUND A DUPLICATE YET
8040: C SEE IF THERE ARE MORE TEMPLATES TO COMPARE
8041: 140 K = LAT(K) + K
8042: K = LAT(K)
8043: GO TO 120
8044: C NOT A DUPLICATE WILL ADD IT ON
8045: 150 IF (PLAT+IST+2.LE.LLAT) GO TO 160
8046: CALL ERROR1(32H IN PROC, TABLE OVERFLOW OF LAT , 32)
8047: SYSERR = .TRUE.
8048: GO TO 10
8049: C MAKE AN ENTRY CONSISTING OF 1ST WORD - NO OF PROCS+1, SUBSEQUENT
8050: C WORDS - PROCS LAT INDICES, LAST WORD - PTR
8051: C TO NEXT SUCH TEMPLATE
8052: 160 DO 170 L=1,IST
8053: J = PLAT + L
8054: LAT(J) = SS(L)
8055: 170 CONTINUE
8056: LAT(PLAT) = IST + 1
8057: L = PLAT
8058: PLAT = PLAT + IST + 2
8059: J = IM + SYMLEN + 5
8060: LAT(PLAT-1) = LAT(J)
8061: LAT(J) = L
8062: C CHECK LEVELS
8063: DO 180 L=1,IST
8064: J = FIND(SS(L))
8065: C FIND HEAD OF GREEN LINKS LIST AT LAT(IM)
8066: JR = IM + SYMLEN + 3
8067: JLR = -SS(L)
8068: 210 IF(LAT(JR+1) .LE. 0) GOTO 220
8069: JR = LAT(JR+1)
8070: GOTO 210
8071: C HAVE TOP OF GREEN LINKS LIST AT LAT(JR)
8072: 220 IF(LAT(JR+1) .EQ. 0) GOTO 230
8073: JR = IABS( LAT(JR+1) )
8074: C LOOK FOR DUPLICATE ENTRY ON GREEN LINKS LIST
8075: IF(LAT(JR) .EQ. JLR) GOTO 240
8076: GOTO 220
8077: C ADD ON ENTRY TO GREEN LINKS LIST
8078: 230 IF(PLAT + 2 .GT. LLAT) GOTO 250
8079: LAT(PLAT) = JLR
8080: LAT(PLAT+1) = 0
8081: LAT(JR+1) = -PLAT
8082: PLAT = PLAT+2
8083: 240 IF((-1).EQ.INODE(J) .OR. (-2).EQ.INODE(J) .OR.
8084: * INODE(J).GT.INODE(IIM)) GOTO 180
8085: INODE(J) = INODE(IIM) + 1
8086: CALL ASLEV (-J)
8087: IF (SYSERR .OR. ABORT) GO TO 10
8088: 180 CONTINUE
8089: 190 CONTINUE
8090: GO TO 10
8091: 200 SYSERR = .TRUE.
8092: CALL ERROR1(33H IN PROC, TABLE OVERFLOW OF STACK, 33)
8093: GO TO 10
8094: 250 SYSERR = .TRUE.
8095: CALL ERROR1(31H IN PROC, TABLE OVERFLOW OF LAT,31)
8096: GOTO 10
8097: END
8098: C XXXXXCHKALL.f
8099: SUBROUTINE CHKALL
8100: C
8101: C CHKALL READS IN REFS FROM OUTUT4 AND CHECKS THEM
8102: C EXPANDS ALL INDIRECTS AND CHECKS THEM, IF ALL OK
8103: C WRITES THE EXPANDED VERSION OUT ON OUTUT3
8104: C TEMPLATE WRITTEN OUT CONSISTS OF
8105: C PREF - NO OF WORDS TO FOLLOW
8106: C IBR - CODE .LT.3 TO SHOW OK REF
8107: C REF(1) - 2*NO OF ARGS
8108: C IJR - LAT INDEX OF CALLED P.U.
8109: C REF(3) - STMT NO OF REF
8110: C REF(4) - CODE 0-SUBR, 1-FCN
8111: C REF(5 -) - ARG ENTRIES
8112: C FOR DIRECT REFS IF OK WRITES THE DIRECT REF OUT ON OUTUT3
8113: C CHKALL WRITES END OF REFS ON OUTUT3 BEFORE RETURNING
8114: C
8115: INTEGER OUTUT3, OUTUT4, DSA, PDSA, REF, PREF, PLAT, SYMLEN, FINDND
8116: INTEGER CHK1, CHK2
8117: LOGICAL ERR, SYSERR, ABORT, QP2, QBR
8118: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, OUTUT3, OUTUT4
8119: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
8120: COMMON /CREF/ LREF, PREF, REF(100)
8121: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
8122: COMMON /DETECT/ ERR, SYSERR, ABORT
8123: COMMON /FACTS/ NAME, NOST, ITYP, IASF
8124: COMMON /PASS/ QP2, QBR
8125: DATA IBR /1/, JBR /3/
8126: C IJK IS CALLING PGM UNIT; IJR IS PGM UNIT CALLED
8127: IJK = FINDND(DSA(NAME+4),L1)
8128: 10 IF (INREF(OUTUT4)) 20, 20, 30
8129: C WRITE END OF REFS AND RETURN
8130: 20 WRITE (OUTUT3) IBR, JBR, IBR
8131: QBR = .FALSE.
8132: RETURN
8133: C CHECK IF REF INDIRECT OR DIRECT
8134: 30 IF (IGATT1(REF(2),4).EQ.1) GO TO 40
8135: C HAVE A DIRECT REF
8136: IJR = REF(2)
8137: IJR = FINDND(DSA(IJR+4),L1)
8138: IBAR = CHK2(IJK,IJR)
8139: IF (SYSERR) GO TO 20
8140: IF (IBAR.EQ.1) WRITE (OUTUT3) PREF, IBR, REF(1), IJR,
8141: * (REF(L),L=3,PREF)
8142: GO TO 10
8143: C HAVE AN INDIRECT REF
8144: 40 K = IJK + SYMLEN + 5
8145: K = LAT(K)
8146: C NOTE HAVE FLAGGED THIS ERROR OF NO ACTUALS AT LAT(IM)
8147: C BEFORE IN PROC SO NOW SKIP OVER REF
8148: IF (K.EQ.0) GO TO 10
8149: C K POINTS TO ACTUALS TEMPLATE AT CALLING PGM
8150: L = REF(2)
8151: L = DSA(L+2)
8152: J = IJK + SYMLEN + 1
8153: J = LAT(J)
8154: IF (L.LE.1) GO TO 60
8155: DO 50 LL=2,L
8156: J = LAT(J+3)
8157: 50 CONTINUE
8158: 60 L = LAT(J+1)
8159: C L IS OFFSET IN ACTUALS TEMPLATE OF ACTUALS
8160: C CORRESP TO THIS DUMMY
8161: 70 J = K + L
8162: IJR = LAT(J)
8163: QBR = .TRUE.
8164: IF (CHK1(IJK,IJR).NE.1) GO TO 80
8165: IBAR = CHK2(IJK,IJR)
8166: IF (SYSERR) GO TO 20
8167: IF (IBAR.EQ.1) WRITE (OUTUT3) PREF, IBR, REF(1), IJR,
8168: * (REF(L),L=3,PREF)
8169: 80 QBR = .FALSE.
8170: K = LAT(K) + K
8171: K = LAT(K)
8172: IF (K) 10, 10, 70
8173: END
8174: C XXXXXCHK3.f
8175: SUBROUTINE CHK3(IDUM, IACT, IDUM8, IACT8, IE, R, NO)
8176: C
8177: C CHECKS PROC ARGUMENTS FOR PROPER USAGE AND TYPE
8178: C IDUM LAT INDEX DUMY PROC ARG
8179: C IACT LAT INDEX ACTUAL PROC
8180: C IDUM8 USAGE DUMMY FROM DSA ATTRIBUTES
8181: C IACT8 USAGE ACTUAL FROM LAT ENTRY
8182: C IE CALLED RTNE
8183: C R STMT NO OF CALL
8184: C NO CONTAINS THE NUMBER OF PARAMETER BEING CHECKED BY THIS CALL
8185: C
8186: INTEGER PLAT, R(1), SYMLEN, NO(1)
8187: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6
8188: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
8189: C SEPARATE OUT EXTERNAL ENTITIES
8190: IF (IDUM8.NE.13) GO TO 20
8191: L = IGATT2(IDUM,1)/8
8192: IF (L.NE.1) GO TO 50
8193: C FURTHER CHECK THAT EPLICITLY TYPED EXTERNAL ENTITIES
8194: C MATCH FCNS
8195: IF (IACT8.NE.1 .AND. IACT8.NE.6) GO TO 30
8196: C CHECK FCN HAS SAME TYPE ACROSS REF BNDRY
8197: 10 L = IACT + SYMLEN + 6
8198: IF (MOD(IGATT2(IDUM,1),8).EQ.LAT(L)/8) GO TO 50
8199: CALL ERROR2(40H INCONSISTENT FCN TYPES IN REFERENCE TO , 40,
8200: * LAT(IE), 1, 1, 0)
8201: CALL ERROR2(1H1, 0, R(1), -1, 0, 1)
8202: GO TO 50
8203: C CHECK SUBROUTINES
8204: 20 IF (IDUM8.EQ.6 .AND. IACT8.EQ.0) GO TO 50
8205: C CHECK OUT FCNS
8206: IF (IDUM8.EQ.5 .AND. IACT8.EQ.1) GO TO 10
8207: C SEPARATE OUT BASIC EXTERNALS BECAUSE THEY ARE CONSIDERED
8208: C TYPED BY THE FORTRAN.
8209: IF (IDUM8.EQ.5 .AND. IACT8.EQ.6) GO TO 40
8210: 30 CALL ERROR2(
8211: * 50H INCOMPATIBLE PROCEDURE PARAMETER ASSOCIATED WITH ,50,
8212: * NO, -2, 1, 0)
8213: CALL ERROR2(17H IN REFERENCE TO ,17, LAT(IE), 1, 0, 0)
8214: CALL ERROR2(1H1, 0, R(1), -1, 0, 1)
8215: GO TO 50
8216: C CHECK BASIC EXTER HAS NOT BEEN EXPLICITLY TYPED
8217: C OR ELSE IT HAS TO AGREE WITH THE ACTUAL TYPE
8218: 40 L = IACT + SYMLEN + 6
8219: IF (LAT(L)/8.EQ.1) GO TO 10
8220: 50 RETURN
8221: END
8222: combine done
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.