|
|
1.1 ! root 1: SUBROUTINE PU ! 2: INTEGER STMT, PSTMT, SYMLEN, OUTUT, SYMHD, BNEXT, HASH, DSA ! 3: INTEGER STACK, DOPT, DOLIST, PDSA, OUTUT2, OUTUT3, OUTUT4 ! 4: INTEGER Q(70) ! 5: LOGICAL ERR, BLKD, SYSERR, LOGIF1, LOGIF2, LAB, EOF ! 6: LOGICAL NEW, TOKLAB, EXECUT, P1ERR, OPT, RET, ABORT ! 7: LOGICAL P2, QBR ! 8: COMMON /OPTNS/ OPT(5), P1ERR ! 9: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327) ! 10: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3, ! 11: * OUTUT4 ! 12: COMMON /CEXPRS/ LSTACK, STACK(620) ! 13: COMMON /FACTS/ NAME, NOST, ITYP, IASF ! 14: COMMON /DETECT/ ERR, SYSERR, ABORT ! 15: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT ! 16: COMMON /CHASH/ LHASH, HASH(401) ! 17: COMMON /CTABL/ LDSA, PDSA, DSA(5000) ! 18: COMMON /DOS/ DOPT, LDO, DOLIST(192) ! 19: COMMON /TRANS/ Q ! 20: COMMON /PASS/ P2, QBR ! 21: C ! 22: C ROUTINE HANDLES CYCLING THROUGH STMTS OF A PGM UNIT. NEW IS ! 23: C USED TO HANDLE P.U.'S WITHOUT END STMTS. FLUSHING OF STMTS ! 24: C TO NEXT END OR HEADING STMT IS PROVIDED FOR ILLEGAL SEQUENCING ! 25: C LOGIF1,LOGIF2 ARE USED TO CYCLE THROUGH LOGICAL IF STMTS ! 26: C EOF OF INPUT FILE ! 27: C ERR USED AS ERROR DIAGNOSTIC INDICATOR ! 28: C NEWRD, NEW USED TO CONTROL INPUT ! 29: C ! 30: EOF = .FALSE. ! 31: NEW = .FALSE. ! 32: C ! 33: C INTER-PROGRAM INITIALIZATION ! 34: C NOST CONTAINS CURRENT STATEMENT NUMBER ! 35: C ITYP CONTAINS TYPE OF STMT ! 36: C BLKD IS TRUE FOR BLOCK DATA PGM UNIT, ELSE FALSE ! 37: C EXECUT IS TRUE FOR AT LEAST ONE EXECUTABLE STMT IN ! 38: C PROGRAM UNIT EXISTING ! 39: C NAME CONTAINS INDEX IN DSA OF PGM UNIT NAME ! 40: C P1ERR USED TO CONTROL WRITING OF SYMBOL TABLE FOR ! 41: C PASS 2 ! 42: C RET IS TRUE IF RETURN STMT OCCURS IN P.U. ELSE FALSE ! 43: C NEXT, BNEXT POINT INTO DSA ! 44: C LABHD POINTS TO HEAD OF LABELS LIST IN DSA ! 45: C SYMHD POINTS TO HEAD OF SYMBOLS LIST IN DSA ! 46: C KGP, IGP USED TO CHECK STMT SEQUENCING ! 47: C DOPT,DOLIST USED TO CHECK DO LOOP NESTING ! 48: C ! 49: 10 NOST = 0 ! 50: ITYP = 0 ! 51: LTYP = 0 ! 52: BLKD = .FALSE. ! 53: EXECUT = .FALSE. ! 54: NAME = 0 ! 55: P1ERR = .FALSE. ! 56: RET = .FALSE. ! 57: NEXT = 1 ! 58: BNEXT = LDSA ! 59: LABHD = 0 ! 60: SYMHD = 0 ! 61: KGP = 0 ! 62: DOPT = 1 ! 63: DOLIST(1) = 1 ! 64: DO 20 I=2,6 ! 65: DOLIST(I) = 0 ! 66: 20 CONTINUE ! 67: DO 30 I=1,LHASH ! 68: HASH(I) = 0 ! 69: 30 CONTINUE ! 70: C ! 71: C DONT GOTO NEW PAGE IF NOT PRODUCING LISTING ! 72: C ! 73: IF (.NOT.OPT(4)) GO TO 40 ! 74: WRITE (OUTUT,99999) ! 75: 99999 FORMAT (32H1PFORT VERIFIER 1/12/79 VERSION //) ! 76: C ! 77: C INPUT NEW STMT; RETURN WHEN HIT EOF STMT ! 78: C FIND LABELS ! 79: C ! 80: C HEADING STMT INADVERTENTLY READ BECAUSE OF MISSING END ! 81: C ! 82: 40 IF (.NOT.NEW) GO TO 70 ! 83: NEW = .FALSE. ! 84: NOST = 1 ! 85: IF (.NOT.OPT(4)) GO TO 80 ! 86: K = NSTMT - 1 ! 87: DO 50 I=1,K ! 88: II = STMT(I) + 1 ! 89: STACK(I) = Q(II) ! 90: 50 CONTINUE ! 91: WRITE (OUTUT,99998) NOST, (STACK(I),I=1,K) ! 92: 99998 FORMAT (1H , I5, 5X, 80A1) ! 93: GO TO 80 ! 94: 60 CALL ERROR1(20H UNRECOGNIZABLE STMT, 20) ! 95: ERR = .FALSE. ! 96: 70 CALL INSTMT(EOF, NCARD) ! 97: IF (EOF) GO TO 400 ! 98: 80 LAB = .FALSE. ! 99: C ! 100: C TYPST TYPES THE CURRENT STAMT ! 101: C ITYP IS NO 1-30 TELLING STMT WE HAVE ! 102: C KGP IS LEVEL NO 0-6 OF STMT. ! 103: C ICNT IS NO OF CHARACTERS IN STMT IE KI(ITYP) ! 104: C ! 105: PSTMT = 6 ! 106: CALL TYPST(ITYP, IGP, ICNT) ! 107: IF (ERR) GO TO 60 ! 108: PSTMT = 6 + ICNT ! 109: IF (ITYP.GE.6) GO TO 100 ! 110: I = ITYP - 1 ! 111: CALL TYPST(ITYP, II, K2) ! 112: IF (ITYP.NE.10) GO TO 90 ! 113: PSTMT = PSTMT + K2 ! 114: IGP = II ! 115: GO TO 110 ! 116: 90 ITYP = I + 1 ! 117: 100 I = -1 ! 118: 110 II = 1 ! 119: IF (ITYP.LT.14 .OR. ITYP.EQ.28 .OR. ITYP.EQ.31) II = 2 ! 120: IF (ITYP.EQ.29) II = 3 ! 121: KEEP = PSTMT ! 122: PSTMT = 1 ! 123: IF (TOKLAB(II,K2,KK,.TRUE.)) LAB = .TRUE. ! 124: IF (SYSERR) GO TO 450 ! 125: C ! 126: C CHECK FOR MAIN PROGRAM OR OTHER HEADING STMTS ! 127: C ! 128: IF (NAME) 140, 120, 140 ! 129: 120 IF (IGP) 130, 150, 130 ! 130: 130 CALL SETNAM(12) ! 131: GO TO 150 ! 132: 140 IF (IGP.EQ.0) GO TO 490 ! 133: C ! 134: C CHECK SEQUENCING OF STMTS ! 135: C ! 136: 150 IF (BLKD .AND. IGP.GT.3 .AND. ITYP.NE.28) GO TO 160 ! 137: IF (IGP.GE.KGP) GO TO 170 ! 138: CALL ERROR1(24H ILLEGAL STMT SEQUENCING, 24) ! 139: GO TO 450 ! 140: 160 CALL ERROR1(32H ILLEGAL STMTS IN BLOCK DATA PGM, 32) ! 141: GO TO 450 ! 142: C ! 143: C CHECK FOR FIRST ASF DEFN OR EXECUTABLE STMT. ! 144: C TO RESET USAGE OF FCN SUBPGM NAME IN SYMBOL TABLE ! 145: C ! 146: 170 IF (EXECUT .OR. IGP.LT.4) GO TO 180 ! 147: EXECUT = .TRUE. ! 148: K = IGATT1(NAME,8) ! 149: IF (K.EQ.4) CALL SATT1(NAME, 8, 10) ! 150: 180 PSTMT = KEEP ! 151: LOGIF2 = .FALSE. ! 152: C ! 153: C VALUES OF ITYP ! 154: C 1-5 TYPE STMTS: 1 DP, 2 REAL, 3 INT, 4 COMP, 5 LOG ! 155: C 6-8 OTHER SPECIFICATION STMTS: 6 EXTERNAL, 7 DIMENSION ! 156: C 8 COMMON ! 157: C 9-11 HEADING STMTS: 9 SUBROUTINE, 10 FUNCTION, 11 BLOCK DATA ! 158: C 12 EQUIVALENCE ! 159: C 13 DATA ! 160: C 14-27,30,32 EXECUTABLE STMTS: 14 ASSIGN, 15 GOTO, 16 RETURN, ! 161: C 17 CONTINUE, 18 CALL, 19 STOP, 20 IF, 21 DO, 22 PAUSE, ! 162: C 23 READ, 24 WRITE, 25 REWIND, 26 ENDFILE, 27 BACKSPACE, 30 ! 163: C ASSIGNMENT, 32 LOGICAL IF ! 164: C 28 END ! 165: C 29 FORMAT ! 166: C 31 ASF DEFN ! 167: C CLASS CODES ! 168: C 0-HEADING STMTS ! 169: C 1-SPECIFICATION STMTS (INCLUDING TYPE STMTS) ! 170: C 2-EQUIVALENCE ! 171: C 3-DATA ! 172: C 4-ASF DEF ! 173: C 5-EXECUTABLE STMTS AND FORMAT STMTS ! 174: C 6-END STMT ! 175: C ! 176: 190 GO TO (200, 200, 200, 200, 200, 210, 220, 250, 230, 230, 240, ! 177: * 270, 260, 350, 330, 360, 380, 370, 380, 300, 280, 340, 340, ! 178: * 340, 340, 340, 340, 410, 390, 290), ITYP ! 179: C ! 180: C TYPE STMTS (SYSERR) ! 181: C ! 182: 200 CALL TYPE ! 183: GO TO 430 ! 184: C ! 185: C EXTERNAL STMT (SYSERR) ! 186: C ! 187: 210 CALL EXTERN ! 188: GO TO 430 ! 189: C ! 190: C DIMENSION STMT(SYSERR) ! 191: C ! 192: 220 CALL DIMENS ! 193: GO TO 430 ! 194: C ! 195: C SUBR/FCN DEFNS (SYSERR) ! 196: C ! 197: 230 CALL SUBFCN(I) ! 198: GO TO 430 ! 199: C ! 200: C BLOCK DATA STMT (SYSERR) ! 201: C ! 202: 240 CALL SETNAM(11) ! 203: BLKD = .TRUE. ! 204: GO TO 430 ! 205: C ! 206: C COMMON STMT ! 207: C ! 208: 250 CALL COMMON ! 209: GO TO 430 ! 210: 260 CALL DATA ! 211: GO TO 430 ! 212: 270 CALL EQUIV ! 213: GO TO 430 ! 214: 280 CALL DOSTMT ! 215: GO TO 430 ! 216: 290 CALL ASSASF(IGP) ! 217: IF (IGP.EQ.4 .AND. LOGIF2) GO TO 320 ! 218: GO TO 430 ! 219: C ! 220: C IF STMTS ! 221: C ! 222: 300 CALL IFS(LOGIF1) ! 223: C ! 224: C FOUND AN ARITH. IF ! 225: C ! 226: IF (.NOT.LOGIF1) GO TO 430 ! 227: C ! 228: C FOUND LOGICAL IF WITHIN LOGICAL IF ! 229: C ! 230: IF (LOGIF1 .AND. LOGIF2) GO TO 320 ! 231: C ! 232: C FOUND A LOGICAL IF; MUS PROCESS REST OFSTMT ! 233: C ! 234: LOGIF2 = .TRUE. ! 235: CALL TYPST(ITYP, K, K2) ! 236: IF (.NOT.ERR) GO TO 310 ! 237: CALL ERROR1(20H UNRECOGNIZABLE STMT, 20) ! 238: GO TO 430 ! 239: 310 IF (K.NE.4 .AND. K.NE.5 .OR. ITYP.EQ.21 .OR. ITYP.EQ.29) GO TO 320 ! 240: PSTMT = PSTMT + K2 ! 241: GO TO 190 ! 242: 320 CALL ERROR1(27H ILLEGAL STMT IN LOGICAL IF, 27) ! 243: GO TO 430 ! 244: C ! 245: C GOTO STMTS ! 246: C ! 247: 330 CALL GOTO ! 248: GO TO 430 ! 249: C ! 250: C I-O STMTS ! 251: C ! 252: 340 CALL IO ! 253: GO TO 430 ! 254: C ! 255: C ASSIGN STMT ! 256: C ! 257: 350 CALL ASSIGN ! 258: GO TO 430 ! 259: C ! 260: C RETURN CANNOT APPEAR IN MAIN PGM ! 261: C ! 262: 360 I = IGATT1(NAME,8) ! 263: IF (I.EQ.12) CALL ERROR1( ! 264: * 44H RETURN STATEMENT MAY NOT APPEAR IN MAIN PGM, 44) ! 265: RET = .TRUE. ! 266: GO TO 380 ! 267: C ! 268: C CALL STMT ! 269: C ! 270: 370 CALL CALLS ! 271: GO TO 430 ! 272: C ! 273: C CHECK FOR EXTRANEOUS INFO AFTER STOP AND CONTINUE STMTS ! 274: C ! 275: 380 IF (PSTMT.NE.NSTMT) CALL ERROR1( ! 276: * 34H EXTRANEOUS INFO AFTER END OF STMT, 34) ! 277: GO TO 430 ! 278: C ! 279: C FORMAT ! 280: C ! 281: 390 IF (.NOT.LAB) CALL ERROR1(26H MISSING FORMAT STMT LABEL, 26) ! 282: CALL FORMAT ! 283: GO TO 430 ! 284: C ! 285: C CODE TO HANDLE END-OF-FILE WITHOUT AN END STMT ! 286: C ! 287: 400 IF (ITYP.EQ.28 .OR. ITYP.EQ.0) GO TO 500 ! 288: CALL ERROR1(37H WARNING - MISSING END STMT SIMULATED, 37) ! 289: LAB = .FALSE. ! 290: ITYP = 28 ! 291: 410 CALL END ! 292: C ! 293: C CHECK FOR NO CONTINUATION ! 294: C ! 295: IF (NCARD.GT.1) CALL ERROR1(34H END LINE CANNOT HAVE CONTINUATION, ! 296: * 34) ! 297: C ! 298: C CHECK FOR ENDING ON A GOTO,ARITH IF, STOP OR RETURN ! 299: C ! 300: IF ((LTYP.EQ.16 .OR. LTYP.EQ.15 .OR. LTYP.EQ.19 .OR. LTYP.EQ.20) ! 301: * .OR. BLKD) GO TO 420 ! 302: CALL ERROR1(29H ILLEGAL LAST EXECUTABLE STMT, 29) ! 303: C ! 304: C CHECK THERE HAVE BEEN EXECUTABLE STMTS ! 305: C CHECK FOR A RETURN STMT IF NECESSARY ! 306: C ! 307: 420 IF (KGP.NE.5 .AND. .NOT.BLKD) CALL ERROR1( ! 308: * 42H ILLEGAL PROGRAM UNIT, NO EXECUTABLE STMTS, 42) ! 309: I = IGATT1(NAME,8) ! 310: IF (I.EQ.11 .OR. I.EQ.12 .OR. RET) GO TO 430 ! 311: CALL ERROR1(36H MISSING RETURN STMT IN PROGRAM UNIT, 36) ! 312: C ! 313: C CHECK STMT LABELS FOR DOENDINGS, UPDATE KGP, CHECK TABLE SIZE ! 314: C CHECK FOR CANCELLING SAVING OF SYMBOL TABLE FOR PASS2 ! 315: C DUE TO ERRORS IN THIS PGM UNIT ! 316: C ! 317: 430 KGP = IGP ! 318: IF (ITYP.NE.29) LTYP = ITYP ! 319: IF (LOGIF2) LTYP = 32 ! 320: IF (SYSERR) GO TO 450 ! 321: IF (.NOT.LAB) GO TO 440 ! 322: CALL DOCHK(KK) ! 323: IF (ITYP.LT.14 .OR. ITYP.EQ.28 .OR. ITYP.EQ.31) CALL ERROR1( ! 324: * 37H WARNING - LABELED NONEXECUTABLE STMT, 37) ! 325: 440 IF (EOF) GO TO 500 ! 326: ERR = .FALSE. ! 327: IF (ITYP.EQ.28) GO TO 10 ! 328: GO TO 70 ! 329: C ! 330: C FLUSH CODE TO NEXT HEADR OR END SMT ! 331: C ! 332: 450 CALL ERROR1(44H CODE FLUSHED UNTIL NEXT END OR HEADING STMT, 44) ! 333: P1ERR = .TRUE. ! 334: IF (SYSERR) SYSERR = .FALSE. ! 335: LAB = .FALSE. ! 336: 460 CALL INSTMT(EOF, NCARD) ! 337: IF (EOF) GO TO 500 ! 338: PSTMT = 6 ! 339: CALL TYPST(ITYP, IGP, ICNT) ! 340: IF (.NOT.ERR) GO TO 470 ! 341: ERR = .FALSE. ! 342: GO TO 460 ! 343: 470 IF (ITYP.EQ.28) GO TO 410 ! 344: IF (ITYP.GT.5) GO TO 480 ! 345: PSTMT = PSTMT + ICNT ! 346: CALL TYPST(ITYP, IGP, ICNT) ! 347: IF (ERR) ERR = .FALSE. ! 348: IF (ITYP.EQ.10) GO TO 490 ! 349: GO TO 460 ! 350: 480 IF (ITYP.LT.9 .OR. ITYP.GT.11) GO TO 460 ! 351: C ! 352: C HAVE FOUND A HEADER STMT; SIMULATE AN END STMT ! 353: C ! 354: 490 NEW = .TRUE. ! 355: CALL ERROR1(37H WARNING - MISSING END STMT SIMULATED, 37) ! 356: ITYP = 28 ! 357: LAB = .FALSE. ! 358: GO TO 410 ! 359: C ! 360: C PUT ENDING MARKER ON THE DATA FOR PASS2 ! 361: C ! 362: 500 I = 1 ! 363: II = 4 ! 364: WRITE (OUTUT3) I, II, I ! 365: WRITE (OUTUT2) I, II, I ! 366: RETURN ! 367: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.