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