|
|
1.1 root 1: C RDLINE- READ INPUT LINE
2: C
3: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5: C WRITTEN BY R. M. SUPNIK
6: C
7: C DECLARATIONS
8: C
9: SUBROUTINE RDLINE(BUFFER,LENGTH,WHO)
10: IMPLICIT INTEGER(A-Z)
11: CHARACTER BUFFER(78)
12: #ifndef PDP
13: character*78 sysbuf
14: #endif
15: #include "parser.h"
16: #include "io.h"
17:
18: #ifdef PDP
19: 5 if (WHO .eq. 1) call prompt
20: C read a line of input
21: 90 call rdlin(BUFFER,LENGTH)
22: #else
23: 5 GO TO (90,10),WHO+1
24: C !SEE WHO TO PROMPT FOR.
25: 10 WRITE(OUTCH,50)
26: C !PROMPT FOR GAME.
27: #ifdef NOCC
28: 50 FORMAT('>',$)
29: #else NOCC
30: 50 FORMAT(' >',$)
31: #endif NOCC
32:
33: 90 READ(INPCH,100, END=210) BUFFER
34: 100 FORMAT(78A1)
35:
36: DO 200 LENGTH=78,1,-1
37: IF(BUFFER(LENGTH).NE.' ') GO TO 250
38: 200 CONTINUE
39: GO TO 5
40: C !END OF FILE
41: 210 STOP
42: C !TRY AGAIN.
43:
44: C
45: C check for shell escape here before things are
46: C converted to upper case
47: C
48: 250 if (buffer(1) .ne. '!') go to 300
49: do 275 j=2,length
50: sysbuf(j-1:j-1) = buffer(j)
51: 275 continue
52: sysbuf(length:length) = char(0)
53: call system(sysbuf)
54: go to 5
55:
56: C CONVERT TO UPPER CASE
57: 300 DO 400 I=1,LENGTH
58: IF(and((BUFFER(I).GE.'a'),(BUFFER(I).LE.'z')))
59: & BUFFER(I)=char(ichar(BUFFER(I))-32)
60: 400 CONTINUE
61: #endif PDP
62:
63: if(LENGTH.EQ.0) GO TO 5
64: PRSCON=1
65: C !RESTART LEX SCAN.
66: RETURN
67: END
68: C PARSE- TOP LEVEL PARSE ROUTINE
69: C
70: C DECLARATIONS
71: C
72: C THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG
73: C
74: LOGICAL FUNCTION PARSE(INBUF,INLNT,VBFLAG)
75: IMPLICIT INTEGER(A-Z)
76: CHARACTER INBUF(78)
77: LOGICAL LEX,SYNMCH,VBFLAG
78: INTEGER OUTBUF(40)
79: #include "debug.h"
80: #include "parser.h"
81: #include "xsrch.h"
82: C
83: #ifdef debug
84: DFLAG=and(PRSFLG,1).NE.0
85: #endif
86: PARSE=.FALSE.
87: C !ASSUME FAILS.
88: PRSA=0
89: C !ZERO OUTPUTS.
90: PRSI=0
91: PRSO=0
92: C
93: #ifdef PDP
94: C LEX recoded in C for pdp version (see lex.c)
95: if(.not. lex(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG,PRSCON)) goto 100
96: #else
97: IF(.NOT.LEX(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG)) GO TO 100
98: #endif
99: IF(SPARSE(OUTBUF,OUTLNT,VBFLAG)) 100,200,300
100: C !DO SYN SCAN.
101: C
102: C PARSE REQUIRES VALIDATION
103: C
104: 200 IF(.NOT.VBFLAG) GO TO 350
105: C !ECHO MODE, FORCE FAIL.
106: IF(.NOT.SYNMCH(X)) GO TO 100
107: C !DO SYN MATCH.
108: IF(and((PRSO.GT.0),(PRSO.LT.XMIN))) LASTIT=PRSO
109: C
110: C SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION
111: C
112: 300 PARSE=.TRUE.
113: 350 CALL ORPHAN(0,0,0,0,0)
114: C !CLEAR ORPHANS.
115: #ifdef debug
116: if(dflag) write(0,*) "parse good"
117: IF(DFLAG) PRINT 10,PARSE,PRSA,PRSO,PRSI
118: #ifdef NOCC
119: 10 FORMAT('PARSE RESULTS- ',L7,3I7)
120: #else NOCC
121: 10 FORMAT(' PARSE RESULTS- ',L7,3I7)
122: #endif NOCC
123: #endif
124: RETURN
125: C
126: C PARSE FAILS, DISALLOW CONTINUATION
127: C
128: 100 PRSCON=1
129: #ifdef debug
130: if(dflag) write(0,*) "parse failed"
131: IF(DFLAG) PRINT 10,PARSE,PRSA,PRSO,PRSI
132: #endif
133: RETURN
134: C
135: END
136: C ORPHAN- SET UP NEW ORPHANS
137: C
138: C DECLARATIONS
139: C
140: SUBROUTINE ORPHAN(O1,O2,O3,O4,O5)
141: IMPLICIT INTEGER(A-Z)
142: COMMON /ORPHS/ A,B,C,D,E
143: C
144: A=O1
145: C !SET UP NEW ORPHANS.
146: B=O2
147: C=O3
148: D=O4
149: E=O5
150: RETURN
151: END
152: #ifndef PDP
153: C LEX- LEXICAL ANALYZER
154: C
155: C
156: C THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG
157: C
158: LOGICAL FUNCTION LEX(INBUF,INLNT,OUTBUF,OP,VBFLAG)
159: IMPLICIT INTEGER(A-Z)
160: CHARACTER INBUF(78),J,DLIMIT(9)
161: INTEGER OUTBUF(40),ZLIMIT(9)
162: LOGICAL VBFLAG
163: #include "parser.h"
164: C
165: #include "debug.h"
166: C
167: c the System V compiler doesn't like octal initialization of character
168: c arrays, so the following is done for its benefit
169: c
170: c DATA DLIMIT/'A','Z',o'100','1','9',o'22','-','-',o'22'/
171: c
172: DATA ZLIMIT/o'101',o'132',o'100',o'61',o'71',o'22',o'55',o'55',o'22'/
173: c
174: do 99 i=1,9
175: dlimit(i) = char(zlimit(i))
176: c ! copy integers to chars
177: 99 continue
178: C
179: DO 100 I=1,40
180: C !CLEAR OUTPUT BUF.
181: OUTBUF(I)=0
182: 100 CONTINUE
183: C
184: #ifdef debug
185: DFLAG=and(PRSFLG,2).NE.0
186: #endif debug
187: LEX=.FALSE.
188: C !ASSUME LEX FAILS.
189: OP=-1
190: C !OUTPUT PTR.
191: 50 OP=OP+2
192: C !ADV OUTPUT PTR.
193: CP=0
194: C !CHAR PTR=0.
195: C
196: 200 IF(PRSCON.GT.INLNT) GO TO 1000
197: C !END OF INPUT?
198: J=INBUF(PRSCON)
199: C !NO, GET CHARACTER,
200: PRSCON=PRSCON+1
201: C !ADVANCE PTR.
202: IF(J.EQ.'.') GO TO 1000
203: C !END OF COMMAND?
204: IF(J.EQ.',') GO TO 1000
205: C !END OF COMMAND?
206: IF(J.EQ.' ') GO TO 6000
207: C !SPACE?
208: DO 500 I=1,9,3
209: C !SCH FOR CHAR.
210: IF(and((J.GE.DLIMIT(I)),(J.LE.DLIMIT(I+1))))
211: & GO TO 4000
212: 500 CONTINUE
213: C
214: IF(VBFLAG) CALL RSPEAK(601)
215: C !GREEK TO ME, FAIL.
216: RETURN
217: C
218: C END OF INPUT, SEE IF PARTIAL WORD AVAILABLE.
219: C
220: 1000 IF(PRSCON.GT.INLNT) PRSCON=1
221: C !FORCE PARSE RESTART.
222: IF(and((CP.EQ.0),(OP.EQ.1))) RETURN
223: IF(CP.EQ.0) OP=OP-2
224: C !ANY LAST WORD?
225: LEX=.TRUE.
226: #ifdef debug
227: IF(DFLAG) PRINT 10,CP,OP,PRSCON,(OUTBUF(I),I=1,OP+1)
228: #ifdef NOCC
229: 10 FORMAT('LEX RESULTS- ',3I7/1X,10O7)
230: #else NOCC
231: 10 FORMAT(' LEX RESULTS- ',3I7/1X,10O7)
232: #endif NOCC
233: #endif debug
234: RETURN
235: C
236: C LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN.
237: C
238: 4000 J1=ichar(J)-ichar(DLIMIT(I+2))
239: #ifdef debug
240: IF(DFLAG) PRINT 20,J,J1,CP
241: #ifdef NOCC
242: 20 FORMAT('LEX- CHAR= ',3I7)
243: #else NOCC
244: 20 FORMAT(' LEX- CHAR= ',3I7)
245: #endif NOCC
246: #endif debug
247: IF(CP.GE.6) GO TO 200
248: C !IGNORE IF TOO MANY CHAR.
249: K=OP+(CP/3)
250: C !COMPUTE WORD INDEX.
251: GO TO (4100,4200,4300),(MOD(CP,3)+1)
252: C !BRANCH ON CHAR.
253: 4100 J2=J1*780
254: C !CHAR 1... *780
255: OUTBUF(K)=OUTBUF(K)+J2+J2
256: C !*1560 (40 ADDED BELOW).
257: 4200 OUTBUF(K)=OUTBUF(K)+(J1*39)
258: C !*39 (1 ADDED BELOW).
259: 4300 OUTBUF(K)=OUTBUF(K)+J1
260: C !*1.
261: CP=CP+1
262: GO TO 200
263: C !GET NEXT CHAR.
264: C
265: C SPACE
266: C
267: 6000 IF(CP.EQ.0) GO TO 200
268: C !ANY WORD YET?
269: GO TO 50
270: C !YES, ADV OP.
271: C
272: END
273: #endif PDP
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.