|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.