1 /* RDLINE-	READ INPUT LINE */
2 
3 /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
4 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
5 /* WRITTEN BY R. M. SUPNIK */
6 
7 #include <stdio.h>
8 #include <ctype.h>
9 #include "funcs.h"
10 #include "vars.h"
11 
12 /* This declaration is here since many systems don't have <stdlib.h> */
13 
14 extern int system P((const char *));
15 
16 static logical lex_ P((char *, integer *, integer *, logical));
17 
rdline_(buffer,who)18 void rdline_(buffer, who)
19 char *buffer;
20 integer who;
21 {
22     /* Local variables */
23     char *z, *zlast;
24 
25     /* Function Body */
26 L5:
27     switch (who + 1) {
28 	case 1:  goto L90;
29 	case 2:  goto L10;
30     }
31 /* 						!SEE WHO TO PROMPT FOR. */
32 L10:
33     printf(">");
34 /* 						!PROMPT FOR GAME. */
35 L90:
36     (void) fflush(stdout);
37     if (fgets(buffer, 78, stdin) == NULL)
38 	exit_();
39     more_input();
40 
41     if (buffer[0] == '!') {
42 	system(buffer + 1);
43 	goto L5;
44     }
45 
46     zlast = buffer - 1;
47     for (z = buffer; *z != '\0' && *z != '\n'; z++) {
48 	if (*z != ' ')
49 	    zlast = z;
50 	if (islower(*z))
51 		*z = toupper(*z);
52     }
53     z = zlast + 1;
54     if (z == buffer)
55 	goto L5;
56     *z = '\0';
57 
58     prsvec_1.prscon = 1;
59 /* 						!RESTART LEX SCAN. */
60 } /* rdline_ */
61 
62 /* PARSE-	TOP LEVEL PARSE ROUTINE */
63 
64 /* THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG */
65 
parse_(inbuf,vbflag)66 logical parse_(inbuf, vbflag)
67 char *inbuf;
68 logical vbflag;
69 {
70     /* System generated locals */
71     integer i__1;
72     logical ret_val;
73 
74     /* Local variables */
75     integer outbuf[40], outlnt;
76 
77     /* Parameter adjustments */
78     --inbuf;
79 
80     /* Function Body */
81     ret_val = FALSE_;
82 /* 						!ASSUME FAILS. */
83     prsvec_1.prsa = 0;
84 /* 						!ZERO OUTPUTS. */
85     prsvec_1.prsi = 0;
86     prsvec_1.prso = 0;
87 
88     if (! lex_(inbuf + 1, outbuf, &outlnt, vbflag)) {
89 	goto L100;
90     }
91     if ((i__1 = sparse_(outbuf, outlnt, vbflag)) < 0) {
92 	goto L100;
93     } else if (i__1 == 0) {
94 	goto L200;
95     } else {
96 	goto L300;
97     }
98 /* 						!DO SYN SCAN. */
99 
100 /* PARSE REQUIRES VALIDATION */
101 
102 L200:
103     if (! (vbflag)) {
104 	goto L350;
105     }
106 /* 						!ECHO MODE, FORCE FAIL. */
107     if (! synmch_()) {
108 	goto L100;
109     }
110 /* 						!DO SYN MATCH. */
111     if (prsvec_1.prso > 0 & prsvec_1.prso < xsrch_1.xmin) {
112 	last_1.lastit = prsvec_1.prso;
113     }
114 
115 /* SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION */
116 
117 L300:
118     ret_val = TRUE_;
119 L350:
120     orphan_(0, 0, 0, 0, 0);
121 /* 						!CLEAR ORPHANS. */
122     return ret_val;
123 
124 /* PARSE FAILS, DISALLOW CONTINUATION */
125 
126 L100:
127     prsvec_1.prscon = 1;
128     return ret_val;
129 
130 } /* parse_ */
131 
132 /* ORPHAN- SET UP NEW ORPHANS */
133 
134 /* DECLARATIONS */
135 
orphan_(o1,o2,o3,o4,o5)136 void orphan_(o1, o2, o3, o4, o5)
137 integer o1;
138 integer o2;
139 integer o3;
140 integer o4;
141 integer o5;
142 {
143     orphs_1.oflag = o1;
144 /* 						!SET UP NEW ORPHANS. */
145     orphs_1.oact = o2;
146     orphs_1.oslot = o3;
147     orphs_1.oprep = o4;
148     orphs_1.oname = o5;
149 } /* orphan_ */
150 
151 /* LEX-	LEXICAL ANALYZER */
152 
153 /* THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG */
154 
lex_(inbuf,outbuf,op,vbflag)155 static logical lex_(inbuf, outbuf, op, vbflag)
156 char *inbuf;
157 integer *outbuf;
158 integer *op;
159 logical vbflag;
160 {
161     /* Initialized data */
162 
163     static const char dlimit[9] = { 'A', 'Z', 'A' - 1,
164 				    '1', '9', '1' - 31,
165 				    '-', '-', '-' - 27 };
166 
167     /* System generated locals */
168     logical ret_val;
169 
170     /* Local variables */
171     integer i;
172     char j;
173     integer k, j1, j2, cp;
174 
175     /* Parameter adjustments */
176     --outbuf;
177     --inbuf;
178 
179     /* Function Body */
180 
181     for (i = 1; i <= 40; ++i) {
182 /* 						!CLEAR OUTPUT BUF. */
183 	outbuf[i] = 0;
184 /* L100: */
185     }
186 
187     ret_val = FALSE_;
188 /* 						!ASSUME LEX FAILS. */
189     *op = -1;
190 /* 						!OUTPUT PTR. */
191 L50:
192     *op += 2;
193 /* 						!ADV OUTPUT PTR. */
194     cp = 0;
195 /* 						!CHAR PTR=0. */
196 
197 L200:
198     j = inbuf[prsvec_1.prscon];
199 /* 						!GET CHARACTER */
200 
201     if (j == '\0')
202 	goto L1000;
203 /* 						!END OF INPUT? */
204 
205     ++prsvec_1.prscon;
206 /* 						!ADVANCE PTR. */
207 
208     if (j == '.') {
209 	goto L1000;
210     }
211 /* 						!END OF COMMAND? */
212     if (j == ',') {
213 	goto L1000;
214     }
215 /* 						!END OF COMMAND? */
216     if (j == ' ') {
217 	goto L6000;
218     }
219 /* 						!SPACE? */
220     for (i = 1; i <= 9; i += 3) {
221 /* 						!SCH FOR CHAR. */
222 	if (j >= dlimit[i - 1] & j <= dlimit[i]) {
223 	    goto L4000;
224 	}
225 /* L500: */
226     }
227 
228     if (vbflag) {
229 	rspeak_(601);
230     }
231 /* 						!GREEK TO ME, FAIL. */
232     return ret_val;
233 
234 /* END OF INPUT, SEE IF PARTIAL WORD AVAILABLE. */
235 
236 L1000:
237     if (inbuf[prsvec_1.prscon] == '\0') {
238 	prsvec_1.prscon = 1;
239     }
240 /* 						!FORCE PARSE RESTART. */
241     if (cp == 0 & *op == 1) {
242 	return ret_val;
243     }
244     if (cp == 0) {
245 	*op += -2;
246     }
247 /* 						!ANY LAST WORD? */
248     ret_val = TRUE_;
249     return ret_val;
250 
251 /* LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN. */
252 
253 L4000:
254     j1 = j - dlimit[i + 1];
255     if (cp >= 6) {
256 	goto L200;
257     }
258 /* 						!IGNORE IF TOO MANY CHAR. */
259     k = *op + cp / 3;
260 /* 						!COMPUTE WORD INDEX. */
261     switch (cp % 3 + 1) {
262 	case 1:  goto L4100;
263 	case 2:  goto L4200;
264 	case 3:  goto L4300;
265     }
266 /* 						!BRANCH ON CHAR. */
267 L4100:
268     j2 = j1 * 780;
269 /* 						!CHAR 1... *780 */
270     outbuf[k] = outbuf[k] + j2 + j2;
271 /* 						!*1560 (40 ADDED BELOW). */
272 L4200:
273     outbuf[k] += j1 * 39;
274 /* 						!*39 (1 ADDED BELOW). */
275 L4300:
276     outbuf[k] += j1;
277 /* 						!*1. */
278     ++cp;
279     goto L200;
280 /* 						!GET NEXT CHAR. */
281 
282 /* SPACE */
283 
284 L6000:
285     if (cp == 0) {
286 	goto L200;
287     }
288 /* 						!ANY WORD YET? */
289     goto L50;
290 /* 						!YES, ADV OP. */
291 
292 } /* lex_ */
293