|
|
1.1 root 1: SUBROUTINE IO
2: LOGICAL ERR, SYSERR, TOKPNO, OK, ABORT, TOKLAB
3: INTEGER STMT, PSTMT
4: INTEGER EN(4)
5: LOGICAL SW
6: COMMON /FACTS/ NAME, NOST, ITYP, IASF
7: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
8: COMMON /DETECT/ ERR, SYSERR, ABORT
9: COMMON /SWS/ SW(10)
10: DATA EN(1), EN(2), EN(3), EN(4) /34,43,33,63/
11: C
12: C ROUTINE RECOGNIZES READ,WRITE,REWIND,BACKSPACE,ENDFILE,PAUSE STMTS
13: C
14: OK = .TRUE.
15: ASSIGN 160 TO IFORM
16: IF (ITYP.NE.23 .AND. ITYP.NE.24) GO TO 240
17: C
18: C SYNTAX OF READ, WRITE STMTS IS THE SAME EXCEPT A BINARY WRITE
19: C NEEDS A <LIST>. (SEE USE OF OK)
20: C "READ" (U<UNIT> / <UNIT> , <FORM>!) U<LIST>!
21: C <UNIT> IS INTEGER SCALAR VARIABLE OR POSITIVE INTEGER CONST
22: C <FORM> IS <LABEL> OR <ARRAY NAME>.
23: C
24: IF (STMT(PSTMT).NE.65) GO TO 230
25: PSTMT = PSTMT + 1
26: IF (PSTMT.GE.NSTMT) GO TO 120
27: 10 IF (TOKPNO(PSTMT,K2,K)) GO TO 60
28: CALL NEXTOK(PSTMT, K2, K)
29: IF (K.EQ.0) GO TO 20
30: CALL ERROR1(13H ILLEGAL UNIT, 13)
31: GO TO 110
32: 20 K = LOOKUP(K2,.FALSE.)
33: IF (SYSERR) GO TO 110
34: I1 = IGATT1(K,1)
35: I2 = IGATT1(K,7)
36: I3 = IGATT1(K,8)
37: IF (I3.NE.0) GO TO 30
38: CALL SATT1(K, 8, 10)
39: GO TO 40
40: 30 IF (I3.EQ.10) GO TO 40
41: CALL ERROR1(13H ILLEGAL UNIT, 13)
42: 40 IF (I1.NE.0) GO TO 50
43: I1 = 1
44: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
45: CALL SATT1(K, 1, I1)
46: 50 IF (MOD(I1,8).NE.2 .OR. I2.NE.0) CALL ERROR1(13H ILLEGAL UNIT, 13)
47: 60 PSTMT = K2
48: C
49: C DISTINGUISH ( <UNIT> ) FROM ( <UNIT>,<FORM> )
50: C
51: IF (ITYP.NE.23 .AND. ITYP.NE.24) GO TO 100
52: IF (STMT(PSTMT).EQ.68) GO TO 130
53: IF (STMT(PSTMT).EQ.62 .AND. ITYP.EQ.24) OK = .FALSE.
54: C
55: C CODE FINDS ")" AND TRIES TO FIND LIST
56: C
57: 70 IF (STMT(PSTMT).NE.62) GO TO 230
58: PSTMT = PSTMT + 1
59: IF (PSTMT.GE.NSTMT) GO TO 90
60: CALL LIST
61: GO TO 110
62: 80 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
63: PSTMT = PSTMT + 1
64: GO TO 70
65: 90 IF (OK) GO TO 110
66: CALL ERROR1(13H MISSING LIST, 13)
67: 100 IF (PSTMT.LT.NSTMT) CALL ERROR1(
68: * 34H EXTRANEOUS INFO AFTER END OF STMT, 34)
69: 110 RETURN
70: 120 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
71: GO TO 110
72: C
73: C IDENTIFY END= IF THERE
74: C
75: 130 IF (ITYP.NE.23) GO TO IFORM, (160, 80)
76: I1 = PSTMT + 1
77: DO 140 K=1,4
78: IF (STMT(I1).NE.EN(K)) GO TO IFORM, (160, 80)
79: I1 = I1 + 1
80: 140 CONTINUE
81: IF (.NOT.SW(1)) CALL ERROR1(
82: * 37H WARNING - NON-PORTABLE EOF CONSTRUCT, 37)
83: C
84: C HAVE FOUND END=, TRY FOR LABEL
85: C
86: PSTMT = I1
87: IF(.NOT.TOKLAB(1,K2,K,.FALSE.))
88: 1CALL ERROR1(44H MISSING LABEL IN NON-PORTABLE EOF CONSTRUCT ,44)
89: IF(SYSERR) GOTO 110
90: 150 PSTMT = K2
91: GO TO 70
92: C
93: C SEARCH FOR FORM
94: C
95: 160 PSTMT = PSTMT + 1
96: IF (PSTMT.GE.NSTMT) GO TO 230
97: IF (TOKLAB(3,K2,K,.FALSE.)) GO TO 220
98: IF(SYSERR) GOTO 110
99: CALL NEXTOK(PSTMT, K2, K)
100: IF (K.EQ.0) GO TO 180
101: 170 CALL ERROR1(13H ILLEGAL FORM, 13)
102: GO TO 110
103: 180 K = LOOKUP(K2,.FALSE.)
104: IF (SYSERR) GO TO 110
105: I1 = IGATT1(K,1)
106: I2 = IGATT1(K,7)
107: I3 = IGATT1(K,8)
108: IF (I3.NE.0) GO TO 190
109: CALL SATT1(K, 8, 10)
110: GO TO 200
111: 190 IF (I3.EQ.10) GO TO 200
112: CALL ERROR1(13H ILLEGAL FORM, 13)
113: 200 IF (I1.NE.0) GO TO 210
114: I1 = 2
115: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2
116: CALL SATT1(K, 1, I1)
117: 210 IF((MOD(I1,8).NE.2.AND.MOD(I1,8).NE.5).OR.I2.EQ.0) GOTO 170
118: C
119: C HAVE SUCCESSFULLY FOUND A FORM
120: C
121: 220 IF (SYSERR) GO TO 110
122: PSTMT = K2
123: ASSIGN 80 TO IFORM
124: IF (STMT(PSTMT).EQ.68) GO TO 130
125: GO TO 70
126: 230 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20)
127: GO TO 110
128: C
129: C LAST 4 I-O STMTS
130: C
131: 240 IF (ITYP.EQ.27 .OR. ITYP.EQ.22) CALL ERROR1(
132: * 39H WARNING - USE OF NON-PORTABLE I/O STMT, 39)
133: IF (ITYP.EQ.22) GO TO 100
134: IF (PSTMT.LT.NSTMT) GO TO 10
135: CALL ERROR1(13H MISSING UNIT, 13)
136: GO TO 110
137: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.