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