Annotation of 43BSDReno/games/dungeon/np.F, revision 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.