Annotation of researchv10no/cmd/pfort/DOSPEC.f, revision 1.1.1.1

1.1       root        1:       SUBROUTINE DOSPEC(KK, K2, LOG)
                      2:       INTEGER STMT, PSTMT, DOPT, DOLIST, LOOKUP
                      3:       LOGICAL SYSERR, ABORT, DOVAR, ERR, TOKPNO, LOG
                      4:       COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
                      5:       COMMON /LISTDO/ LPT, LEN, LS(64)
                      6:       COMMON /DOS/ DOPT, LDO, DOLIST(192)
                      7:       COMMON /FACTS/ NAME, NOST, ITYP, IASF
                      8:       COMMON /DETECT/ ERR, SYSERR, ABORT
                      9: C
                     10: C     ROUTINE RECOGNIZES DO-SPECIFICATION CONSTRUCT
                     11: C     DOLIST ARRAY IS DO STACK USED TO CHECK NESTING; 6 WORD ENTRY
                     12: C     WORD 1-CURRENT STMT NO
                     13: C     WORD 2-INDEX OF LABEL IN DSA
                     14: C     WORD 3-INDEX OF DO CONTROL VARIABLE IN DSA
                     15: C     WORD 4-6,-INDICES OF LIMITS IN DSA OR 0 FOR CONSTANT LIMITS
                     16: C     LS ARRAY IS IMPLICIT  DO STACK- IN EACH ENTRY IS SAME DATA
                     17: C     AS WORDS 3-6 OF DOLIST ENTRIES.
                     18: C
                     19:       IF (.NOT.LOG) GO TO 10
                     20:       IF (LPT.LE.1) GO TO 20
                     21:       LPT = LPT - 4
                     22:       LS(LPT) = 0
                     23:       LS(LPT+1) = 0
                     24:       LS(LPT+2) = 0
                     25:       LS(LPT+3) = 0
                     26:       GO TO 40
                     27:    10 IF (DOPT.LE.LDO-11) GO TO 30
                     28:    20 CALL ERROR1(20H DO NESTING TOO DEEP, 20)
                     29:       GO TO 190
                     30:    30 DOPT = DOPT + 6
                     31:       DOLIST(DOPT) = NOST
                     32:       DOLIST(DOPT+1) = KK
                     33:       DOLIST(DOPT+2) = 0
                     34:       DOLIST(DOPT+3) = 0
                     35:       DOLIST(DOPT+4) = 0
                     36:       DOLIST(DOPT+5) = 0
                     37: C
                     38: C     DO CONTROL VARIABLE MUST BE INTEGER, SCALAR VARIABLE
                     39: C
                     40:    40 IF (PSTMT.LT.NSTMT) GO TO 60
                     41:    50 CALL ERROR1(35H ILLEGAL SYNTAX IN DO SPECIFICATION, 35)
                     42:       GO TO 190
                     43:    60 CALL NEXTOK(PSTMT, K2, K)
                     44:       IF (K.NE.0) GO TO 50
                     45:       K = LOOKUP(K2,.FALSE.)
                     46:       IF (SYSERR) GO TO 180
                     47:       I1 = IGATT1(K,1)
                     48:       IF (I1.GT.0) GO TO 70
                     49:       I1 = 1
                     50:       IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
                     51:       CALL SATT1(K, 1, I1)
                     52:    70 I2 = IGATT1(K,7)
                     53:       I3 = IGATT1(K,8)
                     54:       IF (MOD(I1,8).NE.2 .OR. I2.NE.0) GO TO 220
                     55:       IF (I3.NE.0) GO TO 80
                     56:       I3 = 10
                     57:       CALL SATT1(K, 8, 10)
                     58:    80 IF (I3.NE.10) GO TO 220
                     59:       CALL SATT1(K, 5, 1)
                     60:       IF (DOVAR(K)) CALL ERROR1(
                     61:      *    57H ILLEGAL TO CHANGE VALUE OF CONTROL VARIABLE OR DO LIMITS,
                     62:      *    57)
                     63:       I3 = IGATT1(K,2)
                     64:       IF (I3.EQ.1) CALL ERROR1(37H WARNING - CONTROL VARIABLE IN COMMON,
                     65:      *    37)
                     66:       IF (K.EQ.NAME) CALL ERROR1(
                     67:      *    49H WARNING - FUNCTION NAME USED AS CONTROL VARIABLE, 49)
                     68:       IF (.NOT.LOG) GO TO 90
                     69:       LS(LPT) = K
                     70:       GO TO 100
                     71:    90 DOLIST(DOPT+2) = K
                     72: C
                     73: C     FIND AN =
                     74: C
                     75:   100 IF (STMT(K2).NE.63) GO TO 50
                     76: C
                     77: C     DO-LIMITS  LIMS COUNTS NUMBER OF  LIMITS; THESE MUST BE INTEGER
                     78: C     SCALAR VARIABLES OR POSITIVE INTEGER CONSTANTS
                     79: C
                     80:       LIMS = 0
                     81:   110 PSTMT = K2 + 1
                     82:       IF (PSTMT.GE.NSTMT) GO TO 50
                     83:       IF (.NOT.TOKPNO(PSTMT,K2,K)) GO TO 120
                     84:       LIMS = LIMS + 1
                     85:       GO TO 170
                     86:   120 CALL NEXTOK(PSTMT, K2, K)
                     87:       IF (K.NE.0) GO TO 210
                     88:       K = LOOKUP(K2,.FALSE.)
                     89:       IF (SYSERR) GO TO 180
                     90:       LIMS = LIMS + 1
                     91:       IF (.NOT.LOG) GO TO 130
                     92:       IF (LS(LPT).EQ.K) CALL ERROR1(17H ILLEGAL DO LIMIT, 17)
                     93:       I1 = LPT + LIMS
                     94:       LS(I1) = K
                     95:       GO TO 140
                     96:   130 IF (DOLIST(DOPT+2).EQ.K) CALL ERROR1(17H ILLEGAL DO LIMIT, 17)
                     97:       I1 = DOPT + 2 + LIMS
                     98:       DOLIST(I1) = K
                     99:   140 I1 = IGATT1(K,1)
                    100:       I2 = IGATT1(K,7)
                    101:       I3 = IGATT1(K,8)
                    102:       IF (I3.NE.0) GO TO 150
                    103:       CALL SATT1(K, 8, 10)
                    104:       I3 = 10
                    105:   150 IF (I3.NE.10) GO TO 50
                    106:       IF (I1.GT.0) GO TO 160
                    107:       I1 = 1
                    108:       IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
                    109:       CALL SATT1(K, 1, I1)
                    110:   160 IF (MOD(I1,8).NE.2 .OR. I2.NE.0) GO TO 210
                    111: C
                    112: C     CHECK FOR END OF STMT
                    113: C
                    114:   170 IF (K2.LT.NSTMT .AND. STMT(K2).NE.62) GO TO 200
                    115: C
                    116: C     IF THERE ARE NO MORE CHARS, WE ARE DONE WITH THIS STMT;
                    117: C     THERE MUST BE AT LEAST 2 AND NO MORE THAN 3 LIMITS IN DO
                    118: C
                    119:       IF (LIMS.LE.1) GO TO 230
                    120:   180 RETURN
                    121:   190 ERR = .TRUE.
                    122:       GO TO 180
                    123: C
                    124: C     CHECK FOR A "," MUST FIND HERE
                    125: C
                    126:   200 IF (STMT(K2).NE.68) GO TO 50
                    127:       IF (LIMS.GE.3) GO TO 230
                    128:       GO TO 110
                    129:   210 CALL ERROR1(47H DO LIMIT NOT INTEGER SCALAR VAR OR POS INTEGER,
                    130:      *    47)
                    131:       GO TO 190
                    132:   220 CALL ERROR1(36H CONTROL VARIABLE NOT INTEGER SCALAR, 36)
                    133:       GO TO 190
                    134:   230 CALL ERROR1(18H ILLEGAL DO LIMITS, 18)
                    135:       GO TO 190
                    136:       END

unix.superglobalmegacorp.com

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