CFILE=DEFIN.RAT ===== GENERAL CHARACTER SET DEFINITIONS =============== C C FILE=RATDEF.RAT CDEFINE (DECWRITER,) #DEFINED FOR DECWRITER OUTPUT C C C ICSI - TO PARSE A RSX11 COMMAND LINE C PCN # 18, 17 NOV 77, ADD ! COMMENT FEATURE C INTEGER FUNCTION ICSI ( NAMES, DEFALT, SWITCH, NUM, PROMPT ) C LOGICAL * 1 NAMES ( 35, 9 ), DEFALT ( 4, 4 ) REAL PROMPT, PROMPX INTEGER SWITCH ( 4, NUM ), NUM, ICSIL, ICSIN, SLEN, I, J C CFILE = CICSI.RAT FOR ICSI COMMON / CICSI / INPUT, INDLUN, USER, IFIRST, MCR, CLB ( 81 ) INTEGER INPUT INTEGER INDLUN INTEGER USER INTEGER IFIRST INTEGER MCR LOGICAL * 1 CLB C COMMON / ICSIP / PROMPX C CSWITCH ARRAY C (1,N) - SWITCH NAME (A2), SUPPLIED BY CALLER C (2,N) - OCCURRED FLAG C 0 - DID NOT OCCUR C 1 - OCCURRED WITHOUT A VALUE C 2 - OCCURRED WITH A VALUE C -1 - OCCURRED WITHOUT A VALUE & WAS NEGATED C -2 - OCCURRED WITH A VALUE & WAS NEGATED C (3,N) - THE FILE SPEC NUMBER (1-9) WHERE THE SWITCH OCCURRED, C 0 IF THE SWITCH DID NOT OCCUR C (4,N) - THE VALUE OF THE SWITCH (IF (2,N) = 2 OR -2), C NOT MODIFIED UNLESS A VALUE OCCURRED. C ONLY DECIMAL NUMBERS (WITHOUT THE DECIMAL C POINT) ARE ALLOWED. C CDEFALT EXTENSION SPECIFICATION: CIN CALLER-- REAL DEFALT(4) C DATA DEFALT/'FTN ','LST ','FOO ','RAT '/ CIN ICSI THE BYTE DEFALT(4,4) CMAKES A CHAR. ARRAY EQUIVALENT. THE BLANK AT END OF EACH ONE IS REPLACED C WITH AN EOS. CNOTE: C NUMERIC ARGUMENTS TO SWITCHES MUST BE DECIMAL NUMBERS, C WITHOUT A DECIMAL POINT. C DEFAULT EXTENSION FOR INDIRECT COMMAND FILES IS 'CMD'. C 'PROMPT' IS A REAL*4 STRING OF 4 CHAR FOR PROMPT AT TERMINAL, C EG., 'RAT>'. C A '!' WITHIN A COMMAND LINE IS TAKEN AS A COMMENT DELIMITER C AND THE REST OF THE COMMAND LINE IS IGNORED. THIS IS TRUE C OF LINES PASSED BY CALLER AS WELL AS ENTERED LINES. C ON LINES ENTERED BY INDIRECT FILES, C A ';' OR '!' IN COLUMN 1 MAKES THE WHOLE LINE A COMMENT. C SUCH FULL-LINE COMMENTS ARE NOT LEGAL FROM OPERATOR INPUT, BUT C TRAILING '!' COMMENTS ARE. BLANKS AND TABS ARE ALLOWED IN C FRONT OF THE'!'. C CINITIALIZATION OF CICSI BY CALLER: C IFIRST MUST BE SET TO 'YES' BEFORE FIRST CALL; THEN LEFT ALONE. C USER MUST BE SET TO LUN NUMBER TO BE USED FOR OPERATOR INPUT C AND/OR ERROR MESSAGES. C INDLUN MUST BE SET TO LUN TO BE USED FOR INDIRECT COMMAND FILES; C OR 0, IF NOT ALLOWED. C INPUT & MCR MUST NEVER BE MODIFIED BY THE CALLER. C CLB IS A STRING; IT MUST EITHER BE NULL, IN WHICH CASE THE C COMMAND LINE IS TAKEN FROM EITHER THE MCR OR THE C USER'S TERMINAL; OR IT MUST CONTAIN A COMMAND LINE, C IN WHICH CASE THAT COMMAND LINE IS THE ONE PROCESSED C BY ICSI. DON'T FORGET TO RE-NULL IT EACH TIME C ICSI IS RE-CALLED AND A COMMAND LINE IS NOT SUPPLIED. C @ FILE SPECS ARE NOT ALLOWED TO BE SUPPLIED IN BUFR BY C CALLER. C PROMPX = PROMPT C IF(.NOT.( SLEN ( CLB ) .GT. 0 )) GOTO 20000 ICSI = ICSIN ( NAMES, DEFALT, SWITCH, NUM ) GOTO 20001 20000 CONTINUE CONTINUE 20002 CONTINUE ICSI = ICSIL ( PROMPT ) IF(.NOT.( ICSI .EQ. 1 )) GOTO 20005 ICSI = ICSIN ( NAMES, DEFALT, SWITCH, NUM ) 20005 CONTINUE 20003 IF(.NOT.( INPUT .NE. INDLUN .OR. ICSI .NE. - 1 )) GOTO 20002 20004 CONTINUE 20001 CONTINUE C C RETURN END C C ICSIN - PARSE FILE SPECIFICATIONS OUT OF INPUT BUFFER FOR ICSI C INTEGER FUNCTION ICSIN ( NAMES, DEFALT, SWITCH, NUM ) C LOGICAL * 1 NAMES ( 35, 9 ), DEFALT ( 4, 4 ) LOGICAL * 1 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 C CFILE = CICSI.RAT FOR ICSI COMMON / CICSI / INPUT, INDLUN, USER, IFIRST, MCR, CLB ( 81 ) INTEGER INPUT INTEGER INDLUN INTEGER USER INTEGER IFIRST INTEGER MCR LOGICAL * 1 CLB C C DO 20007 J = 1, NUM DO 20009 I = 2, 3 SWITCH ( I, J ) = 0 20009 CONTINUE 20010 CONTINUE 20007 CONTINUE 20008 CONTINUE DO 20011 J = 1, 9 NAMES ( 1, J ) = 0 20011 CONTINUE 20012 CONTINUE DO 20013 J = 1, 4 DEFALT ( 4, J ) = 0 C CFIND THE FILE SPEC STRINGS AND MOVE TO NAMES (1-9) 20013 CONTINUE 20014 CONTINUE ICOL = 1 LEN = INDEX ( CLB, 33 ) - 1 IF(.NOT.( LEN .LT. 0 )) GOTO 20015 LEN = SLEN ( CLB ) GOTO 20016 20015 CONTINUE CONTINUE 20017 IF(.NOT.( CLB ( LEN ) .EQ. 32 .OR. CLB ( LEN ) .EQ. 9 )) GOTO $20018 LEN = LEN - 1 GOTO 20017 20018 CONTINUE 20016 CONTINUE TEMP1 ( 1 ) = 0 TEMP2 ( 1 ) = 0 IF(.NOT.( INDEX ( CLB, 61 ) .EQ. 0 )) GOTO 20019 LINE = 4 GOTO 20020 20019 CONTINUE LINE = 1 20020 CONTINUE 20021 IF(.NOT.( LINE .LE. 9 .AND. ICOL .LT. LEN)) GOTO 20023 IF(.NOT.( CLB ( ICOL ) .NE. 44 )) GOTO 20024 BRAK = 0 CONTINUE I = ICOL 20026 IF(.NOT.( ( CLB ( I ) .NE. 44 .OR. BRAK .NE. 0 ) .AND. CLB ( I ) $.NE. 61 .AND. CLB ( I ) .NE. 47 .AND. I .LE. LEN)) GOTO 20028 IF(.NOT.( CLB ( I ) .EQ. 91 )) GOTO 20029 BRAK = BRAK + 1 GOTO 20030 20029 CONTINUE IF(.NOT.( CLB ( I ) .EQ. 93 )) GOTO 20031 BRAK = BRAK - 1 20031 CONTINUE 20030 CONTINUE 20027 I = I + 1 GOTO 20026 20028 CONTINUE IF(.NOT.( I .GT. ICOL )) GOTO 20033 SAVE = CLB ( I ) CLB ( I ) = 0 IF(.NOT.( INDEX ( CLB ( ICOL ), 59 ) .EQ. 1 .AND. INDEX ( CLB ( $ICOL ), 46 ) .EQ. 0 )) GOTO 20035 CALL ICSIE ( 26HEXPLICIT VERSION NEEDS EXT ) ICSIN = - 1 RETURN 20035 CONTINUE IF(.NOT.( BRAK .NE. 0 )) GOTO 20037 CALL ICSIE ( 11HILLEGAL UIC ) ICSIN = - 1 RETURN C 20037 CONTINUE JCOL = INDEX ( CLB ( ICOL ), 58 ) + ICOL IF(.NOT.( JCOL .GT. ICOL )) GOTO 20039 JUNK = SCOPY ( CLB ( ICOL ), TEMP1, JCOL - ICOL, JUNK ) 20039 CONTINUE LCOL = INDEX ( CLB ( ICOL ), 93 ) + ICOL IF(.NOT.( LCOL .GT. ICOL )) GOTO 20041 N = MAX0 ( ICOL, JCOL ) JUNK = SCOPY ( CLB ( N ), TEMP2, LCOL - N, JUNK ) C CBUILD UP FILE NAMES 20041 CONTINUE JUNK = SJOIN ( NAMES ( 1, LINE ), TEMP1, 35, JUNK ) JUNK = SJOIN ( NAMES ( 1, LINE ), TEMP2, 35, JUNK ) N = MAX0 ( ICOL, JCOL, LCOL ) JUNK = SJOIN ( NAMES ( 1, LINE ), CLB ( N ), 35, JUNK ) IF(.NOT.( INDEX ( CLB ( ICOL ), 46 ) .EQ. 0 )) GOTO 20043 JUNK = SJOIN ( NAMES ( 1, LINE ), 1H., 35, JUNK ) JUNK = SJOIN ( NAMES ( 1, LINE ), DEFALT ( 1, MIN0 ( 4, LINE ) ), $ 35, JUNK ) 20043 CONTINUE CLB ( I ) = SAVE C CDECODE ANY SWITCHES FOR THIS FILE 20033 CONTINUE IF(.NOT.( ICSIS ( SWITCH, NUM, I, LINE ) .EQ. 1 )) GOTO 20045 ICOL = I GOTO 20046 20045 CONTINUE ICSIN = - 1 RETURN 20046 CONTINUE 20024 CONTINUE IF(.NOT.( CLB ( ICOL ) .EQ. 61 )) GOTO 20047 LINE = 3 TEMP1 ( 1 ) = 0 TEMP2 ( 1 ) = 0 20047 CONTINUE ICOL = ICOL + 1 C CSPECIAL DEFAULT MODE. IF NO OUTPUT FILES ARE SPECIFIED, BUT AT C LEAST 1 INPUT FILE WAS, ASSUME OUTPUT FILE NAMES ARE THE C SAME (USE NORMAL OUTPUT DEFAULT EXTENSIONS) AS FIRST INPUT FILE. C IF DEVICE & UIC WERE SPECIFIED WITH INPUT FILE, USE THOSE AS WELL, C ELSE, USE NORMAL OUTPUT DEFAULT DEVICE. C EXAMPLE RAT>FOO IS THE SAME AS RAT>FOO,FOO,FOO=FOO C 20022 LINE = LINE + 1 GOTO 20021 20023 CONTINUE IF(.NOT.( NAMES ( 1, 1 ) .EQ. 0 .AND. NAMES ( 1, 2 ) .EQ. 0 .AND. $ NAMES ( 1, 3 ) .EQ. 0 .AND. NAMES ( 1, 4 ) .NE. 0 )) GOTO 20049 DO 20051 I = 1, 3 JUNK = SPREV ( NAMES ( 1, 4 ), 1H., NAMES ( 1, I ), 35, JUNK ) JUNK = SJOIN ( NAMES ( 1, I ), 1H., 35, JUNK ) JUNK = SJOIN ( NAMES ( 1, I ), DEFALT ( 1, I ), 35, JUNK ) 20051 CONTINUE 20052 CONTINUE 20049 CONTINUE ICSIN = 1 RETURN C END C C ICSIL - TO GET A COMMAND LINE FOR ICSI FROM USER OR INDIRECT FILE C INTEGER FUNCTION ICSIL ( PROMPT ) C INTEGER IQ, SCOPY, SSAME, INDEX, SJOIN INTEGER I, JUNK, STRGET, SLEN C CFILE = CICSI.RAT FOR ICSI COMMON / CICSI / INPUT, INDLUN, USER, IFIRST, MCR, CLB ( 81 ) INTEGER INPUT INTEGER INDLUN INTEGER USER INTEGER IFIRST INTEGER MCR LOGICAL * 1 CLB C IF(.NOT.( IFIRST .EQ. 1 )) GOTO 20053 INPUT = USER MCR = 0 20053 CONTINUE IF(.NOT.( MCR .EQ. 1 .AND. INPUT .EQ. USER )) GOTO 20055 ICSIL = - 3 RETURN 20055 CONTINUE IQ = 0 IF(.NOT.( IFIRST .EQ. 1 )) GOTO 20057 CALL GETMCR ( CLB, IQ ) IF(.NOT.( IQ .GT. 4 )) GOTO 20059 MCR = 1 CLB ( IQ + 1 ) = 0 I = SSAME ( CLB, 1H , - 1 ) IF(.NOT.( I .LT. 4 )) GOTO 20061 ICSIL = - 1 RETURN 20061 CONTINUE IQ = SCOPY ( CLB ( I + 1 ), CLB ( 1 ), 35, JUNK ) 20062 CONTINUE GOTO 20060 20059 CONTINUE IQ = 0 20060 CONTINUE IFIRST = 0 20057 CONTINUE 20063 IF(.NOT.( IQ .LE. 0 .OR. CLB ( 1 ) .EQ. 59 )) GOTO 20064 IF(.NOT.( USER .EQ. INPUT .AND. MCR .EQ. 0 )) GOTO 20065 WRITE ( USER, 2 ) PROMPT 2 FORMAT ( 1H$, A4 ) 20065 CONTINUE IQ = STRGET ( INPUT, CLB, 80 ) IF(.NOT.( IQ .LT. 0 )) GOTO 20067 IF(.NOT.( INPUT .EQ. INDLUN .AND. MCR .EQ. 0 )) GOTO 20069 INPUT = USER CALL CLOSE ( INDLUN ) GOTO 20070 20069 CONTINUE ICSIL = - 3 RETURN 20070 CONTINUE 20067 CONTINUE GOTO 20063 20064 CONTINUE IF(.NOT.( CLB ( 1 ) .EQ. 64 )) GOTO 20071 IF(.NOT.( INDLUN .GT. 0 )) GOTO 20073 IF(.NOT.( INPUT .EQ. USER )) GOTO 20075 IF(.NOT.( INDEX ( CLB, 46 ) .EQ. 0 )) GOTO 20077 JUNK = SJOIN ( CLB, 4H.CMD, 35, JUNK ) 20077 CONTINUE CALL ASSIGN ( INDLUN, CLB ( 2 ), 0 ) INPUT = INDLUN CONTINUE 20079 CONTINUE IF(.NOT.( STRGET ( INPUT, CLB, 80 ) .LT. 0 )) GOTO 20082 CALL ICSIE ( 20HERROR OPENING @ FILE ) ICSIL = - 1 RETURN 20082 CONTINUE 20080 IF(.NOT.( SLEN ( CLB ) .GT. 0 .AND. CLB ( 1 ) .NE. 59 .AND. CLB ( $ 1 ) .NE. 33 )) GOTO 20079 20081 CONTINUE GOTO 20076 20075 CONTINUE CALL ICSIE ( 22HNESTED @ FILES ILLEGAL ) ICSIL = - 1 RETURN 20076 CONTINUE GOTO 20074 20073 CONTINUE CALL ICSIE ( 15H@ FILES ILLEGAL ) ICSIL = - 1 RETURN 20074 CONTINUE 20071 CONTINUE ICSIL = 1 RETURN C END C C ICSIS - DECODE SWITCH SPECIFICATIONS FOR ICSI C PCN #64, 9 SPE 79, ALLOW SWITCHES WITH ARGUMENTS TO BE > 2 CHARS C 2 DEC 79, FIX PCN 64 C INTEGER FUNCTION ICSIS ( SWITCH, NUM, I, LINE ) C LOGICAL * 1 TESTC ( 2 ), TYPE INTEGER I, J, SWITCH ( 4, NUM ), NUM, LINE, SCTOI, NEG, OK, TEST EQUIVALENCE ( TEST, TESTC ) C CFILE = CICSI.RAT FOR ICSI COMMON / CICSI / INPUT, INDLUN, USER, IFIRST, MCR, CLB ( 81 ) INTEGER INPUT INTEGER INDLUN INTEGER USER INTEGER IFIRST INTEGER MCR LOGICAL * 1 CLB C 20084 IF(.NOT.( CLB ( I ) .EQ. 47 )) GOTO 20085 I = I + 1 OK = 0 NEG = 0 IF(.NOT.( CLB ( I ) .EQ. 45 )) GOTO 20086 NEG = 1 I = I + 1 GOTO 20087 20086 CONTINUE IF(.NOT.( CLB ( I ) .EQ. 78 .AND. CLB ( I + 1 ) .EQ. 79 )) GOTO $20088 NEG = 1 I = I + 2 20088 CONTINUE 20087 CONTINUE TESTC ( 1 ) = CLB ( I ) TESTC ( 2 ) = CLB ( I + 1 ) I = I + 2 C CLOOK FOR ANY VALUES AND SETUP THE SWITCH ARRAY RETURN FLAGS C CONTINUE J = 1 20090 IF(.NOT.( J .LE. NUM)) GOTO 20092 IF(.NOT.( SWITCH ( 1, J ) .EQ. TEST )) GOTO 20093 OK = 1 CONTINUE 20095 IF(.NOT.( TYPE ( CLB ( I ) ) .EQ. - 20 .OR. TYPE ( CLB ( I ) ) $.EQ. - 30 )) GOTO 20096 I = I + 1 GOTO 20095 20096 CONTINUE IF(.NOT.( CLB ( I ) .EQ. 58 )) GOTO 20097 I = I + 1 SWITCH ( 4, J ) = SCTOI ( CLB, I ) SWITCH ( 2, J ) = 2 GOTO 20098 20097 CONTINUE SWITCH ( 2, J ) = 1 20098 CONTINUE SWITCH ( 3, J ) = LINE IF(.NOT.( NEG .EQ. 1 )) GOTO 20099 SWITCH ( 2, J ) = - SWITCH ( 2, J ) 20099 CONTINUE GOTO 20092 20093 CONTINUE 20091 J = J + 1 GOTO 20090 20092 CONTINUE IF(.NOT.( OK .NE. 1 )) GOTO 20101 CALL ICSIE ( 14HILLEGAL SWITCH ) ICSIS = - 1 RETURN 20101 CONTINUE GOTO 20084 20085 CONTINUE ICSIS = 1 C RETURN END C C ICSIE - TO PRINT ERROR MESSAGES ON USER'S TERMINAL FOR ICSI C SUBROUTINE ICSIE ( MSG ) C INTEGER STRPUT, JUNK, SJOIN LOGICAL * 1 MSG ( 1 ), B2 ( 4 ), OUTB ( 81 ) REAL B1, PROMPT EQUIVALENCE ( B1, B2 ) COMMON / ICSIP / PROMPT C C CFILE = CICSI.RAT FOR ICSI COMMON / CICSI / INPUT, INDLUN, USER, IFIRST, MCR, CLB ( 81 ) INTEGER INPUT INTEGER INDLUN INTEGER USER INTEGER IFIRST INTEGER MCR LOGICAL * 1 CLB C IF(.NOT.( INPUT .EQ. INDLUN )) GOTO 20103 JUNK = STRPUT ( USER, CLB ) 20103 CONTINUE B1 = PROMPT OUTB ( 1 ) = 7 OUTB ( 2 ) = B2 ( 1 ) OUTB ( 3 ) = B2 ( 2 ) OUTB ( 4 ) = B2 ( 3 ) OUTB ( 5 ) = 32 OUTB ( 6 ) = 45 OUTB ( 7 ) = 32 OUTB ( 8 ) = 0 JUNK = SJOIN ( OUTB, MSG, 80, JUNK ) JUNK = STRPUT ( USER, OUTB ) C RETURN END