Annotation of researchv10no/cmd/pfort/PU.f, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.