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