.TITLE FCSI1 -- FETCH COMMAND LINE FOR FORTRAN PROGRAM .SBTTL FCSI -- CALLING SEQUENCE .IDENT /ICR002/ .MCALL GCMLB$,GCML$,RCML$ .MCALL CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND ; IF THE SYMBOL GLINE IS DEFINED HERE, THIS PROGRAM WILL INTERFACE ; WITH GTLIN AND USE ITS COMMAND BLOCK. GLINE=0 ; ; PLEASE ADDRESS ALL COMMENTS TO: ; ROBERT K. STODOLA ; INSTITUTE FOR CANCER RESEARCH ; 7701 BURHOLME AVE. ; PHILADELPHIA, PA. 19111 ; ; NO CLAIMS ARE MADE AS TO THE CORRECTNESS, COMPLETENESS, OR ; USEFULNESS OF THIS SOFTWARE OR ITS DOCUMENTATION. ; ; THIS SUBROUTINE ALLOWS FORTRAN PROGRAMS TO EASILY ACCESS THE ; COMMAND STRING INTERPRETER. THE USER MUST PREDEFINE SWITCHES ; AND RECEIVE BUFFERS FOR THE DATA, AND THE OPERATION IS DONE ; IN ONE FORTRAN CALL. THIS ALLOWS THE USER ACCESS TO THE ; FOLLOWING SERVICES: ; INDIRECT COMMAND FILES ; COMMENTS BETWEEN COMMANDS ; FLEXIBLE FILENAME INPUT ; NEGATABLE SWITCHES AND FILE STRINGS. ; ; THERE ARE TWO SUBROUTINES IN THIS PACKAGE. ONE CALLS FOR A ; COMMAND STRING, THE OTHER ALLOWS THE USER TO FLUSH INDIRECT ; COMMAND FILES(IE. IN CASE OF ERROR). ; ; ********** NOTE ********** ; THIS ROUTINE FETCHES COMMAND ; LINES FROM LOGICAL UNIT #9. ; THEREFORE, THE FOLLOWING TWO ; LINK OPTIONS SHOULD BE USED: ; UNITS=9 (AT LEAST) ; ASG=TI:9 ; IF THIS VERSION INTERFACES ; WITH GTLIN, THAN THE USER ; CHANGE THIS LOGICAL UNIT BY ; INITIALLY CALLING FCSILU: ; CALL FCSILU(LUN) ; WILL CHANGE ALL SUCCEEDING ; CALLS TO LUN. THIS MAY ; ONLY BE USED BEFORE ANY ; CALLS TO GTLIN OR FCSI. ; **************************** ; ; ; FCSI -- FETCH COMMAND STRING. ; -------------------------------- ; ; CALLING SEQUENCE: ; ; CALL FCSI(IPRM,NPRM,IER,NSW,NMO,NO,LENFO,FILEO,ISWO,ISWDO,ISWPO,ISWVO, ; 1 NMI,NI,LENFI,FILEI,ISWI,ISWDI,ISWPI,ISWVI) ; ; ALL ARGUMENTS ARE INTEGER*2 EXCEPT IPRM, FILEI AND FILEO WHICH ARE ; BYTE ASCII STRINGS (LENGTH MEASURED IN BYTES). ; (+) INDICATES VALUE PASSED TO FCSI. ALL OTHERS ARE RETURNED TO FCSI. ; SOME PARAMETERS MAY BE SPECIFIED AS NULL PARAMETERS. THERE MUST, ; HOWEVER, BE 20 ARGUMENTS TO THIS CALL. ; REQUIRED PARAMETERS: ; IPRM,NPRM,IER,NSW,NMO,NO,NMI,NI ; PARAMETERS WHICH MAY BE OMITTED IF NMO=0: ; LENFO,FILEO,ISWO,ISWDO,ISWPO,ISWVO ; PARAMETERS WHICH MAY BE OMITTED IF NMI=0: ; LENFI,FILEI,ISWI,ISWDO,ISWPO,ISWVO ; PARAMETERS WHICH MAY BE OMITTED IF NSW=0: ; ISWO,ISWDO,ISWPO,ISWVO,ISWI,ISWDI,ISWPI,ISWVI ; ; IPRM = PROMPT SEQUENCE FOR COMMAND LINE. SHOULD ALWAYS BEGIN ; WITH A CR (OCTAL 15) AND LF (OCTAL 12). GENERALLY ; THIS CONSISTS OF A CR, LF, THE NAME OF THE PROGRAM, ; A GREATER THAN SIGN (">"), AND A SPACE. ; IE. FOR A PROGRAM CALLED GENVEC: ; BYTE IPRM(10) ; DATA IPRM/"15,"12,1HG,1HE,1HN,1HV,1HE,1HC,1H>,1H / ; ; NPRM = LENGTH (IN BYTES) OF THE PROMTING STRING. ; ; IER = ERROR CODE RETURNED: ; 2 = EXCESS FILESPECS(*) ; THIS WILL NOT BE SET IF O/I SPECS EXIST WHEN ; NMO/I=0. ; 1 = EOF AT TOP COMMAND LEVEL ; 0 = NO ERROR(*) ; -1 = SYNTAX ERROR OR ILLEGAL SWITCH ; -2 = I/O ERROR OR BAD INDIRECT FILE SPEC. ; -3 = WILD CARD IN FILE SPEC(*) ; -4 = ERROR IN CALL. ; * = ALL FILESPECS PROCESSED. ; ; NSW = MAXIMUM NUMBER OF POSSIBLE SWITCHES ON ANY ONE FILESPEC(+). ; MUST BE BETWEEN ZERO(0) AND SIXTEEN(16). ; ; NMO/I = MAXIMUM NUMBER OF OUTPUT/INPUT FILESPECS(+). ; ; NO/I = ACTUAL NUMBER OF OUTPUT/INPUT FILESPECS. ; ; LENFO/I = (NMO/I) LENGTH OF EACH OUTPUT/INPUT FILESPEC. IF ZERO, ; ONLY SWITCHES WERE PRESENT. IF NEGATIVE, WAS NULL SPEC. ; ; FILEO/I = BYTE (40,NMO/I) CONTAINS FILESPECS. LAST CHARACTER IS ; FOLLOWED BY A NULL. SUITABLE FOR PASSING TO FORTRAN ; OPEN STATEMENT (IE. NAME=FILEI(1,2) ). ; ; ISWO/I = (NSW,NMO/I) SWITCHES ALLOWED ON EACH FILESPEC. TWO ; ASCII CHARACTERS. WHERE POSSIBLE, SHOULD ALWAYS BE ; FIRST TWO CHARACTERS OF AN ENGLISH WORD. ; ; ISWDO/I = (NSW,NMO/I) SWITCH DESCRIPTORS (+): ; BIT 2: 0 = NON-NEGATABLE SWITCH ; 1 = NEGATABLE SWITCH ; BIT 1-0:SWITCH VALUE TYPE: ; 0 = NO VALUE ALLOWED ON THIS SWITCH ; 1 = ASCII * 2 ; 2 = OCTAL ; 3 = DECIMAL ; ; ISWPO/I = (NSW,NMO/I) SWITCH PRESENCE CODE: ; -1 = SWITCH IS PRESENT AND NEGATED ; 0 = SWITCH IS NOT PRESENT ; 1 = SWITCH IS PRESENT. ; ; ISWVO/I = (NSW,NMO/I) SWITCH VALUE. IF NO SWITCH IS GIVEN, A -1 ; WILL APPEAR HERE. NOTE THAT THIS DOES NOT PRECLUDE ; THE POSSIBILITY OF HAVING A USER ENTER A -1 AS A NUMERIC ; SWITCH VALUE. ; ; THE COMMAND STRING INTERPRETED IS OF THE FORM: ; ; [OUTSPEC][/SWITCHES],...=[INSPEC][/SWITCHES]... ; WHERE /SWITCHES ARE OF THE FORM: ; /SW[ITCH][:VALUE] ; WHILE ONLY THE FIRST TWO LETTERS OF THE SWITCH ARE REQUIRED, IT ; IT STRONGLY RECOMMENDED THAT SWITCHES BE ENGLISH WORDS DESCRIBING ; THEIR MEANING. ALL OUTPUT SEPCIFICATIONS APPEAR ON THE LEFT ; SIDE OF THE EQUALS SIGN, AND ALL INPUT SPECIFICATIONS APPEAR ON ; THE RIGHT SIDE OF THE EQUALS SIGN. ; IF THE COMMAND LINE BEGINS WITH A SEMICOLON (;), THE LINE IS ; INTERPRETED AS A COMMENT, AND A NEW LINE IS READ IN. IF THE ; LINE BEGINS WITH AN AT SIGN (@), THE REMAINDER IS INTERPRETED ; AS THE FILENAME OF AN INDIRECT COMMAND FILE (DEFAULT EXTENSION ; IS CMD). UP TO THREE LEVELS OF NESTING ARE ALLOWED. NOTE THAT ; THE INITIAL CALL WILL ATTEMPT TO FETCH THE MCR/PDS COMMAND LINE. ; THEREAFTER, THE FIRST PROMPT WILL COME FROM THE TERMINAL (NOT ; THE CURRENT INDIRECT FILE OF PDS). ; ; ********** NOTE ************ ; IF ONLY INPUT FILESPECS ARE REQUIRED, LET THE ROUTINE PRETEND ; THAT OUTPUT FILESPECS ARE REQUIRED. SOME THOUGHT SHOULD BE GIVEN TO ; THE VALIDITY AND MEANING OF A NULL SPECIFICATION. GENERALLY, ; THERE ARE THREE ALTERNATIVES: ; 1) INDICATES NO FILE SHOULD BE USED(IE. FOR NO OUTPUT). ; 2) INDICATES THAT A DEFAULT FILE SHOULD BE USED. AS THE ; SYSTEM PROVIDES DEFAULT DEVICE AND UIC FOR EACH USER, ; DEFAULT FILENAMES SHOULD GENERALLY OMIT THIS INFORMATION. ; 3) INVALID. NO DEFAULT ALLOWED ON A REQUIRED FILE. ; ; ; FLUSHC -- FLUSH ALL INDIRECT COMMAND FILES. ; -------------------------------------------- ; ; CALLING SEQUENCE: ; CALL FLUSHC ; ; THIS SUBROUTINE FLUSHES ALL INDIRECT COMMAND FILES. ; .PAGE .SBTTL FCSI -- GCML AND CSI TABLES ; ; DEFINE CSI CONTROL BLOCK ; CSI$ ; CSIBLK: .BLKB C.SIZE ; ; SAVE ROOM FOR 16 SWITCHES IN SWITCH TABLE ; SWTAB: .REPT 16. CSI$SW XX,1 .ENDM CSI$ND ; ; SAVE ROOM FOR 16, ONE ENTRY SWITCH VALUE TABLES. ; VTAB: .REPT 16. CSI$SV OCTAL,VTAB,2 CSI$ND .ENDM ; ; SAVE ROOM FOR CML CONTROL BLOCK WITH 3 INDIRECT COMMAND FILES. ; .IF NDF GLINE GCBLK.: GCMLB$ 3 .ENDC .PAGE .SBTTL FCSI -- MAIN CODE ; ; SUBROUTINE FCSI ; FCSI:: CMPB #20.,(R5) ;INSURE CORRECT NUMBER OF PARAMETERS. BNE CALERR MOVB LUFCSI,GCBLK.+F.LUN ;SET LOGICAL UNIT IN GCBLK. TST @4(R5) ;SEE IF USER SUPPLIES PROMPT. BLE NOPR ;NO. GCML$ #GCBLK.,2(R5),@4(R5) ;YES, USE USER'S PROMT. BR GOTC NOPR: GCML$ #GCBLK. ;USE DEFAULT PROMPT. GOTC: BCC GOTCM ;SKIP IF NO ERROR. MOV #1,R0 ;ERROR, SO SET FOR EOF. CMPB GCBLK.+G.ERR,#GE.EOF ;WAS EOF? BEQ RETR0 ;YES. COM R0 ;NO, SO SET FOR I/O ERR(-2). BR RETR0 ; CALERR: MOV #-4,R0 ;SET FOR CALL ERROR. BR RETR0 SYNERR: MOV #-1,R0 ;SET FOR SYNTAX ERROR. RETR0: MOV R0,@6(R5) ;SAVE ERROR CODE. RETURN ; GOTCM: CSI$1 #CSIBLK,GCBLK.+G.CMLD+2,GCBLK.+G.CMLD ;SCAN COMMAND LINE. BCS SYNERR ;EXIT IF ERROR. MOVB CSIBLK+C.STAT,SSTAT ;SAVE STATUS BYTE MOV @10(R5),R0 ;GET NUMBER OF SWITCHES. MOV R0,NSW ;SEE IF LEGAL. BLT CALERR ;INVALID # OF SWITCHES. CMP #16.,R0 BLT CALERR ;TOO MANY SWITCHES. CLR WILFLG ;CLEAR WILDCARD FLAG. CLR EXCFLG ;CLEAR EXCESS FLAG. MOV R5,R4 ;SET FOR OUTPUT PARAMETERS. ADD #10,R4 CLR @4(R4) ;CLEAR NO MOV @2(R4),CCNT ;SAVE NMO BLT CALERR ;NMO MAY NOT BE NEG. BEQ INPUT ;IF ZERO, SKIP OUTPUT SECTION. MOVB #CS.OUT,R0 ;SET INTERP FOR OUTPUT SPECS. CALL INTERP ;PROCESS REQUEST FOR OUTPUT SPECS. BCS RETR0 ;RETURN IF ERROR. ; INPUT: ADD #20,R4 ;MOVE ON TO INPUT SPECS. CLR @4(R4) ;CLEAR NI MOV @2(R4),CCNT ;SAVE NMI. BLT CALERR BEQ DONE BITB SSTAT,#CS.EQU ;IS EQUAL SIGN PRESENT? BEQ DONE ;NO, SO SPLIT. MOVB #CS.INP,R0 ;SET INTERP FOR INPUT SPECS. CALL INTERP ;PROCESS REQUEST FOR INPUT SPECS. BCS RETR0 ;RETURN IF ERROR. DONE: CLR R0 ;SET FOR NO ERROR CODE. TST EXCFLG ;SEE IF EXCESS REPORTED. BEQ 10$ ;NO. MOV #2,R0 ;YES, SO SET FOR EXCESS ERROR. 10$: TST WILFLG ;SEE IF WILDCARD PRESENT. BEQ RETR0 ;NO, SO WE ARE DONE. MOV #-3,R0 ;YES, SO SET FOR WILDCARD ERROR. BR RETR0 ;DONE. ; ; THESE VARIABLES FOR INTERP MUST APPEAR IN ORDER SHOWN. ; LENF: .WORD 0 ;LENFO/I ADDRESS. FILE: .WORD 0 ;FILEO/I ADDRESS. ISW: .WORD 0,0 ;ISWO/I PASS 1,2 ADDRESS. ISWD: .WORD 0,0 ;ISWDO/I PASS 1,2 ADDRESS. ISWP: .WORD 0,0 ;ISWPO/I PASS 1,2 ADDRESS. ISWV: .WORD 0,0 ;ISWVO/I PASS 1,2 ADDRESS. ; ; INTERP PROCESSES EACH FILESPEC FOR FCSI. ; INTERP: MOVB R0,CSIBLK+C.TYPR ;SAVE OUTPUT/INPUT CODE. MOV 6(R4),LENF ;SAVE LENF ADDRESS. MOV 10(R4),FILE ;SAVE FILE ADDRESS. MOV 12(R4),ISW+2 ;SAVE ISW ADDRESS. MOV 14(R4),ISWD+2 ;SAVE ISWD ADDRESS. MOV 16(R4),ISWP+2 ;SAVE ISWP ADDRESS. MOV 20(R4),ISWV+2 ;SAVE ISWV ADDRESS. ; ; LOOP FOR EACH FILE. ; LOOPF: CLRB @FILE ;CLEAR FIRST BYTE OF FILEO/I. MOV #ISWV+2,R0 ;MOVE ISW?+2 TO ISW? MOV (R0),-(R0) MOV -(R0),-(R0) MOV -(R0),-(R0) MOV -(R0),-(R0) MOV NSW,SCNT ;SAVE SWITCH COUNTER. BEQ NOSWIT ;SKIP PASS 1 IF NSW=0. ; SET UP SWITCH AND VALUE TABLES FOR THIS FILESPEC. MOV #VTAB,R3 ;VALUE TABLE ADDRESS MOV #SWTAB,R2 ;SWITCH TABLE ADDRESS. MOV #1,KEY ;KEY BIT FOR SWITCH. CLR SWCNT ;CLEAR ACTUAL SWITCH COUNTER. ; ; LOOP FOR EACH SWITCH ; LOOPSC: MOV @ISW,(R2) ;SAVE ASCII SWITCH NAME. BEQ NSWT ;SKIP ALL THIS IF NONE SWITCH. MOV KEY,2(R2) ;SAVE KEY BIT. MOV @ISWD,R0 ;GET SWITCH DESCRIPTOR. CLR 6(R2) ;CLEAR VALUE ADDRESS AND NEG BIT. BIT #4,R0 ;IS SWITCH NEGATABLE? BEQ 10$ ;NO. INC 6(R2) ;YES, SO SET NEG BIT. 10$: BIC #177774,R0 ;GET LOW 2 BITS IF DESCRIPTOR. BEQ NOVAL ;SKIP IF NO VALUE ALLOWED. BIS R3,6(R2) ;SAVE VALUE ADDRESS. MOVB R0,(R3)+ ;SET VALUE TYPE. MOVB #2,(R3)+ ;SAVE LENGTH OF VALUE = 2. MOV ISWV,(R3)+ ;SAVE ADDRESS OF VALUE. CLR (R3)+ ;SET END OF VALUE TABLE. NOVAL: INC SWCNT ;INCREMENT SWITCH COUNT. ADD #10,R2 ;INCREMENT SWITCH TABLE POSITION. CLR (R2) ;SET END OF TABLE IN CASE THIS IS LAST. NSWT: ASL KEY ;SHIFT LEFT KEY BIT. MOV #-1,@ISWV ;INITIALIZE VALUE TO -1. CLR @ISWP ;CLEAR SWITCH PRESENCE CODE. MOV #2,R0 ;PREPARE TO UPDATE ISW ADDRS. ADD R0,ISW ;INCREMENT ISW ADDRESS. ADD R0,ISWD ADD R0,ISWP ADD R0,ISWV DEC SCNT ;LAST SWITCH? BGT LOOPSC ;NO. MOV SWCNT,R0 ;ANY SWITCHES ON THIS SPEC? BEQ NOSWIT ;NO, SO SET ZERO ADDRESS. MOV #SWTAB,R0 ;SET SWITCH TABLE ADDRESS. NOSWIT: MOV R0,CSIBLK+C.SWAD ;SAVE SWITCH TABLE ADDRESS. CSI$2 #CSIBLK ;GET FILESPEC. BCS ERRSYN ;FLY IF ERROR. MOV FILE,R3 ;PREPARE TO MOVE FILESPEC. MOV #39.,R0 ;ONLY ALLOW 39 CHARS. BITB #CS.DVF,CSIBLK+C.STAT ;DEVICE INFO PRESENT? BEQ NODVF ;NO. MOV CSIBLK+C.DEVD+2,R2 ;YES, SO MOVE TO USERS BUFFER. MOV CSIBLK+C.DEVD,R1 CALL MOVIT MOVB #':,(R3)+ ;INSERT COLON AFTER DEVICE SPEC. DEC R0 NODVF: BITB #CS.DIF,CSIBLK+C.STAT ;DIRECTORY INFO PRESENT? BEQ NODIF ;NO. MOV CSIBLK+C.DIRD+2,R2 ;YES, SO MOVE TO USER'S BUFFER. MOV CSIBLK+C.DIRD,R1 CALL MOVIT NODIF: BITB #CS.NMF,CSIBLK+C.STAT ;FILENAME INFO PRESENT? BEQ NONMF ;NO. MOV CSIBLK+C.FILD+2,R2 ;YES, SO MOVE TO USER'S BUFFER. MOV CSIBLK+C.FILD,R1 CALL MOVIT NONMF: CLRB (R3) ;CLEAR FINAL BYTE. SUB FILE,R3 ;GET FILENAME LENGTH. MOV R3,@LENF ;SAVE LENGTH OF FILESPEC. MOV CSIBLK+C.MKW1,R3 ;GET SWITCH INDICATORS. BNE ISSW TST @LENF ;IF NO SWITCHES AND NO FILESPEC... BNE ISSW COM @LENF ; ...SET LENGTH TO -1. ISSW: MOV CSIBLK+C.MKW2,R2 ;GET NEGATION INDICATORS. MOV #1,R0 ;SET KEY TO 1. MOV NSW,SCNT ;PREPARE TO GO THROUGH PASS 2. LOOPSR: BIT R0,R3 ;IS SWITCH SET? BEQ 10$ ;NO. INC @ISWP+2 ;YES, SO SET TO 1. BIT R0,R2 ;IS NEGATED? BNE 10$ ;NO. NEG @ISWP+2 ;YES, SO SET TO -1. 10$: ASL R0 ;SHIFT KEY LEFT. MOV #2,R1 ;PREPARE TO INCREMENT ISW ADDRS. ADD R1,ISW+2 ;INCREMENT ISW ADDRESS. ADD R1,ISWD+2 ADD R1,ISWP+2 ADD R1,ISWV+2 DEC SCNT ;WAS LAST SWITCH? BGT LOOPSR ;NO ADD #40.,FILE ;UPDATE FILE. ADD R1,LENF ;UPDATE LENF. BITB #CS.WLD,CSIBLK+C.STAT ;WAS WILDCARD IN SPEC? BEQ 20$ INC WILFLG ;YES, SO SET WILFLG. 20$: INC @4(R4) ;INCREMENT NO/I. BITB #CS.MOR,CSIBLK+C.STAT ;MORE SPECS? BEQ OKFIN ;NO. DEC CCNT ;MORE DESIRED? BLE 30$ ;NO. JMP LOOPF ;YES, SO GO GET'M. 30$: INC EXCFLG ;NO, SO SET EXCESS FLAG. OKFIN: CLC ;SET FOR NO ERROR. RETURN ; ERRSYN: MOV #-1,R0 ;SET FOR SYNTAX ERROR. SEC ;SET FOR ERROR. RETR: RETURN ;RETURN ; ; MOVIT MOVES BYTES INTO USERS BUFFER WHILE CHECKING FOR OVERFLOW. ; MOVIT: DEC R1 ;MOVE COUNT EXHAUSTED? BMI RETR ;YES, SO RETURN. DEC R0 ;BUFFER COUNT EXHAUSTED? BMI RETR ;YES, SO RETURN. MOVB (R2)+,(R3)+ ;MOVE BYTE AND TRY NEXT ONE. BR MOVIT .PAGE .SBTTL FCSILU -- MAIN CODE. FCSILU:: MOV @2(R5),LUFCSI RETURN .PAGE .SBTTL FLUSHC -- MAIN CODE. ; ; SUBROUTINE FLUSHC ; .IF NDF GLINE FLUSHC:: RCML$ #GCBLK RETURN .ENDC .PAGE .SBTTL FCSI -- VARIABLE STORAGE. ; WILFLG: .WORD 0 EXCFLG: .WORD 0 SCNT: .WORD 0 SWCNT: .WORD 0 CCNT: .WORD 0 KEY: .WORD 0 NSW: .WORD 0 SSTAT: .WORD 0 ; .END