IFNOTDEF(ALPHA) INCLUDE/NL DEFIN INCLUDE/NL RATDEF ENDIFDEF ##DEFINE (OPENCLOSE,) #PCN #82 DEFINE (DEFAULT_DEVICE="SY:") #PCN #108 # #$ ICSI - TO PARSE A RSX11 COMMAND LINE # PCN # 18, 17 NOV 77, ADD ! COMMENT FEATURE # PCN #72, 3 DEC 79, MAKE TASK NAME (FROM PROMPT) SHOW AS 1ST PART OF ERROR MSG. # PCN #77, 8 JAN 80, USE STRPUT TO OUTPUT THE PROMPT. CHANGE PROMPT TO STRING. # PCN #99, 27 MAR 80, CONVERT COMMAND LINE TO UPPERCASE BEFORE SCANNING. # PCN 108, 1 OCT 80, USE EXPLICIT DEFAULT SY: SO YOUR CURRENT ASN IS USED. # INTEGER FUNCTION ICSI(NAMES,DEFALT,SWITCH,NUM,PROMPT) # CHARACTER NAMES(35,9), DEFALT(4,4), PROMPT(DUMMYSIZE) CHARACTER PROMPX(8) INTEGER SWITCH(4,NUM), NUM, ICSIL, ICSIN, SLEN, I, J, SCOPY ? INTEGER JUNK, STRPUT INCLUDE CICSI # COMMON/ ICSIP / PROMPX # #SWITCH ARRAY # (1,N) - SWITCH NAME (A2), SUPPLIED BY CALLER # (2,N) - OCCURRED FLAG # 0 - DID NOT OCCUR # 1 - OCCURRED WITHOUT A VALUE # 2 - OCCURRED WITH A VALUE # -1 - OCCURRED WITHOUT A VALUE & WAS NEGATED # -2 - OCCURRED WITH A VALUE & WAS NEGATED # (3,N) - THE FILE SPEC NUMBER (1-9) WHERE THE SWITCH OCCURRED, # 0 IF THE SWITCH DID NOT OCCUR # (4,N) - THE VALUE OF THE SWITCH (IF (2,N) = 2 OR -2), # NOT MODIFIED UNLESS A VALUE OCCURRED. # ONLY DECIMAL NUMBERS (WITHOUT THE DECIMAL # POINT) ARE ALLOWED. # #DEFALT EXTENSION SPECIFICATION: #IN CALLER-- REAL DEFALT(4) # DATA DEFALT/'FTN ','LST ','FOO ','RAT '/ #IN ICSI THE BYTE DEFALT(4,4) #MAKES A CHAR. ARRAY EQUIVALENT. THE BLANK AT END OF EACH ONE IS REPLACED # WITH AN EOS. #NOTE: # NUMERIC ARGUMENTS TO SWITCHES MUST BE DECIMAL NUMBERS, # WITHOUT A DECIMAL POINT. # DEFAULT EXTENSION FOR INDIRECT COMMAND FILES IS 'CMD'. # 'PROMPT' IS A STRING OF UP TO 7 CHAR FOR PROMPT AT TERMINAL, # EG., 'RAT>'. # A '!' WITHIN A COMMAND LINE IS TAKEN AS A COMMENT DELIMITER # AND THE REST OF THE COMMAND LINE IS IGNORED. THIS IS TRUE # OF LINES PASSED BY CALLER AS WELL AS ENTERED LINES. # ON LINES ENTERED BY INDIRECT FILES, # A ';' OR '!' IN COLUMN 1 MAKES THE WHOLE LINE A COMMENT. # SUCH FULL-LINE COMMENTS ARE NOT LEGAL FROM OPERATOR INPUT, BUT # TRAILING '!' COMMENTS ARE. BLANKS AND TABS ARE ALLOWED IN # FRONT OF THE'!'. # #INITIALIZATION OF CICSI BY CALLER: # IFIRST MUST BE SET TO 'YES' BEFORE FIRST CALL; THEN LEFT ALONE. # USER MUST BE SET TO LUN NUMBER TO BE USED FOR OPERATOR INPUT # AND/OR ERROR MESSAGES. # INDLUN MUST BE SET TO LUN TO BE USED FOR INDIRECT COMMAND FILES; # OR 0, IF NOT ALLOWED. # INPUT & MCR MUST NEVER BE MODIFIED BY THE CALLER. # CLB IS A STRING; IT MUST EITHER BE NULL, IN WHICH CASE THE # COMMAND LINE IS TAKEN FROM EITHER THE MCR OR THE # USER'S TERMINAL; OR IT MUST CONTAIN A COMMAND LINE, # IN WHICH CASE THAT COMMAND LINE IS THE ONE PROCESSED # BY ICSI. DON'T FORGET TO RE-NULL IT EACH TIME # ICSI IS RE-CALLED AND A COMMAND LINE IS NOT SUPPLIED. # @ FILE SPECS ARE NOT ALLOWED TO BE SUPPLIED IN BY # CALLER IN CLB. NOTE THAT THE COMMAND LINE IS CONVERTED # TO UPPER CASE BEFORE SCANNING. # I=SCOPY(PROMPT, PROMPX, 7, JUNK) #PASS TO ICSIE, #PCN 77 PROMPX(I)=EOS #KLOBBER THE '>' AT END OF PROMPT STRING # IF (SLEN (CLB) > 0) ICSI = ICSIN (NAMES, DEFALT, SWITCH, NUM) ELSE REPEAT [ ICSI=ICSIL (PROMPT) IF (ICSI == YES) ICSI = ICSIN (NAMES, DEFALT, SWITCH, NUM) ] UNTIL (INPUT != INDLUN \ ICSI != BAD) # ? DO I=1,9 ? JUNK= STRPUT (USER, NAMES(1,I), BLANK) #? IF (NUM > 0) #? WRITE (USER,2) ((SWITCH(I,J),I=1,4),J=1,NUM) #? 2 FORMAT (1X,A2,I4,I3,I6) # RETURN END # #$ ICSIN - PARSE FILE SPECIFICATIONS OUT OF INPUT BUFFER FOR ICSI # INTEGER FUNCTION ICSIN (NAMES, DEFALT, SWITCH, NUM) # CHARACTER NAMES(35,9), DEFALT(4,4) CHARACTER SAVE, TEMP1(5), TEMP2(10), TYPE INTEGER SWITCH(4,NUM), NUM, INDEX, SJOIN, SCOPY INTEGER LCOL, N, JCOL, JUNK, MAX0, MIN0, SLEN, LEN, ICOL INTEGER I, J, LINE, BRAK, SPREV, ICSIS INCLUDE CICSI # # DO J=1,NUM #NOW WE HAVE A GOOD COMMAND LINE, SO PROCESS IT DO I=2,3 SWITCH(I,J)=0 DO J=1,9 NAMES(1,J)=EOS DO J=1,4 #MAKE EACH EXTENSION A STRING DEFALT(4,J)=EOS # CALL UNFOLD (CLB) #PCN 99, CONVERT TO UPPER CASE # #FIND THE FILE SPEC STRINGS AND MOVE TO NAMES (1-9) ICOL=1 LEN=INDEX (CLB, "!") -1 #***PCN#18, STOP AT A '!' IF (LEN < 0) #IF NO !, USE WHOLE LINE LEN=SLEN(CLB) #LENGTH OF CLB ELSE WHILE (CLB(LEN) == BLANK \ CLB(LEN) == TAB) #KILL TRAILING BLANKS/TABS DECREMENT (LEN) #***PCN#18 JUNK=SCOPY(DEFAULT_DEVICE, TEMP1(1), 5, JUNK) #PCN #108 TEMP2(1)=EOS #CLEAR UIC IF (INDEX(CLB, "=") == 0) LINE=4 #NO = MEANS INPUT SIDE ONLY ELSE LINE=1 FOR (; LINE <= 9 & ICOL < LEN; INCREMENT(LINE)) [ IF (CLB(ICOL) != COMMA) [ BRAK=0 FOR (I=ICOL; (CLB(I) != COMMA \ BRAK != 0) & CLB(I) != EQUALS & CLB(I) != SLASH & I <= LEN; INCREMENT(I)) IF (CLB(I) == LBRACK) INCREMENT(BRAK) ELSE IF (CLB(I) == RBRACK) DECREMENT(BRAK) IF (I > ICOL) #WAS THERE A FILENAME? [ SAVE=CLB(I) #FOUND END OF THIS FILE SPEC CLB(I)=EOS IF (INDEX(CLB(ICOL), ";")==YES & INDEX(CLB(ICOL),".")==NO) [ CALL ICSIE ("Explicit Version Needs Explicit Extension") RETURN (BAD) ] IF (BRAK != 0) [ CALL ICSIE ("Illegal UIC syntax") RETURN (BAD) ] # JCOL=INDEX(CLB(ICOL), ":")+ICOL IF (JCOL > ICOL) #SAVE DEVICE SPECIFICATIONS JUNK=SCOPY (CLB(ICOL), TEMP1(1), JCOL-ICOL, JUNK) #OVERLAY DEFAULT LCOL=INDEX(CLB(ICOL), "]")+ICOL IF (LCOL > ICOL) #SAVE UIC SPECIFICATIONS [ N=MAX0(ICOL, JCOL) JUNK=SCOPY (CLB(N), TEMP2(1), LCOL-N, JUNK) ] # #BUILD UP FILE NAMES JUNK=SJOIN (NAMES(1,LINE), TEMP1, 35, JUNK) #DEV (MAY BE DEFAULT) JUNK=SJOIN (NAMES(1,LINE), TEMP2, 35, JUNK) #UIC N=MAX0(ICOL, JCOL, LCOL) JUNK=SJOIN (NAMES(1,LINE), CLB(N), 35, JUNK) #COPY NAME INTO NAMES IF (INDEX(CLB(ICOL), ".") == 0) #ADD DEFAULT EXTENSION [ JUNK=SJOIN (NAMES(1,LINE), ".", 35, JUNK) JUNK=SJOIN (NAMES(1,LINE), DEFALT(1,MIN0(4,LINE)), 35, JUNK) ] CLB(I)=SAVE ] # #DECODE ANY SWITCHES FOR THIS FILE IF (ICSIS (SWITCH, NUM, I, LINE) == YES) ICOL=I ELSE RETURN (BAD) ] IF (CLB(ICOL) == EQUALS) [ LINE=3 #START ON INPUT SIDE OF COMMAND JUNK=SCOPY(DEFAULT_DEVICE, TEMP1(1), 5, JUNK) #PCN 108 TEMP2(1)=EOS ] INCREMENT(ICOL) ] # #SPECIAL DEFAULT MODE. IF NO OUTPUT FILES ARE SPECIFIED, BUT AT # LEAST 1 INPUT FILE WAS, ASSUME OUTPUT FILE NAMES ARE THE # SAME (USE NORMAL OUTPUT DEFAULT EXTENSIONS) AS FIRST INPUT FILE. # IF DEVICE & UIC WERE SPECIFIED WITH INPUT FILE, USE THOSE AS WELL, # ELSE, USE NORMAL OUTPUT DEFAULT DEVICE. # EXAMPLE RAT>FOO IS THE SAME AS RAT>FOO,FOO,FOO=FOO # IF (NAMES(1,1)==EOS & NAMES(1,2)==EOS & NAMES(1,3)==EOS & NAMES(1,4)!=EOS) DO I=1,3 [ JUNK=SPREV (NAMES(1,4), ".", NAMES(1,I), 35, JUNK) JUNK=SJOIN (NAMES(1,I), ".", 35, JUNK) JUNK=SJOIN (NAMES(1,I), DEFALT(1,I), 35, JUNK) ] RETURN (YES) #EVERYTHING OK # END # #$ ICSIL - TO GET A COMMAND LINE FOR ICSI FROM USER OR INDIRECT FILE # PCN #77, 8 JAN 80, USE STRPUT TO OUTPUT THE PROMPT # PCN #82, 10 FEB 80, USE 'OPEN' INSTEAD OF 'ASSIGN/FDBSET' IF AVAILABLE. # PCN #105, 26 SEP 80, FIX BUG THAT TRUNCATED LINES >35 CHAR. # PCN #108, 1 OCT 80, USE EXPLICIT DEFAULT SY: ON @ FILES. # INTEGER FUNCTION ICSIL (PROMPT) # INTEGER IQ, SCOPY, INDEX, SJOIN, STRPUT INTEGER I, JUNK, STRGET, SLEN CHARACTER PROMPT(DUMMYSIZE), NAMBUF(35) #PCN 108 # INCLUDE CICSI # IF (IFIRST == YES) [ INPUT=USER MCR=NO ] IF (MCR == YES & INPUT == USER) RETURN (EOF) #TERMINATE HERE 2ND TIME THRU IF STARTED FROM MCR IQ=0 IF (IFIRST == YES) [ CALL GETMCR (CLB, IQ) #FIRST TIME, TRY TO GET LINE FROM MCR IF (IQ > 4) [ MCR=YES #WE'LL ONLY DO IT ONCE CLB(IQ+1)=EOS I=INDEX (CLB, " ") #FIND THE BLANK BETWEEN PROG NAME##31 DEC 79 IF (I < 4) #AND COMMAND LINE RETURN (BAD) ELSE IQ=SCOPY (CLB(I+1), CLB(1), 80-I, JUNK) #SHIFT LEFT TO KILL "RAT "***PCN 105 ] ELSE IQ=0 IFIRST=NO ] WHILE (IQ <= 0 \ CLB(1) == SEMICOL) [ IF (USER == INPUT & MCR == NO) JUNK=STRPUT (USER, PROMPT, DOLLAR) #PCN 77, PRINT PROMPT STRING, IQ=STRGET (INPUT, CLB, 80) #GET A COMMAND LINE ? JUNK= STRPUT (USER, CLB, BLANK) IF (IQ < 0) #ERROR? [ IF (INPUT == INDLUN & MCR == NO) #YES, ASSUME EOF [ INPUT=USER #RESET FROM NON-MCR @ TO USER INPUT CALL CLOSE (INDLUN) #MAY WANT TO USE IT AGAIN ] ELSE RETURN (EOF) #MCR @ AND USER ARE DONE ] ] IF (CLB(1) == ATSIGN) [ IF (INDLUN > 0) #0 MEANS INDIRECT CMD FILES NOT ALLOWED BY CALLER [ IF (INPUT == USER) [ I=INDEX (CLB, "!") IF (I > 0) CLB(I)=EOS #KILL COMMENTS NAMBUF(1)=EOS #PCN #108 IF (INDEX(CLB, ":") == 0) #DEVICE SPECIFIED? JUNK=SJOIN (NAMBUF, DEFAULT_DEVICE, 35, JUNK) #NO, USE DEFLT JUNK=SJOIN (NAMBUF, CLB(2), 35, JUNK) #COPY FILENAME IF (INDEX(NAMBUF, ".") == 0) JUNK=SJOIN (NAMBUF, ".CMD", 35, JUNK) #ADD DEFLT EXTENSION IFNOTDEF (OPENCLOSE) #PCN#82 CALL ASSIGN (INDLUN, NAMBUF, 0) CALL FDBSET (INDLUN, "READONLY") #PCN #77, RSX !!! ENDIFDEF IFDEF (OPENCLOSE) OPEN (UNIT=INDLUN,NAME=NAMBUF,READONLY,SHARED,ERR=11,TYPE='OLD') ENDIFDEF #PCN #82 INPUT = INDLUN #SET UP TO TAKE INPUT FROM INDIRECT FILE REPEAT IF (STRGET (INPUT, CLB, 80) < 0) #READ FROM @ [ 11 CALL ICSIE ("Open Failure on @ File") RETURN (BAD) ] UNTIL (SLEN(CLB)>0 & CLB(1)!=SEMICOL & CLB(1)!=BANG) #***PCN#18 ] ELSE [ CALL ICSIE ("Nested @ Files Illegal") RETURN (BAD) ] ] ELSE [ CALL ICSIE ("@ Files Illegal") RETURN (BAD) ] ] RETURN (YES) #EVERYTHING OK # END # #$ ICSIS - DECODE SWITCH SPECIFICATIONS FOR ICSI # PCN #64, 9 SPE 79, ALLOW SWITCHES WITH ARGUMENTS TO BE > 2 CHARS # 2 DEC 79, FIX PCN 64 # INTEGER FUNCTION ICSIS (SWITCH, NUM, I, LINE) # CHARACTER TESTC(2), TYPE INTEGER I, J, SWITCH(4,NUM), NUM, LINE, SCTOI, NEG, OK, TEST EQUIVALENCE (TEST,TESTC) INCLUDE CICSI # WHILE (CLB(I) == SLASH) [ INCREMENT(I) OK=NO NEG=NO IF (CLB(I) == MINUS) [ NEG=YES INCREMENT(I) #SKIP PAST THE '-' ] ELSE IF (CLB(I) == BIGN & CLB(I+1) == BIGO) [ NEG=YES I=I+2 #SKIP PAST THE 'NO' ] TESTC(1)=CLB(I) TESTC(2)=CLB(I+1) I=I+2 #SKIP PAST THE BASIC SWITCH # #LOOK FOR ANY VALUES AND SETUP THE SWITCH ARRAY RETURN FLAGS # FOR (J=1; J <= NUM; INCREMENT(J)) IF (SWITCH(1,J) == TEST) [ OK=YES #FOUND IT WHILE (TYPE(CLB(I)) == DIGIT \ TYPE (CLB(I)) == LETTER) INCREMENT (I) #SKIP PAST SWITCH NAMES OF > 2 CHAR. IF (CLB(I) == COLON) [ INCREMENT(I) SWITCH(4,J)=SCTOI(CLB,I) #GET THE VALUE SWITCH(2,J)=2 ] ELSE SWITCH(2,J)=1 #NO VALUE FOUND SWITCH(3,J)=LINE #FILE SPECIFICATION NUMBER IF (NEG == YES) SWITCH(2,J)=-SWITCH(2,J) #SWITCH WAS NEGATED BREAK ] IF (OK != YES) [ CALL ICSIE ("Illegal Switch") RETURN (BAD) ] ] RETURN (YES) #EVERYTHING OK # END # #$ ICSIE - TO PRINT ERROR MESSAGES ON USER'S TERMINAL FOR ICSI # PCN #72, 3 DEC 79, MAKE TASK NAME (FROM PROMPT) SHOW AS 1ST PART OF ERROR MSG. # PCN #77, 8 JAN 80, MAKE 'PROMPT' A STRING. # SUBROUTINE ICSIE (MSG) # INTEGER STRPUT, JUNK, SJOIN CHARACTER MSG(DUMMYSIZE), PROMPX(8), OUTB(81) COMMON / ICSIP / PROMPX # INCLUDE CICSI # IF (INPUT == INDLUN) #IF @ FILE, TELL USER WHICH LINE WAS BAD JUNK= STRPUT (USER, CLB, BLANK) OUTB(1)=BELL OUTB(2)=EOS JUNK=SJOIN (OUTB, PROMPX, 80, JUNK) #PCN 77, OUTPUT PROMPT STRING JUNK=SJOIN (OUTB, " - ", 80, JUNK) JUNK=SJOIN (OUTB, MSG, 80, JUNK) #COPY THE ERROR MESSAGE JUNK= STRPUT (USER, OUTB, BLANK) # RETURN END