SUBROUTINE RECODE C C PURPOSE: TAKES INTERNALLY CODED COMMAND IN "CMND" (LENGTH MUST C BE NEGATIVE) AND REGENERATES THE ASCII COMMAND STRING THAT IT C REPRESENTS. SPECIAL CASES ARE HANDLED FOR COMMANDS HAVING C ASSOCIATED VALUES (OPERANDS) ACCORDING TO MASTER STRING RETURNED C BY LOOKUP AND FOLLOWING SCHEME: C C 'a' - INTERPRETS SINGLE BYTE AS ASCII LITERAL C 'd' - INTERPRETS 8 BYTES AS DOUBLE PRECISION REAL NUMBER C 'f' - INTERPRETS 4 BYTES AS REAL NUMBER C 'i' - INTERPRETS 2 BYTES AS INTEGER C 'n' - INTERPRETS 1 BYTE AS # IN OFFSET BINARY FORM C 's' - INTERPRETS FIRST BYTE AS BYTE COUNT FOR VARIABLE C LENGTH ASCII STRING C '?' - IGNORED C '\' - IGNORED C C SUBROUTINES REQUIRED: C LOOKUP(CODE,L,N,STRING) C RETURNS MASTER STRING CORRESPONDING TO CODE # "CODE" C CMPRES(LENGTH,STRING) C REMOVES EMBEDDED SPACES FROM "STRING" OF "LENGTH" CHARACTERS C C SORENSON 2/81 C COMMON/COMAND/LENGTH,CMND(40) BYTE CMND BYTE VALUE(40),STRING(40),REALX(4),DBLEX(8),INT(2) BYTE LCA,LCD,LCF,LCI,LCN,LCS,STOP,WILDC,SPACE,QUOTE DOUBLE PRECISION XX EQUIVALENCE (REALX,X),(DBLEX,XX),(INT,N) DATA LCA/"141/,LCD/"144/,LCF/"146/,LCI/"151/,LCN/"156/, 1LCS/"163/,WILDC/'?'/,STOP/'\'/,SPACE/' '/,QUOTE/'"'/ DATA LUNTI/2/ C C MAKE SURE COMMAND IS IN INTERNAL FORM C IF(LENGTH.GE.0)RETURN C C COPY ANY CODED "VALUES" TO VALUE C LENGTH=-(LENGTH+1) IF(LENGTH.LE.0)GO TO 10 DO 5 I=1,LENGTH 5 VALUE(I)=CMND(I+1) C C LOOKUP MASTER STRING ASSOCIATED WITH COMMAND # CMND(1) C 10 CALL LOOKUP(CMND(1),L,N,STRING) ISTART=1 J=1 K=1 15 DO 20 I=ISTART,L IF(STRING(I).EQ.LCA)GO TO 30 IF(STRING(I).EQ.LCD)GO TO 45 IF(STRING(I).EQ.LCF)GO TO 40 IF(STRING(I).EQ.LCI)GO TO 50 IF(STRING(I).EQ.LCN)GO TO 55 IF(STRING(I).EQ.LCS)GO TO 35 IF(STRING(I).EQ.WILDC)GO TO 20 IF(STRING(I).EQ.STOP)GO TO 21 CMND(J)=STRING(I) J=J+1 20 CONTINUE 21 LENGTH=J-1 D WRITE(LUNTI,1000)LENGTH,(CMND(I),I=1,LENGTH) D1000 FORMAT(' LENGTH = ',I5/' COMMAND = ',40A1) RETURN C C SINGLE CHARACTER IN "VALUE" C 30 CMND(J)=SPACE CMND(J+1)=VALUE(K) J=J+2 K=K+1 GO TO 100 C C ASCII STRING IN "VALUE", FIRST VALUE = BYTE COUNT C CHECK IF 's' PRECEEDED BY "--IF YES, DON'T INSERT LEADING SPACE C (IF DID AND KEPT RE-SAVING PROGRAM, SPACES WOULD PILE UP INSIDE THE C QUOTED FIELD). C 35 IF(STRING(I-1).EQ.QUOTE)GO TO 36 CMND(J)=SPACE J=J+1 36 N=VALUE(K) K=K+1 DO 37 ISTART=1,N CMND(J)=VALUE(K) J=J+1 K=K+1 37 CONTINUE GO TO 100 C C REAL # IN "VALUE" C 40 DO 42 N=1,4 REALX(N)=VALUE(K) 42 K=K+1 XX=DBLE(X) GO TO 48 C C DOUBLE PRECISION # IN "VALUE" C 45 DO 47 N=1,8 DBLEX(N)=VALUE(K) 47 K=K+1 48 CMND(J)=SPACE J=J+1 ENCODE(20,49,CMND(J))XX 49 FORMAT(G20.13) N=20 C C TAKE OUT UNNECESSARY SPACES FROM ENCODED NUMERIC STRING C CALL CMPRES(N,CMND(J)) J=J+N GO TO 100 C C INTEGER IN "VALUE" C 50 INT(1)=VALUE(K) INT(2)=VALUE(K+1) K=K+2 GO TO 57 C C BYTE # IN "VALUE" C 55 N=VALUE(K) K=K+1 N=N+128 57 CMND(J)=SPACE J=J+1 ENCODE(6,59,CMND(J))N 59 FORMAT(I6) N=6 C C REMOVE UNNECESSARY SPACES FROM ENCODED STRING C CALL CMPRES(N,CMND(J)) J=J+N GO TO 100 100 ISTART=I+1 IF(ISTART.GT.L)GO TO 21 GO TO 15 END