INCLUDE/NL DEFIN INCLUDE/NL RATDEF # # 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. # INTEGER FUNCTION ICSI(NAMES,DEFALT,SWITCH,NUM,PROMPT) # CHARACTER NAMES(35,9), DEFALT(4,4) REAL PROMPT, PROMPX INTEGER SWITCH(4,NUM), NUM, ICSIL, ICSIN, SLEN, I, J ? 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 REAL*4 STRING OF 4 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 BUFR BY # CALLER. # PROMPX=PROMPT #PASS TO ICSIE # 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)) ? 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 # #FIND THE FILE SPEC STRINGS AND MOVE TO NAMES (1-9) ICOL=1 LEN=INDEX (CLB, BANG) -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 TEMP1(1)=EOS #CLEAR DEV TEMP2(1)=EOS #CLEAR UIC IF (INDEX(CLB,EQUALS) == 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),SEMICOL)==YES & INDEX(CLB(ICOL),PERIOD)==NO) [ CALL ICSIE ("EXPLICIT VERSION NEEDS EXT") ICSIN=BAD RETURN ] IF (BRAK != 0) [ CALL ICSIE ("ILLEGAL UIC") ICSIN=BAD RETURN ] # JCOL=INDEX(CLB(ICOL), COLON)+ICOL IF (JCOL > ICOL) #SAVE DEVICE SPECIFICATIONS JUNK=SCOPY (CLB(ICOL), TEMP1, JCOL-ICOL, JUNK) LCOL=INDEX(CLB(ICOL), RBRACK)+ICOL IF (LCOL > ICOL) [ #SAVE UIC SPECIFICATIONS N=MAX0(ICOL, JCOL) JUNK=SCOPY (CLB(N), TEMP2, LCOL-N, JUNK) ] # #BUILD UP FILE NAMES JUNK=SJOIN (NAMES(1,LINE), TEMP1, 35, JUNK) #DEV (MAY BE NULL) 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),PERIOD) == 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 [ ICSIN=BAD RETURN ] ] IF (CLB(ICOL) == EQUALS) [ LINE=3 #START ON INPUT SIDE OF COMMAND TEMP1(1)=EOS #CLEAR DEV AND UIC DEFAULTS 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) ] ICSIN=YES #EVERYTING OK RETURN # END # # ICSIL - TO GET A COMMAND LINE FOR ICSI FROM USER OR INDIRECT FILE # INTEGER FUNCTION ICSIL (PROMPT) # INTEGER IQ, SCOPY, SSAME, INDEX, SJOIN ? INTEGER STRPUT INTEGER I, JUNK, STRGET, SLEN INCLUDE CICSI # IF (IFIRST == YES) [ INPUT=USER MCR=NO ] IF (MCR == YES & INPUT == USER) [ ICSIL=EOF #TERMINATE HERE 2ND TIME THRU IF STARTED FROM MCR RETURN ] 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=SSAME (CLB, " ", -1) #FIND THE BLANK BETWEEN PROG NAME IF (I < 4) [ #AND COMMAND LINE ICSIL=BAD RETURN ] ELSE IQ=SCOPY (CLB(I+1), CLB(1), 35, JUNK) #SHIFT LEFT TO KILL "RAT " ] ELSE IQ=0 IFIRST=NO ] WHILE (IQ <= 0 \ CLB(1) == SEMICOL) [ IF (USER == INPUT & MCR == NO) [ WRITE (USER, 2) PROMPT 2 FORMAT ("$",A4) ] IQ=STRGET (INPUT, CLB, 80) #GET A COMMAND LINE ? JUNK= STRPUT (USER, CLB) 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 [ ICSIL=EOF #MCR @ AND USER ARE DONE RETURN ] ] ] IF (CLB(1) == ATSIGN) [ IF (INDLUN > 0) [ #0 MEANS INDIRECT CMD FILES NOT ALLOWED BY CALLER IF (INPUT == USER) [ IF (INDEX(CLB,PERIOD) == 0) JUNK=SJOIN (CLB, ".CMD", 35, JUNK) #ADD DEFLT EXTENSION CALL ASSIGN (INDLUN,CLB(2), 0) INPUT = INDLUN #SET UP TO TAKE INPUT FROM INDIRECT FILE REPEAT IF (STRGET (INPUT, CLB, 80) < 0) [ CALL ICSIE ("ERROR OPENING @ FILE") ICSIL=BAD RETURN ] UNTIL (SLEN(CLB)>0 & CLB(1)!=SEMICOL & CLB(1)!=BANG) #***PCN#18 ] ELSE [ CALL ICSIE ("NESTED @ FILES ILLEGAL") ICSIL=BAD RETURN ] ] ELSE [ CALL ICSIE ("@ FILES ILLEGAL") ICSIL=BAD RETURN ] ] ICSIL=YES #EVERYTHING OK RETURN # 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") ICSIS=BAD RETURN ] ] ICSIS=YES #EVERYTHING OK # RETURN 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. # SUBROUTINE ICSIE (MSG) # INTEGER STRPUT, JUNK, SJOIN CHARACTER MSG(DUMMYSIZE), B2(4), OUTB(81) REAL B1, PROMPT EQUIVALENCE (B1,B2) COMMON / ICSIP / PROMPT # INCLUDE CICSI # IF (INPUT == INDLUN) #IF @ FILE, TELL USER WHICH LINE WAS BAD JUNK= STRPUT (USER, CLB) B1=PROMPT #CONVERT PROMPT TO CHAR. OUTB(1)=BELL OUTB(2)=B2(1) OUTB(3)=B2(2) #DISPLAY TASK NAME (PROMPT) OUTB(4)=B2(3) #AS FIRST PART OF ERROR MSG OUTB(5)=BLANK OUTB(6)=MINUS OUTB(7)=BLANK OUTB(8)=EOS JUNK=SJOIN (OUTB, MSG, 80, JUNK) #COPY THE ERROR MESSAGE JUNK= STRPUT (USER, OUTB) # RETURN END