|
|
1.1 root 1: SUBROUTINE INSTMT(EOF, NCARD)
2: LOGICAL ILLEG, ILHOL, ILCONT
3: LOGICAL NEWRD, EOF, CONT, OPT, P1ERR
4: INTEGER PSTMT, CARD(80), OUTUT, BLK, STATE, HCOUNT, STMT
5: INTEGER SYMLEN, OUTUT2, OUTUT3, OUTUT4
6: DIMENSION IBR(5)
7: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
8: COMMON /OPTNS/ OPT(5), P1ERR
9: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3,
10: * OUTUT4
11: COMMON /FACTS/ NAME, NOST, ITYP, IASF
12: DATA NEWRD /.TRUE./
13: DATA IBR(1), IBR(2), IBR(3), IBR(4), IBR(5) /1H*,1HC,1H.,1H0,1H /
14: DATA CARD(1) /1H /
15: C
16: C ROUTINE INPUTS AN ENTIRE FORTRAN STATEMENT. IT IS PASSED 1 CHAR
17: C PER ELEMENT IN THE ARRAY STMT.
18: C IN SHOULD BE CALLED AGAIN IF ERR IS TRUE.
19: C EACH CARD IS WRITTEN OUT BEFORE BEING PARSED.
20: C IN DEBLANKS CARDS USES THE VARIABLE STATE TO FIND
21: C HOLLERITHS:
22: C STATE = 0.....LOOK FOR BREAK CHAR
23: C 1.....HAVE BREAK CHAR AND NEED DIGIT
24: C 2.....HAVE DIGIT AND NEED DIGIT OR "H"
25: C 3....NEED TO SKIP OVER THESE CHARS, PART OF HOLLERITH
26: C NOTE: USE "90" AS AN END OF STMT MARKER
27: C
28: C NEWRD IS TRUE IF A NEW CARD IS NECESSARY; ELSE CARD IN BUFFER
29: C IS USED. EOF IS TRUE WHEN END-OF-FILE CARD ("." IN COL 1)
30: C IS READ NCARD GIVES # OF CARDS READ FOR THIS STMT
31: C
32: 10 NOST = NOST + 1
33: STATE = 0
34: NSTMT = 0
35: ILLEG = .FALSE.
36: ILCONT = .FALSE.
37: ILHOL = .FALSE.
38: NCARD = 0
39: CONT = .FALSE.
40: 20 IF (NEWRD) CALL IN(CARD, INUT)
41: IF (CARD(1).NE.IBR(2) .OR. CARD(2).NE.IBR(1)) GO TO 40
42: C
43: C DEAL WITH OPTIONS CARD
44: C
45: IF (CONT) GO TO 50
46: CALL INOPT(CARD)
47: 30 IF (OPT(4)) WRITE (OUTUT,99999) CARD
48: 99999 FORMAT (11X, 80A1)
49: NEWRD = .TRUE.
50: GO TO 20
51: 40 IF (CARD(1).NE.IBR(2)) GO TO 70
52: C
53: C DEAL WITH COMMENT CARD
54: C
55: IF (.NOT.CONT) GO TO 30
56: C
57: C HAVE COMPLETED STMT
58: C
59: 50 NEWRD = .FALSE.
60: NSTMT = NSTMT + 1
61: STMT(NSTMT) = 90
62: 60 IF (ILLEG) CALL ERROR1(
63: * 40H WARNING - NON-FORTRAN CHARACTER IGNORED, 40)
64: IF (ILHOL) CALL ERROR1(
65: * 46H WARNING - NON-FORTRAN CHARACTER IN HOLLERITH , 46)
66: IF (ILCONT) CALL ERROR1(
67: * 45H WARNING - NON-FORTRAN CONTINUATION CHARACTER, 45)
68: RETURN
69: 70 IF (CARD(1).NE.IBR(3)) GO TO 80
70: C
71: C HAVE EOF
72: C
73: IF (CONT) GO TO 50
74: EOF = .TRUE.
75: GO TO 60
76: 80 IF (CARD(6).EQ.IBR(4) .OR. CARD(6).EQ.IBR(5)) GO TO 100
77: C
78: C DEAL WITH CONTINUATION CARD
79: C
80: II = MAPCHR(CARD(6),ILCONT)
81: IF (CONT) GO TO 110
82: CALL ERROR1(40H WARNING - CONTINUATION NOT ALLOWED HERE, 40)
83: C
84: C FLUSH TO NEXT NONCONTINUATION CARD
85: C
86: 90 IF (OPT(4)) WRITE (OUTUT,99998) NOST, CARD
87: 99998 FORMAT (1H , I5, 5X, 80A1)
88: CALL IN(CARD, INUT)
89: IF (CARD(1).NE.IBR(1) .AND. CARD(1).NE.IBR(2) .AND.
90: * CARD(1).NE.IBR(3) .AND. CARD(6).NE.IBR(4) .AND.
91: * CARD(6).NE.IBR(5)) GO TO 90
92: NEWRD = .FALSE.
93: GO TO 10
94: C
95: C DEAL WITH A NON-CONTINUATION CARD
96: C
97: 100 IF (CONT) GO TO 50
98: C DEAL WITH A LEGAL CONTIN OR NONCONTIN CARD
99: 110 NCARD = NCARD + 1
100: IF (NCARD.LT.21) GO TO 120
101: CALL ERROR1(33H WARNING - TOO MANY CONTINUATIONS, 33)
102: GO TO 90
103: 120 IF (OPT(4)) WRITE (OUTUT,99998) NOST, CARD
104: NEWRD = .TRUE.
105: BLK = 0
106: IF (NSTMT.NE.0) GO TO 150
107: DO 130 I=1,5
108: NSTMT = NSTMT + 1
109: STMT(NSTMT) = MAPCHR(CARD(I),ILLEG)
110: 130 CONTINUE
111: 140 I = 7
112: GO TO 180
113: 150 DO 160 I=1,5
114: IF (MAPCHR(CARD(I),ILLEG).NE.69) GO TO 170
115: 160 CONTINUE
116: GO TO 140
117: 170 CALL ERROR1(40H WARNING - ILLEGAL LABEL WILL BE IGNORED, 40)
118: GO TO 140
119: 180 IF (I.LE.72) GO TO 200
120: C
121: C AFTER TRANSLATE CARD CHECK FOR BLANK CARD
122: C AND GO BACK FOR A CONTINUATION CARD
123: C
124: IF (BLK.NE.66) GO TO 190
125: CALL ERROR1(33H WARNING - BLANK CARD ENCOUNTERED, 33)
126: GO TO 90
127: 190 CONT = .TRUE.
128: GO TO 20
129: 200 IF (STATE.NE.3) GO TO 210
130: C
131: C STATE 3 --ARE PROCESSING A HOLLERITH
132: C
133: HCOUNT = HCOUNT - 1
134: KK = MAPCHR(CARD(I),ILHOL)
135: IF (HCOUNT.EQ.0) STATE = 0
136: GO TO 290
137: 210 NSTMT = NSTMT + 1
138: STMT(NSTMT) = MAPCHR(CARD(I),ILLEG)
139: IF (STMT(NSTMT).NE.69) GO TO 220
140: C
141: C BLANK ENCOUNTERED AND DELETED
142: C
143: BLK = BLK + 1
144: NSTMT = NSTMT - 1
145: GO TO 290
146: 220 KK = STATE + 1
147: GO TO (280, 260, 230), KK
148: C
149: C STATE 2--SKIP OVER LEADING DIGIT STRING; LOOK FOR H
150: C
151: 230 IF (STMT(NSTMT).LE.9) GO TO 290
152: IF (STMT(NSTMT).NE.37) GO TO 270
153: C
154: C PROCESS HOLLERITH COUNT
155: C
156: STMT(NSTMT) = -STMT(NSTMT)
157: STATE = 3
158: KK = NSTMT - KST
159: I10 = 1
160: HCOUNT = 0
161: DO 240 K=1,KK
162: JJ = NSTMT - K
163: HCOUNT = HCOUNT + I10*STMT(JJ)
164: I10 = I10*10
165: 240 CONTINUE
166: STMT(KST) = HCOUNT - 2048
167: NSTMT = KST
168: IF (HCOUNT.LE.0) GO TO 250
169: GO TO 290
170: C
171: C AVOID THE 0H CONSTRUCTION
172: C
173: 250 CALL ERROR1(44H WARNING - 0H ILLEGAL HOLLERITH CONSTRUCTION, 44)
174: STATE = 0
175: GO TO 290
176: C
177: C STATE 1--LOOK FOR START OF DIGIT STRING BEFORE H
178: C
179: 260 IF (STMT(NSTMT).GT.9) GO TO 270
180: STATE = 2
181: KST = NSTMT
182: GO TO 290
183: C
184: C CHECK FOR NESTED SPECIAL HEADING CHARS
185: C
186: 270 STATE = 0
187: 280 IF ((STMT(NSTMT).LT.65) .OR. (STMT(NSTMT).GT.68)) GO TO 290
188: STATE = 1
189: 290 I = I + 1
190: GO TO 180
191: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.