C PROGRAM: DECODE.SUB SUBROUTINE DECODESWITCHES C SUBROUTINE DECODESWITHCHES(CMDLINE,CMDPTR,CMDLEN,PARAM, * IO,ERRCODE) C C DECLARATIONS FOR DECODESWITCHES C BYTE * CMDLINE(80), !COMMAND LINE * SWITCHES(40), !SWITCHES * ERROR, !STRING ERROR CODE * NUMBUF(6), !NUMBER BUFFER * DEVICES(20) !DEVICE CODES C INTEGER * SUBSWTCH, !SUBSWITCH FUNCTION * CMDPTR, !POINTER TO COMMAND LINE * CMDLEN, !LENGTH OF COMMAND LINE * IO, !1 => OUTPUT SIDE, 2 => INPUT SIDE * ERRCODE, !ERROR MESSAGE CODE * SLEN, !SWITCH LENGTH * ISWITCH, !SWITCH INDEX * GROUP(20), !SWITCH GROUP * PARAM(2,20), !SWITCH VALVES * TAPECTRL(20), !TAPE CONTROL CODES * FT, !FILE TYPE SWITCH * RS, !RECORD SIZE SWITCH * BS, !BLOCK SIZE SWITCH * DF, !DUMP FORMAT SWITCH * SW, !SWAP BYTE SWITCH * RW, !REWIND SWITCH * RC, !RECORD COUNT SWITCH * TMOVE, !TAPE CONTROL SWITCH * DC, !DEVICE CODE * LI, !LIST SWITCH * CO, !COPY TAPE SWITCH * CK, !CHECK PARITY SWITCH * CS, !CHARACTER SET SWITHCH * IN, !INPUT SIDE CODE * OUT, !OUTPUT SIDE CODE * TCNT, !TAPE MOVEMENT COUNTER * SCAN !OPTION LENGTH SCAN ROUTINE C C COMMON /CODES/SWITCHES,DEVICES C C DATA RS,FT,DF,BS,NULL1,RC,SW,TMOVE,TCNT,DC,LI/ * 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11/ DATA GROUP/1,2,7,8,9,5,3,4,6,6,6,6,6,3,6*0/ DATA IN,OUT/2,1/ DATA TAPECTRL/0,0,0,6,7,0,0,1,2,3,4,5,8,7*0/ C C C DEFINITION OF SWITCHES C C SWITCH: RS FT DF CP CO RC SW RW FF BF FR BR TM LI C ID: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 C GROUP: 1 2 7 8 9 5 3 4 6 6 6 6 6 3 C C ERRCODE=0 100 CONTINUE IF(CMDPTR .LT. CMDLEN)GOTO 101 CMDPTR=CMDLEN RETURN 101 CMDPTR=CMDPTR+1 SLEN= SCAN(CMDLINE,CMDPTR,CMDLEN) IF(SLEN .GT. 0)GOTO 110 105 ERRCODE = 1 RETURN C C LOOK FOR SWITCH IN MASTER SWITCH LIST C 110 CONTINUE ISWITCH=INDEX(SWITCHES,CMDLINE(CMDPTR),2,2) IF(ISWITCH.EQ.0) GO TO 105 ! UNKNOWN SWITCH ISWITCH=(ISWITCH+1)/2 C C NOW PROCESS THE SWITCH, BASED ON THE SWITCH GROUP TO WHICH IT BELONGS C GO TO (210,220,230,240,250,260,270,280,290), GROUP(ISWITCH) C C GROUP 1: RECORD SPECIFICATION. MAY APPEAR AS EITHER INPUT OR OUTPUT C SWITCH, OR BOTH. MUST HAVE RECORDSIZE SUBSWITCH, MAY HAVE C BLOCKSIZE SUBSWITCH. C FORMAT: /RS:[:] C 210 CONTINUE IF(PARAM(IO,RS) .EQ. 0) GO TO 215 ERRCODE=2 ! MULTIPLE DEFINITION RETURN C 215 CONTINUE IF(SUBSWTCH(CMDLINE,CMDPTR,SLEN) .NE. 0)GOTO 2151 ERRCODE = 6 !MUST HAVE SUBSWITCH RETURN 2151 CONTINUE C BECAUSE OF THE OPTIONAL BLOCK SIZE, LOOK TO SEE IF IT IS PRESENT C THE LOCATION OF THE BLOCKSIZE SUBSWITHC IS STORED IN "KBS" KBS = INDEX(CMDLINE(CMDPTR),':',1,1) IF(KBS .GT. SLEN)KBS=0 I1=SLEN IF(KBS .GT. 0)I1=KBS-1 CALL SUBSTR(NUMBUF,CMDLINE,CMDPTR,I1,ERROR) DECODE(I1,216,NUMBUF,ERR=217) PARAM(IO,RS) 216 FORMAT(I5) C SET THE BLOCKSIZE EQUAL THE RECORD SIZE PARAM(IO,BS) = PARAM(IO,RS) IF(KBS .EQ. 0)GOTO 218 C C POINT PAST RECORD SIZE SPECIFICATION, IF BLOCKSIZE PRESENT C CMDPTR = CMDPTR + KBS SLEN = SLEN - KBS CALL SUBSTR(NUMBUF,CMDLINE,CMDPTR,SLEN,ERROR) DECODE(SLEN,216,NUMBUF,ERR=217) PARAM(IO,BS) GO TO 218 217 ERRCODE=3 ! NON-NUMERIC VALUE RETURN C C DO SOME CHECKING ON THE BLOCK SIZE PARAMTERS C 218 IF(MOD(PARAM(IO,BS),PARAM(IO,RS)).EQ.0 * .AND. PARAM(IO,RS) .LE. PARAM(IO,BS))GOTO 219 ERRCODE = 11 !BLOCKSIZE MUST BE MULTIPLE OF RECSIZE RETURN 219 IF(PARAM(IO,BS).LE.16384)GOTO 300 ERRCODE = 12 RETURN C C GROUP 2: FILETYPE MODE SWITCH. VALID FOR EITHER INPUT OR OUTPUT, OR BOTH. C MUST HAVE A SUBSWITCH :BI(BINARY) :AS(ASCII) :EB(EBCDIC) C FORMAT: /FT:BI OR /FT:AS OR /FT:EB C 220 CONTINUE 221 IF(PARAM(IO,FT) .EQ. 0) GO TO 222 ERRCODE=2 ! MULTIPLE DEFINITION RETURN 222 IF(SUBSWTCH(CMDLINE,CMDPTR,SLEN) .NE. 0)GOTO 224 ERRCODE = 6 RETURN 224 J = INDEX('BIASEB',CMDLINE(CMDPTR),2,2) IF(J .GT. 0)GOTO 226 ERRCODE = 7 RETURN 226 J = (J+1)/2 IF(J .NE. 1 .OR. PARAM(IO,DC) .NE. -1)GOTO 228 ERRCODE = 13 !CAN'T DUMP BINARY TO TERMINAL RETURN 228 PARAM(IO,FT) = J GO TO 300 C C C GROUP 3: SWAP TOGGLES CAN APPEAR ANYWHERE C FORMAT: /SW OR, /LI C 230 CONTINUE K=0 IF(ISWITCH .EQ. 7)K=SW IF(ISWITCH .EQ. 14)K=LI IF(K .GT. 0)GOTO 235 ERRCODE = 1 RETURN 235 PARAM(IO,K) = 1 GO TO 300 C C C GROUP 4: REWIND OUTPUT ONLY NO COUNT C 240 CONTINUE IF(IO.EQ.OUT) GO TO 241 ERRCODE=4 ! SWITCH NOT VALID IN THIS CONTEXT RETURN C 241 IF(PARAM(IO,DC) .GT. 0)GOTO 242 ERRCODE = 9 !MUST BE TAPE UNIT RETURN 242 PARAM(IO,TMOVE)= 1 PARAM(IO,TCNT) = 0 GO TO 300 C C C GROUP 5: RECORD COUNT, INPUT OR OUTPUT, MUST HAVE VALUE C 250 CONTINUE IF(PARAM(IO,RC) .EQ. 0) GO TO 251 ERRCODE=2 ! SWITCH ALREADY DEFINED RETURN C 251 IF(SUBSWTCH(CMDLINE,CMDPTR,SLEN) .NE. 0)GOTO 252 ERRCODE = 6 !MUST HAVE SUBSWITCH RETURN 252 CONTINUE CALL SUBSTR(NUMBUF,CMDLINE,CMDPTR,SLEN,ERROR) DECODE(SLEN,216,NUMBUF,ERR=217) PARAM(IO,RC) GO TO 300 C C C GROUP 6: TAPE MOVEMENT, MAY HAVE COUNT. ONLY ONE MAY APPEAR C 260 CONTINUE IF(IO.EQ.OUT) GO TO 261 ERRCODE=4 ! OUTPUT SWITCH ONLY RETURN C 261 IF(PARAM(IO,TMOVE) .EQ. 0) GO TO 262 ERRCODE=2 ! MULTIPLE DEFINITIONS RETURN C 262 IF(PARAM(IO,DC) .GT. 0)GOTO 263 ERRCODE = 9 !MUST BE TAPE UNIT RETURN 263 PARAM(IO,TMOVE)= TAPECTRL(ISWITCH) PARAM(IO,TCNT) = 1 C C SEE IF A SUBSWITCH (COUNT IS PRESENT) C IF(SUBSWTCH(CMDLINE,CMDPTR,SLEN) .EQ. 0)GOTO 300 C IF IT IS, DECODE IT CALL SUBSTR(NUMBUF,CMDLINE,CMDPTR,SLEN,ERROR) DECODE(SLEN,216,NUMBUF,ERR=217) PARAM(IO,TCNT) GO TO 300 C C GROUP 7: DUMP FORMAT. VALID ONLY ON OUTPUT. MUST HAVE SUBSWITCH VALUE C WITH CODE :BI(BINARY), :AS(ASCII), :HX(HEX DUMP), :OT(OCTAL) C FORMAT: /DF: C 270 CONTINUE IF(IO .EQ. OUT)GOTO 272 ERRCODE = 4 RETURN 272 IF(PARAM(IO,DF) .EQ. 0)GOTO 274 ERRCODE = 2 RETURN 274 IF(SUBSWTCH(CMDLINE,CMDPTR,SLEN) .NE. 0)GOTO 276 ERRCODE = 6 RETURN 276 J = INDEX('BIASHXOTWO',CMDLINE(CMDPTR),2,2) IF(J .GT. 0)GOTO 278 ERRCODE = 7 RETURN 278 PARAM(IO,DF) = (J+1)/2 GOTO 300 C C GROUP 8: CHECK PARITY. INPUT SWITCH ONLY. MUST BE TAPE UNIT. C FORMAT: /CP C 280 CONTINUE IF(IO .EQ. IN)GOTO 282 ERRCODE = 8 RETURN 282 IF(PARAM(IO,DC) .GT. 0)GOTO 284 ERRCODE = 9 !MUST BE TAPE UNIT RETURN 284 IF(PARAM(IO,TMOVE) .EQ. 0)GOTO 286 ERRCODE = 2 RETURN 286 IF(PARAM(OUT,DC) .EQ. 0)GOTO 288 ERRCODE = 14 !NO OUTPUT SPECS ALLOWED RETURN 288 PARAM(IO,TMOVE) = 6 PARAM(IO,TCNT) = 32767 GOTO 300 C C GROUP 9: COPY TAPE. INPUT SWITCH ONLY. OUTPUT DEVICE MUST BE TAPE AND C MUST BE DIFFERENT TAPE UNIT THAN INPUT. C CAN SPECIFY AN OPTIONAL COUNT OF FILES TO COPY C FORMAT: /CO[:] C 290 IF(IO .EQ. IN)GOTO 291 ERRCODE = 8 RETURN 291 IF(PARAM(OUT,DC) .GT. 0 .AND. PARAM(IN,DC) .GT. 0 * .AND. PARAM(OUT,DC) .NE. PARAM(IN,DC))GOTO 292 ERRCODE = 10 RETURN 292 IF(PARAM(IO,TMOVE) .EQ. 0)GOTO 294 ERRCODE = 2 RETURN 294 IF(PARAM(OUT,TMOVE).EQ.0)GOTO 296 ERRCODE = 10 RETURN 296 PARAM(IO,TMOVE) = 7 PARAM(IO,TCNT) = 32767 C C SEE IF AN OPTIONAL SUBSWITCH IS PRESENT C IF(SUBSWTCH(CMDLINE,CMDPTR,SLEN) .EQ. 0)GOTO 300 DECODE(SLEN,216,NUMBUF,ERR=217)PARAM(IO,TCNT) GOTO 300 C C CONTINUE PROCESSING SWITCHES UNTIL EOF OR "=" C 300 CONTINUE CMDPTR = CMDPTR+SLEN IF(IO.EQ.OUT .AND. CMDLINE(CMDPTR).EQ.'=') RETURN GO TO 100 END