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

1.1       root        1:       LOGICAL FUNCTION ARDECL(K2, KK)
                      2: C
                      3: C     K2 IS INDEX OF END OF ARRAY DECLARATOR IN STMT
                      4: C     KK IS SYMBOL TABLE INDEX FOR THIS ARRAY
                      5: C     PROCESSES ARRAY DECLARATOR AND DECLARATOR CONSTRUCTS.
                      6: C     CAN EXPECT ARRAY DECLARATOR, ARRAY ELEMENT; ARRAY, VARIABLE.
                      7: C     ENTERS INTO SYMBOL TABLE AND TYPES ID;  SETS USAGE ON ARRAY
                      8: C     DECLARATOR
                      9: C     CHECKS SYNTAX OF BOUNDS; IF VARIABLY DIMENSIONED, BOUNDS
                     10: C     VARIABLE AND ARRAY ITSELF MUST BE DUMMY ARGUMENTS.
                     11: C     ACCUMULATES TOTAL LENGTH OF ARRAY WITH CONSTANT BOUNDS AND STORES
                     12: C     IT OFF ARRAY SYMBOL TABLE ENTRY.  -1 LENGTH INDICATES VARIABLE
                     13: C     DIMENSION
                     14: C     CALLED BY DIMENSION, TYPE, COMMON, EQUIVALENCE, DATA STMT.
                     15: C
                     16: C     ARRY IS TRUE FOR ARRAY ELEMENTS/ARRAY DECLARATORS
                     17: C     FALSE FOR ARRAYS AND VARIABLES
                     18: C     CORNER IS TRUE FOR ARRAY ELEMENTS WITH (1,1,1)--NEEDED IN EQUIV.
                     19: C     STMT ;  IF SUCH AN ELEMENT IS RECOGNIZED KK IS SENT AS ITS
                     20: C     NEGATIVE.
                     21: C
                     22:       LOGICAL ERR, SYSERR, ABORT, TOKPNO, VAR, CORNER, ARRY, FLUSH
                     23:       INTEGER STMT, PSTMT, PDSA, BNEXT, SYMHD, DSA
                     24:       COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
                     25:       COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
                     26:       COMMON /CTABL/ LDSA, PDSA, DSA(5000)
                     27:       COMMON /FACTS/ NAME, NOST, ITYP, IASF
                     28:       COMMON /DETECT/ ERR, SYSERR, ABORT
                     29:       ERR = .FALSE.
                     30:       FLUSH = .FALSE.
                     31:       ARRY = .FALSE.
                     32:       CORNER = .TRUE.
                     33:       ARDECL = .FALSE.
                     34: C
                     35: C     CHECK NAME; CAN'T HAVE BEEN USED PREVIOUSLY AS A NONVAR;
                     36: C     CHECK TO SEE IF HAVE ARRAY ELEMENT/ARRAY DECLARATOR. IF SO
                     37: C     ARRY=.TRUE.
                     38: C
                     39:       ICNT = 0
                     40:       CALL NEXTOK(PSTMT, K2, I1)
                     41:       IF (I1.EQ.0) GO TO 10
                     42:       CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
                     43:       ERR = .TRUE.
                     44:       GO TO 280
                     45:    10 IF (STMT(K2).EQ.65) ARRY = .TRUE.
                     46:       KK = LOOKUP(K2,.FALSE.)
                     47:       IF (SYSERR) GO TO 70
                     48:       ARDECL = .TRUE.
                     49:       L = IGATT1(KK,8)
                     50:       IF (L.EQ.0 .OR. L.EQ.10) GO TO 30
                     51:       IF (ITYP.LT.6 .AND. L.EQ.13) GO TO 30
                     52:    20 CALL ERROR1(45H ILLEGAL USE OF PREVIOUSLY DEFINED IDENTIFIER, 45)
                     53:       ERR = .TRUE.
                     54:       GO TO 280
                     55: C
                     56: C     SET TYPE (EXPLICITLY FOR TYPE STMTS)
                     57: C
                     58:    30 I1 = IGATT1(KK,1)
                     59:       IF (ITYP.GE.6) GO TO 50
                     60: C
                     61: C     TYPE EXPLICITLY
                     62: C
                     63:       IF (I1.GE.8) GO TO 40
                     64:       CALL SATT1(KK, 1, ITYP+7)
                     65:       GO TO 60
                     66:    40 CALL ERROR1(34H IDENTIFIER TYPED EXPLICITLY TWICE, 34)
                     67:       GO TO 60
                     68: C
                     69: C     TYPE IMPLICITLY
                     70: C
                     71:    50 IF (I1.GT.0) GO TO 60
                     72:       I1 = 1
                     73:       IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
                     74:       CALL SATT1(KK, 1, I1)
                     75: C
                     76: C     IF NOT ARRAY ELEMENT/ARAY DECLARATOR--RECOGNITION COMPLETE
                     77: C
                     78: C     CHECK NOT A DUMMY ARG IN COMMON, DATA, EQUIV STMT
                     79: C
                     80:    60 IF (ARRY) GO TO 80
                     81:       IF (IGATT1(KK,7).EQ.0) GO TO 65
                     82:       IF (ITYP.EQ.12)
                     83:      1 CALL ERROR1(46H WARNING - ILLEGAL USE OF ARRAY IN EQUIVALENCE
                     84:      2  , 46)
                     85:       IF (ITYP.EQ.13)
                     86:      1 CALL ERROR1(39H WARNING - ILLEGAL USE OF ARRAY IN DATA, 39)
                     87:    65 CONTINUE
                     88:       I1 = IGATT1(KK,4)
                     89:       IF (.NOT.(I1.EQ.1 .AND. (ITYP.EQ.8 .OR. ITYP.EQ.12 .OR.
                     90:      *    ITYP.EQ.13))) GO TO 70
                     91:       ERR = .TRUE.
                     92:       CALL ERROR1(32H ILLEGAL USAGE OF DUMMY ARGUMENT, 32)
                     93:    70 RETURN
                     94:    80 ISIZ = 1
                     95:       VAR = .FALSE.
                     96:       IF (L.EQ.0) CALL SATT1(KK, 8, 10)
                     97: C
                     98: C     LOOP TO FIND BOUNDS;  CHECK THAT VARIABLE BOUNDS ARE DUMMY ARGS
                     99: C     SET ADJUSTIBLE DIMENSION VARIABLE BIT; SET TYPE IMPLICITLY IF NOT
                    100: C     ALREADY SET
                    101: C     ACCUMULATE LENGTH IF IN DIMENSION, COMMON, OR TYPE STMT.
                    102: C     CHECK FOR REPEAT DIMENSIONING IN THOSE STMTS
                    103: C
                    104:       L = IGATT1(KK,7)
                    105:       IF (ITYP.EQ.13 .OR. ITYP.EQ.12) GO TO 90
                    106:       IF (L.EQ.0) GO TO 100
                    107:       CALL ERROR1(44H ILLEGAL USE OF PREVIOUSLY DIMENSIONED ARRAY, 44)
                    108:       ERR = .TRUE.
                    109:       GO TO 270
                    110:    90 IF (L.EQ.0) CALL ERROR1(
                    111:      *    44H ILLEGAL USE OF ARRAY NOT PREVIOUSLY DEFINED, 44)
                    112:   100 IF (K2+1.LT.NSTMT) GO TO 120
                    113:   110 CALL ERROR1(28H ILLEGAL ARRAY BOUNDS SYNTAX, 28)
                    114:       GO TO 270
                    115: C
                    116: C     CHECK FOR POSITIVE INTEGER BOUND
                    117: C
                    118:   120 PSTMT = K2 + 1
                    119:       IF (.NOT.TOKPNO(PSTMT,I1,LL)) GO TO 130
                    120:       IF (ITYP.EQ.7 .OR. ITYP.EQ.8 .OR. ITYP.LT.6) ISIZ = ISIZ*LL
                    121:       IF (ITYP.NE.12) GO TO 170
                    122:       IF (I1-K2.NE.2 .OR. STMT(PSTMT).NE.1) CORNER = .FALSE.
                    123:       GO TO 170
                    124: C
                    125: C     SEEK A VARIABLE BOUND
                    126: C
                    127:   130 CALL NEXTOK(PSTMT, I1, L)
                    128:       IF (L.NE.0) GO TO 110
                    129:       IF (ITYP.LT.6 .OR. ITYP.EQ.7) GO TO 140
                    130:       CALL ERROR1(32H VARIABLE DIMENSION ILLEGAL HERE, 32)
                    131:       ERR = .TRUE.
                    132:       GO TO 270
                    133:   140 VAR = .TRUE.
                    134:       L = LOOKUP(I1,.FALSE.)
                    135:       IF (SYSERR) GO TO 70
                    136:       N = IGATT1(L,8)
                    137:       IF (N.NE.0 .AND. N.NE.10) GO TO 20
                    138:       I2 = IGATT1(L,4)
                    139:       IF (I2.EQ.1) GO TO 150
                    140:       CALL ERROR1(42H ILLEGAL USAGE OF VARIABLE IN ARRAY BOUNDS, 42)
                    141:       ERR = .TRUE.
                    142:       GO TO 270
                    143:   150 I2 = IGATT1(KK,4)
                    144:       IF (I2.EQ.1) GO TO 160
                    145:       CALL ERROR1(50H VARIABLY DIMENSIONED ARRAY MUST BE DUMMY ARGUMENT,
                    146:      *    50)
                    147:       ERR = .TRUE.
                    148:       GO TO 270
                    149:   160 CALL SATT1(L, 6, 1)
                    150:       CALL SATT1(L, 8, 10)
                    151:       N = IGATT1(L,1)
                    152:       IF (N.GT.0) GO TO 170
                    153:       N = 1
                    154:       IF (STMT(K2+1).GE.38 .AND. STMT(K2+1).LE.43) N = 2
                    155:       CALL SATT1(L, 1, N)
                    156:       GO TO 170
                    157: C
                    158: C     FIND "," AND ACCUMULATE LENGTH
                    159: C
                    160:   170 ICNT = ICNT + 1
                    161:       IF (ICNT.LE.3) GO TO 180
                    162:       ISIZ = ISIZ/LL
                    163:       CALL ERROR1(30H WARNING - TOO MANY SUBSCRIPTS, 30)
                    164:       ICNT = 3
                    165:       FLUSH = .TRUE.
                    166:       GO TO 190
                    167:   180 K2 = I1
                    168:       IF (STMT(K2).EQ.68) GO TO 100
                    169: C
                    170: C     FIND ")" STORE LENGTH OR -1 INTO ARRAY SYMBOL TABLE ELEMENT
                    171: C
                    172:       IF (STMT(K2).NE.62) GO TO 110
                    173:   190 IF (ITYP.EQ.13 .OR. ITYP.EQ.12) GO TO 260
                    174:       CALL SATT1(KK, 7, ICNT)
                    175: C
                    176: C     STORE LENGTH OF ARRAY
                    177: C
                    178:       IF (VAR) GO TO 240
                    179:       IF (DSA(KK+2).EQ.0) GO TO 200
                    180:       N = DSA(KK+2)
                    181:       DSA(N) = ISIZ
                    182:       GO TO 220
                    183:   200 IF (NEXT+2.GE.BNEXT) GO TO 210
                    184:       DSA(KK+2) = NEXT
                    185:       DSA(NEXT) = ISIZ
                    186:       DSA(NEXT+1) = 0
                    187:       NEXT = NEXT + 2
                    188:       GO TO 220
                    189:   210 SYSERR = .TRUE.
                    190:       CALL ERROR1(33H IN ARDECL, TABLE OVERFLOW OF DSA,33)
                    191:   220 IF (FLUSH) GO TO 270
                    192:   230 K2 = K2 + 1
                    193:       GO TO 70
                    194: C
                    195: C     FIXUP FOR VARIABLY DIMENSIONED ARRAYS
                    196: C
                    197:   240 IF (DSA(KK+2).EQ.0) GO TO 250
                    198:       N = DSA(KK+2)
                    199:       DSA(N) = -1
                    200:       GO TO 220
                    201:   250 IF (NEXT+2.GE.BNEXT) GO TO 210
                    202:       DSA(KK+2) = NEXT
                    203:       DSA(NEXT) = -1
                    204:       DSA(NEXT+1) = 0
                    205:       NEXT = NEXT + 2
                    206:       GO TO 220
                    207: C
                    208: C     CHECK FORCORNER ELEMENT IN EQUIVALENCE STMT
                    209: C
                    210:   260 IF (ITYP.NE.12) GO TO 220
                    211:       IF (CORNER) KK = -KK
                    212:       GO TO 220
                    213: C
                    214: C     CODE TO FLUSH CONSTRUCT--TO NEXT ")"
                    215: C
                    216:   270 IF (K2.EQ.NSTMT) GO TO 70
                    217:       IF (STMT(K2).EQ.62) GO TO 230
                    218:       K2 = K2 + 1
                    219:       GO TO 270
                    220: C
                    221: C     CODE TO FLUSH TO NEXT CONSTRUCT ")",",", "/"
                    222: C
                    223:   280 K = 90
                    224:       IF (ITYP.EQ.8 .OR. ITYP.EQ.13) K = 67
                    225:   290 IF (K2.EQ.NSTMT) GO TO 70
                    226:       L = STMT(K2)
                    227:       IF (L.EQ.65) GO TO 270
                    228:       IF (L.EQ.68 .OR. L.EQ.K) GO TO 70
                    229:       K2 = K2 + 1
                    230:       GO TO 290
                    231:       END

unix.superglobalmegacorp.com

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