C RDLINE-	READ INPUT LINE
C
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
C
C DECLARATIONS
C
	SUBROUTINE RDLINE(INBUF,INLNT,WHO)
	IMPLICIT INTEGER(A-Z)
	LOGICAL*1 INBUF(78)
C
C PARSER OUTPUT
C
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
C
	COMMON /CHAN/ INPCH,OUTCH,DBCH
C
5	GO TO (90,10),WHO+1			!SEE WHO TO PROMPT FOR.
10	WRITE(OUTCH,50)				!PROMPT FOR GAME.
50	FORMAT(' >',$)
C
90	READ(INPCH,100) INBUF			!GET INPUT.
100	FORMAT(78A1)
C
	DO 200 INLNT=78,1,-1
	  IF(INBUF(INLNT).NE.' ') GO TO 300	!NOT BLANK?
200	CONTINUE
	GO TO 5					!TRY AGAIN.
C
300	DO 400 I=1,INLNT			!CONVERT TO UPPER CASE.
	  IF((INBUF(I).GE.'a').AND.(INBUF(I).LE.'z'))
	1	INBUF(I)=INBUF(I)-"40
400	CONTINUE
	PRSCON=1				!RESTART LEX SCAN.
	RETURN
	END
C PARSE-	TOP LEVEL PARSE ROUTINE
C
C DECLARATIONS
C
C THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG
C
	LOGICAL FUNCTION PARSE(INBUF,INLNT,VBFLAG)
	IMPLICIT INTEGER(A-Z)
	LOGICAL*1 INBUF(78)
	LOGICAL LEX,SYNMCH,DFLAG,VBFLAG
	INTEGER OUTBUF(40)
	COMMON /DEBUG/ DBGFLG,PRSFLG
C
C PARSER OUTPUT
C
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
	COMMON /LAST/ LASTIT
	COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
	1	XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
C
D	DFLAG=(PRSFLG.AND."1).NE.0
	PARSE=.FALSE.				!ASSUME FAILS.
	PRSA=0					!ZERO OUTPUTS.
	PRSI=0
	PRSO=0
C
	IF(.NOT.LEX(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG)) GO TO 100
	IF(SPARSE(OUTBUF,OUTLNT,VBFLAG)) 100,200,300	!DO SYN SCAN.
C
C PARSE REQUIRES VALIDATION
C
200	IF(.NOT.VBFLAG) GO TO 350		!ECHO MODE, FORCE FAIL.
	IF(.NOT.SYNMCH(X)) GO TO 100		!DO SYN MATCH.
	IF((PRSO.GT.0).AND.(PRSO.LT.XMIN)) LASTIT=PRSO
C
C SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION
C
300	PARSE=.TRUE.
350	CALL ORPHAN(0,0,0,0,0)			!CLEAR ORPHANS.
D	IF(DFLAG) TYPE 10,PARSE,PRSA,PRSO,PRSI
D10	FORMAT(' PARSE RESULTS- ',L7,3I7)
	RETURN
C
C PARSE FAILS, DISALLOW CONTINUATION
C
100	PRSCON=1
D	IF(DFLAG) TYPE 10,PARSE,PRSA,PRSO,PRSI
	RETURN
C
	END
C ORPHAN- SET UP NEW ORPHANS
C
C DECLARATIONS
C
	SUBROUTINE ORPHAN(O1,O2,O3,O4,O5)
	IMPLICIT INTEGER(A-Z)
	COMMON /ORPHS/ A,B,C,D,E
C
	A=O1					!SET UP NEW ORPHANS.
	B=O2
	C=O3
	D=O4
	E=O5
	RETURN
	END
C LEX-	LEXICAL ANALYZER
C
C DECLARATIONS
C
C THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG
C
	LOGICAL FUNCTION LEX(INBUF,INLNT,OUTBUF,OP,VBFLAG)
	IMPLICIT INTEGER(A-Z)
	LOGICAL*1 INBUF(78),J,DLIMIT(9)
	INTEGER OUTBUF(40)
	LOGICAL DFLAG,VBFLAG
C
C PARSER OUTPUT
C
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
C
	COMMON /DEBUG/ DBGFLG,PRSFLG
C
	DATA DLIMIT/'A','Z',"100,'1','9',"22,'-','-',"22/
C
	DO 100 I=1,40				!CLEAR OUTPUT BUF.
	  OUTBUF(I)=0
100	CONTINUE
C
D	DFLAG=(PRSFLG.AND."2).NE.0
	LEX=.FALSE.				!ASSUME LEX FAILS.
	OP=-1					!OUTPUT PTR.
50	OP=OP+2					!ADV OUTPUT PTR.
	CP=0					!CHAR PTR=0.
C
200	IF(PRSCON.GT.INLNT) GO TO 1000		!END OF INPUT?
	J=INBUF(PRSCON)				!NO, GET CHARACTER,
	PRSCON=PRSCON+1				!ADVANCE PTR.
	IF(J.EQ.'.') GO TO 1000			!END OF COMMAND?
	IF(J.EQ.',') GO TO 1000			!END OF COMMAND?
	IF(J.EQ.' ') GO TO 6000			!SPACE?
	DO 500 I=1,9,3				!SCH FOR CHAR.
	  IF((J.GE.DLIMIT(I)).AND.(J.LE.DLIMIT(I+1)))
	1	GO TO 4000
500	CONTINUE
C
	IF(VBFLAG) CALL RSPEAK(601)		!GREEK TO ME, FAIL.
	RETURN
C
C END OF INPUT, SEE IF PARTIAL WORD AVAILABLE.
C
1000	IF(PRSCON.GT.INLNT) PRSCON=1		!FORCE PARSE RESTART.
	IF((CP.EQ.0).AND.(OP.EQ.1)) RETURN	!ANY RESULTS?
	IF(CP.EQ.0) OP=OP-2			!ANY LAST WORD?
	LEX=.TRUE.
D	IF(DFLAG) TYPE 10,CP,OP,PRSCON,(OUTBUF(I),I=1,OP+1)
D10	FORMAT(' LEX RESULTS- ',3I7/1X,10O7)
	RETURN
C
C LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN.
C
4000	J1=J-DLIMIT(I+2)			!CVT TO R50.
D	IF(DFLAG) TYPE 20,J,J1,CP
D20	FORMAT(' LEX- CHAR= ',3I7)
	IF(CP.GE.6) GO TO 200			!IGNORE IF TOO MANY CHAR.
	K=OP+(CP/3)				!COMPUTE WORD INDEX.
	GO TO (4100,4200,4300),(MOD(CP,3)+1)	!BRANCH ON CHAR.
4100	J2=J1*780				!CHAR 1... *780
	OUTBUF(K)=OUTBUF(K)+J2+J2		!*1560 (40 ADDED BELOW).
4200	OUTBUF(K)=OUTBUF(K)+(J1*39)		!*39 (1 ADDED BELOW).
4300	OUTBUF(K)=OUTBUF(K)+J1			!*1.
	CP=CP+1
	GO TO 200				!GET NEXT CHAR.
C
C SPACE
C
6000	IF(CP.EQ.0) GO TO 200			!ANY WORD YET?
	GO TO 50				!YES, ADV OP.
C
	END

