|
|
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.