123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- /* RDLINE- READ INPUT LINE */
- /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
- /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
- /* WRITTEN BY R. M. SUPNIK */
- #include <stdio.h>
- #include <ctype.h>
- #include "funcs.h"
- #include "vars.h"
- /* This declaration is here since many systems don't have <stdlib.h> */
- extern int system P((const char *));
- static logical lex_ P((char *, integer *, integer *, logical));
- void rdline_(buffer, who)
- char *buffer;
- integer who;
- {
- /* Local variables */
- char *z, *zlast;
- /* Function Body */
- L5:
- switch (who + 1) {
- case 1: goto L90;
- case 2: goto L10;
- }
- /* !SEE WHO TO PROMPT FOR. */
- L10:
- printf(">");
- /* !PROMPT FOR GAME. */
- L90:
- (void) fflush(stdout);
- if (fgets(buffer, 78, stdin) == NULL)
- exit_();
- more_input();
- if (buffer[0] == '!') {
- system(buffer + 1);
- goto L5;
- }
- zlast = buffer - 1;
- for (z = buffer; *z != '\0' && *z != '\n'; z++) {
- if (*z != ' ')
- zlast = z;
- if (islower(*z))
- *z = toupper(*z);
- }
- z = zlast + 1;
- if (z == buffer)
- goto L5;
- *z = '\0';
- prsvec_1.prscon = 1;
- /* !RESTART LEX SCAN. */
- } /* rdline_ */
- /* PARSE- TOP LEVEL PARSE ROUTINE */
- /* THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG */
- logical parse_(inbuf, vbflag)
- char *inbuf;
- logical vbflag;
- {
- /* System generated locals */
- integer i__1;
- logical ret_val;
- /* Local variables */
- integer outbuf[40], outlnt;
- /* Parameter adjustments */
- --inbuf;
- /* Function Body */
- ret_val = FALSE_;
- /* !ASSUME FAILS. */
- prsvec_1.prsa = 0;
- /* !ZERO OUTPUTS. */
- prsvec_1.prsi = 0;
- prsvec_1.prso = 0;
- if (! lex_(inbuf + 1, outbuf, &outlnt, vbflag)) {
- goto L100;
- }
- if ((i__1 = sparse_(outbuf, outlnt, vbflag)) < 0) {
- goto L100;
- } else if (i__1 == 0) {
- goto L200;
- } else {
- goto L300;
- }
- /* !DO SYN SCAN. */
- /* PARSE REQUIRES VALIDATION */
- L200:
- if (! (vbflag)) {
- goto L350;
- }
- /* !ECHO MODE, FORCE FAIL. */
- if (! synmch_()) {
- goto L100;
- }
- /* !DO SYN MATCH. */
- if (prsvec_1.prso > 0 & prsvec_1.prso < xsrch_1.xmin) {
- last_1.lastit = prsvec_1.prso;
- }
- /* SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION */
- L300:
- ret_val = TRUE_;
- L350:
- orphan_(0, 0, 0, 0, 0);
- /* !CLEAR ORPHANS. */
- return ret_val;
- /* PARSE FAILS, DISALLOW CONTINUATION */
- L100:
- prsvec_1.prscon = 1;
- return ret_val;
- } /* parse_ */
- /* ORPHAN- SET UP NEW ORPHANS */
- /* DECLARATIONS */
- void orphan_(o1, o2, o3, o4, o5)
- integer o1;
- integer o2;
- integer o3;
- integer o4;
- integer o5;
- {
- orphs_1.oflag = o1;
- /* !SET UP NEW ORPHANS. */
- orphs_1.oact = o2;
- orphs_1.oslot = o3;
- orphs_1.oprep = o4;
- orphs_1.oname = o5;
- } /* orphan_ */
- /* LEX- LEXICAL ANALYZER */
- /* THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG */
- static logical lex_(inbuf, outbuf, op, vbflag)
- char *inbuf;
- integer *outbuf;
- integer *op;
- logical vbflag;
- {
- /* Initialized data */
- static const char dlimit[9] = { 'A', 'Z', 'A' - 1,
- '1', '9', '1' - 31,
- '-', '-', '-' - 27 };
- /* System generated locals */
- logical ret_val;
- /* Local variables */
- integer i;
- char j;
- integer k, j1, j2, cp;
- /* Parameter adjustments */
- --outbuf;
- --inbuf;
- /* Function Body */
- for (i = 1; i <= 40; ++i) {
- /* !CLEAR OUTPUT BUF. */
- outbuf[i] = 0;
- /* L100: */
- }
- ret_val = FALSE_;
- /* !ASSUME LEX FAILS. */
- *op = -1;
- /* !OUTPUT PTR. */
- L50:
- *op += 2;
- /* !ADV OUTPUT PTR. */
- cp = 0;
- /* !CHAR PTR=0. */
- L200:
- j = inbuf[prsvec_1.prscon];
- /* !GET CHARACTER */
- if (j == '\0')
- goto L1000;
- /* !END OF INPUT? */
- ++prsvec_1.prscon;
- /* !ADVANCE PTR. */
- if (j == '.') {
- goto L1000;
- }
- /* !END OF COMMAND? */
- if (j == ',') {
- goto L1000;
- }
- /* !END OF COMMAND? */
- if (j == ' ') {
- goto L6000;
- }
- /* !SPACE? */
- for (i = 1; i <= 9; i += 3) {
- /* !SCH FOR CHAR. */
- if (j >= dlimit[i - 1] & j <= dlimit[i]) {
- goto L4000;
- }
- /* L500: */
- }
- if (vbflag) {
- rspeak_(601);
- }
- /* !GREEK TO ME, FAIL. */
- return ret_val;
- /* END OF INPUT, SEE IF PARTIAL WORD AVAILABLE. */
- L1000:
- if (inbuf[prsvec_1.prscon] == '\0') {
- prsvec_1.prscon = 1;
- }
- /* !FORCE PARSE RESTART. */
- if (cp == 0 & *op == 1) {
- return ret_val;
- }
- if (cp == 0) {
- *op += -2;
- }
- /* !ANY LAST WORD? */
- ret_val = TRUE_;
- return ret_val;
- /* LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN. */
- L4000:
- j1 = j - dlimit[i + 1];
- if (cp >= 6) {
- goto L200;
- }
- /* !IGNORE IF TOO MANY CHAR. */
- k = *op + cp / 3;
- /* !COMPUTE WORD INDEX. */
- switch (cp % 3 + 1) {
- case 1: goto L4100;
- case 2: goto L4200;
- case 3: goto L4300;
- }
- /* !BRANCH ON CHAR. */
- L4100:
- j2 = j1 * 780;
- /* !CHAR 1... *780 */
- outbuf[k] = outbuf[k] + j2 + j2;
- /* !*1560 (40 ADDED BELOW). */
- L4200:
- outbuf[k] += j1 * 39;
- /* !*39 (1 ADDED BELOW). */
- L4300:
- outbuf[k] += j1;
- /* !*1. */
- ++cp;
- goto L200;
- /* !GET NEXT CHAR. */
- /* SPACE */
- L6000:
- if (cp == 0) {
- goto L200;
- }
- /* !ANY WORD YET? */
- goto L50;
- /* !YES, ADV OP. */
- } /* lex_ */
|