SUBROUTINE CODEIT C C PURPOSE: GIVEN AN ASCII STRING IN /COMAND/ COMMON, CODEIT WILL C ATTEMPT TO MATCH STRING AGAINST A MASTER LIST OF VALID COMMANDS. C IF SUCCESSFUL, THE COMMAND STRING WILL BE REPLACED BY THE C INTERNAL, CODED REPRESENTATION OF THE COMMAND PLUS ANY VALUES C (OPERANDS) ASSOCIATED WITH THE COMMAND. "LENGTH" IS SET TO C - BYTE COUNT OF CODED COMMAND TO SIGNAL THAT "CMND" CONTAINS C THE INTERNAL REPRESENTATION RATHER THAN AN ASCII STRING. "LENGTH" C IS CLEARED AND ERROR SET IF FAIL TO RECOGNIZE THE COMMAND. C C VARIABLES: C ERROR -COMMON BYTE FLAG SET < 0 ON ERROR CONDITION C LENGTH -COMMON INTEGER VARIABLE SET TO BYTE COUNT OF COMMAND STRING C CMND -COMMON BYTE ARRAY CONTAINING COMMAND STRING C STRING -LOCAL BYTE ARRAY HOLDING MASTER STRING TO MATCH C VALUE -LOCAL BYTE ARRAY HOLDING ANY VALUES RETURNED BY "MATCH" C THAT ARE ASSOCIATED WITH A GIVEN COMAND C ISUCC -LOCAL INTEGER VARIABLE SET > 0 WHEN "MATCH" FINDS CORRECT C COMMAND C CODE -LOCAL BYTE VARIABLE SET TO INTERNAL CODE # OF COMMAND-- C THIS IS AN OFFSET BINARY REPRESENTATION OF COMMAND #, E.G. C COMMAND # 1 REPRESENTED BY -128, ETC. C C SUBROUTINES REQUIRED: C LOOKUP(CODE,L,N,STRING) C RETURNS MASTER ASCII "STRING" OF "L" CHARACTERS FOR COMMAND C REPRESENTED BY CODE # "CODE". "N" SET TO # VALUES COMMAND C EXPECTS TO FIND AND/OR NEEDS. C MATCH(L,STRING,LENGTH,CMND,ISUCC,N,VALUE) C ATTEMPTS TO MATCH "CMND" STRING TO MASTER "STRING", RETURNING C ISUCC >0 ON SUCCESS, AND BYTE ARRAY OF "VALUE"S ASSOCIATED C WITH THE COMMAND. C GETX -CALLED BY MATCH, SEE COMMENTS IN MATCH.FTN OR GETX.FTN C GETN -CALLED BY MATCH, SEE COMMENTS IN MATCH.FTN OR GETN.FTN C C C SORENSON 2/81 C COMMON/UNIT/LUNCMD,LUNOUT,LUNTI,LUNFIL COMMON/FLAGS/STATE,ERROR,STKLFT,NEST,ANGLES,DIGITS,RADIX,FLAG(4) BYTE FLAG,STATE,ERROR,STKLFT,ANGLES,DIGITS,RADIX,NEST COMMON/COMAND/LENGTH,CMND(40) BYTE CMND BYTE STRING(40),VALUE(40),CODE C C CAN'T MATCH STRING IF NOTHING THERE. OTHERWISE, LOOKUP COMMAND C THEN TRY TO MATCH IT. C IF(LENGTH.LE.0)RETURN DO 10 I=1,256 CODE=I-129 CALL LOOKUP(CODE,L,N,STRING) IF(L.EQ.0)GO TO 10 C C CAN'T MATCH MASTER STRING THAT HAS MORE CHARACTERS THEN COMMAND C IF(L.GT.LENGTH)GO TO 10 D WRITE(LUNTI,1000)L,N,(STRING(J),J=1,L) D1000 FORMAT(' CHECKING ',I5,' CHARACTERS AND ',I5,' VALUES'/ D 1' IN MASTER STRING : ',40A1) CALL MATCH(L,STRING,LENGTH,CMND,ISUCC,N,VALUE) IF(ISUCC.GT.0)GO TO 20 10 CONTINUE C C COULDN'T FIND MATCH--SET ERROR TO -2, ILLEGAL OR UNRECOGNIZED COMMAND C ERROR=-2 RETURN C C MATCHED COMMAND; MOVE IT TO "CMND" WITH ANY ASSOCIATED VALUES (OPERANDS) C AND SET LENGTH = - (BYTE COUNT) C 20 CONTINUE D WRITE(LUNTI,1001)(CMND(I),I=1,LENGTH) D1001 FORMAT(' COMMAND: ',40A1) D WRITE(LUNTI,1002)(STRING(I),I=1,L) D1002 FORMAT(' MATCHED: ',40A1) CMND(1)=CODE IF(N.EQ.0)GO TO 25 DO 24 I=1,N 24 CMND(I+1)=VALUE(I) 25 LENGTH=-(1+N) 30 RETURN END