Annotation of 43BSDReno/games/dungeon/np.F, revision 1.1.1.1

1.1       root        1: C RDLINE-      READ INPUT LINE
                      2: C
                      3: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
                      4: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
                      5: C WRITTEN BY R. M. SUPNIK
                      6: C
                      7: C DECLARATIONS
                      8: C
                      9:        SUBROUTINE RDLINE(BUFFER,LENGTH,WHO)
                     10:        IMPLICIT INTEGER(A-Z)
                     11:        CHARACTER BUFFER(78)
                     12: #ifndef PDP
                     13:        character*78 sysbuf
                     14: #endif
                     15: #include "parser.h"
                     16: #include "io.h"
                     17: 
                     18: #ifdef PDP
                     19: 5      if (WHO .eq. 1) call prompt
                     20: C      read a line of input
                     21: 90     call rdlin(BUFFER,LENGTH)
                     22: #else
                     23: 5      GO TO (90,10),WHO+1
                     24: C                                              !SEE WHO TO PROMPT FOR.
                     25: 10     WRITE(OUTCH,50)
                     26: C                                              !PROMPT FOR GAME.
                     27: #ifdef NOCC
                     28: 50     FORMAT('>',$)
                     29: #else NOCC
                     30: 50     FORMAT(' >',$)
                     31: #endif NOCC
                     32: 
                     33: 90     READ(INPCH,100, END=210) BUFFER
                     34: 100    FORMAT(78A1)
                     35: 
                     36:        DO 200 LENGTH=78,1,-1
                     37:          IF(BUFFER(LENGTH).NE.' ') GO TO 250
                     38: 200    CONTINUE
                     39:        GO TO 5
                     40: C                                              !END OF FILE
                     41: 210    STOP
                     42: C                                              !TRY AGAIN.
                     43: 
                     44: C
                     45: C      check for shell escape here before things are
                     46: C      converted to upper case
                     47: C
                     48: 250    if (buffer(1) .ne. '!') go to 300
                     49:        do 275 j=2,length
                     50:          sysbuf(j-1:j-1) = buffer(j)
                     51: 275    continue
                     52:        sysbuf(length:length) = char(0)
                     53:        call system(sysbuf)
                     54:        go to 5
                     55: 
                     56: C CONVERT TO UPPER CASE
                     57: 300    DO 400 I=1,LENGTH
                     58:          IF(and((BUFFER(I).GE.'a'),(BUFFER(I).LE.'z')))
                     59: &              BUFFER(I)=char(ichar(BUFFER(I))-32)
                     60: 400    CONTINUE
                     61: #endif PDP
                     62: 
                     63:        if(LENGTH.EQ.0) GO TO 5
                     64:        PRSCON=1
                     65: C                                              !RESTART LEX SCAN.
                     66:        RETURN
                     67:        END
                     68: C PARSE-       TOP LEVEL PARSE ROUTINE
                     69: C
                     70: C DECLARATIONS
                     71: C
                     72: C THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG
                     73: C
                     74:        LOGICAL FUNCTION PARSE(INBUF,INLNT,VBFLAG)
                     75:        IMPLICIT INTEGER(A-Z)
                     76:        CHARACTER INBUF(78)
                     77:        LOGICAL LEX,SYNMCH,VBFLAG
                     78:        INTEGER OUTBUF(40)
                     79: #include "debug.h"
                     80: #include "parser.h"
                     81: #include "xsrch.h"
                     82: C
                     83: #ifdef debug
                     84:        DFLAG=and(PRSFLG,1).NE.0
                     85: #endif
                     86:        PARSE=.FALSE.
                     87: C                                              !ASSUME FAILS.
                     88:        PRSA=0
                     89: C                                              !ZERO OUTPUTS.
                     90:        PRSI=0
                     91:        PRSO=0
                     92: C
                     93: #ifdef PDP
                     94: C      LEX recoded in C for pdp version (see lex.c)
                     95:        if(.not. lex(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG,PRSCON)) goto 100
                     96: #else
                     97:        IF(.NOT.LEX(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG)) GO TO 100
                     98: #endif
                     99:        IF(SPARSE(OUTBUF,OUTLNT,VBFLAG)) 100,200,300
                    100: C                                              !DO SYN SCAN.
                    101: C
                    102: C PARSE REQUIRES VALIDATION
                    103: C
                    104: 200    IF(.NOT.VBFLAG) GO TO 350
                    105: C                                              !ECHO MODE, FORCE FAIL.
                    106:        IF(.NOT.SYNMCH(X)) GO TO 100
                    107: C                                              !DO SYN MATCH.
                    108:        IF(and((PRSO.GT.0),(PRSO.LT.XMIN))) LASTIT=PRSO
                    109: C
                    110: C SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION
                    111: C
                    112: 300    PARSE=.TRUE.
                    113: 350    CALL ORPHAN(0,0,0,0,0)
                    114: C                                              !CLEAR ORPHANS.
                    115: #ifdef debug
                    116:        if(dflag) write(0,*) "parse good"
                    117:        IF(DFLAG) PRINT 10,PARSE,PRSA,PRSO,PRSI
                    118: #ifdef NOCC
                    119: 10     FORMAT('PARSE RESULTS- ',L7,3I7)
                    120: #else NOCC
                    121: 10     FORMAT(' PARSE RESULTS- ',L7,3I7)
                    122: #endif NOCC
                    123: #endif
                    124:        RETURN
                    125: C
                    126: C PARSE FAILS, DISALLOW CONTINUATION
                    127: C
                    128: 100    PRSCON=1
                    129: #ifdef debug
                    130:        if(dflag) write(0,*) "parse failed"
                    131:        IF(DFLAG) PRINT 10,PARSE,PRSA,PRSO,PRSI
                    132: #endif
                    133:        RETURN
                    134: C
                    135:        END
                    136: C ORPHAN- SET UP NEW ORPHANS
                    137: C
                    138: C DECLARATIONS
                    139: C
                    140:        SUBROUTINE ORPHAN(O1,O2,O3,O4,O5)
                    141:        IMPLICIT INTEGER(A-Z)
                    142:        COMMON /ORPHS/ A,B,C,D,E
                    143: C
                    144:        A=O1
                    145: C                                              !SET UP NEW ORPHANS.
                    146:        B=O2
                    147:        C=O3
                    148:        D=O4
                    149:        E=O5
                    150:        RETURN
                    151:        END
                    152: #ifndef PDP
                    153: C LEX- LEXICAL ANALYZER
                    154: C
                    155: C
                    156: C THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG
                    157: C
                    158:        LOGICAL FUNCTION LEX(INBUF,INLNT,OUTBUF,OP,VBFLAG)
                    159:        IMPLICIT INTEGER(A-Z)
                    160:        CHARACTER INBUF(78),J,DLIMIT(9)
                    161:        INTEGER OUTBUF(40),ZLIMIT(9)
                    162:        LOGICAL VBFLAG
                    163: #include "parser.h"
                    164: C
                    165: #include "debug.h"
                    166: C
                    167: c the System V compiler doesn't like octal initialization of character
                    168: c arrays, so the following is done for its benefit
                    169: c
                    170: c      DATA DLIMIT/'A','Z',o'100','1','9',o'22','-','-',o'22'/
                    171: c
                    172:        DATA ZLIMIT/o'101',o'132',o'100',o'61',o'71',o'22',o'55',o'55',o'22'/
                    173: c
                    174:        do 99 i=1,9
                    175:          dlimit(i) = char(zlimit(i))
                    176: c                                      ! copy integers to chars
                    177: 99     continue
                    178: C
                    179:        DO 100 I=1,40
                    180: C                                              !CLEAR OUTPUT BUF.
                    181:          OUTBUF(I)=0
                    182: 100    CONTINUE
                    183: C
                    184: #ifdef debug
                    185:        DFLAG=and(PRSFLG,2).NE.0
                    186: #endif debug
                    187:        LEX=.FALSE.
                    188: C                                              !ASSUME LEX FAILS.
                    189:        OP=-1
                    190: C                                              !OUTPUT PTR.
                    191: 50     OP=OP+2
                    192: C                                              !ADV OUTPUT PTR.
                    193:        CP=0
                    194: C                                              !CHAR PTR=0.
                    195: C
                    196: 200    IF(PRSCON.GT.INLNT) GO TO 1000
                    197: C                                              !END OF INPUT?
                    198:        J=INBUF(PRSCON)
                    199: C                                              !NO, GET CHARACTER,
                    200:        PRSCON=PRSCON+1
                    201: C                                              !ADVANCE PTR.
                    202:        IF(J.EQ.'.') GO TO 1000
                    203: C                                              !END OF COMMAND?
                    204:        IF(J.EQ.',') GO TO 1000
                    205: C                                              !END OF COMMAND?
                    206:        IF(J.EQ.' ') GO TO 6000
                    207: C                                              !SPACE?
                    208:        DO 500 I=1,9,3
                    209: C                                              !SCH FOR CHAR.
                    210:          IF(and((J.GE.DLIMIT(I)),(J.LE.DLIMIT(I+1))))
                    211: &              GO TO 4000
                    212: 500    CONTINUE
                    213: C
                    214:        IF(VBFLAG) CALL RSPEAK(601)
                    215: C                                              !GREEK TO ME, FAIL.
                    216:        RETURN
                    217: C
                    218: C END OF INPUT, SEE IF PARTIAL WORD AVAILABLE.
                    219: C
                    220: 1000   IF(PRSCON.GT.INLNT) PRSCON=1
                    221: C                                              !FORCE PARSE RESTART.
                    222:        IF(and((CP.EQ.0),(OP.EQ.1))) RETURN
                    223:        IF(CP.EQ.0) OP=OP-2
                    224: C                                              !ANY LAST WORD?
                    225:        LEX=.TRUE.
                    226: #ifdef debug
                    227:        IF(DFLAG) PRINT 10,CP,OP,PRSCON,(OUTBUF(I),I=1,OP+1)
                    228: #ifdef NOCC
                    229: 10     FORMAT('LEX RESULTS- ',3I7/1X,10O7)
                    230: #else NOCC
                    231: 10     FORMAT(' LEX RESULTS- ',3I7/1X,10O7)
                    232: #endif NOCC
                    233: #endif debug
                    234:        RETURN
                    235: C
                    236: C LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN.
                    237: C
                    238: 4000   J1=ichar(J)-ichar(DLIMIT(I+2))
                    239: #ifdef debug
                    240:        IF(DFLAG) PRINT 20,J,J1,CP
                    241: #ifdef NOCC
                    242: 20     FORMAT('LEX- CHAR= ',3I7)
                    243: #else NOCC
                    244: 20     FORMAT(' LEX- CHAR= ',3I7)
                    245: #endif NOCC
                    246: #endif debug
                    247:        IF(CP.GE.6) GO TO 200
                    248: C                                              !IGNORE IF TOO MANY CHAR.
                    249:        K=OP+(CP/3)
                    250: C                                              !COMPUTE WORD INDEX.
                    251:        GO TO (4100,4200,4300),(MOD(CP,3)+1)
                    252: C                                              !BRANCH ON CHAR.
                    253: 4100   J2=J1*780
                    254: C                                              !CHAR 1... *780
                    255:        OUTBUF(K)=OUTBUF(K)+J2+J2
                    256: C                                              !*1560 (40 ADDED BELOW).
                    257: 4200   OUTBUF(K)=OUTBUF(K)+(J1*39)
                    258: C                                              !*39 (1 ADDED BELOW).
                    259: 4300   OUTBUF(K)=OUTBUF(K)+J1
                    260: C                                              !*1.
                    261:        CP=CP+1
                    262:        GO TO 200
                    263: C                                              !GET NEXT CHAR.
                    264: C
                    265: C SPACE
                    266: C
                    267: 6000   IF(CP.EQ.0) GO TO 200
                    268: C                                              !ANY WORD YET?
                    269:        GO TO 50
                    270: C                                              !YES, ADV OP.
                    271: C
                    272:        END
                    273: #endif PDP

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.