; CSIFP.MAC -- USE CSI TO PARSE FILE NAME STRINGS ; WRITTEN DATE 10/22/77 ; REVI ; ; CALL: ; CALL CSIFP(CIV,IPT,CSIBLK,NER) ; WHERE: ; CIV IS INPUT STRING TO PARSE ; IT IS TERMINATED BY A BLANK,TAB,OR NULL ; IPT SUBSCRIPT INTO CIV UPPED TO STRING END ; CSIBLK STANDARD CSI CONTROL BLOCK ; NER 0 => OK ; 1 => ERROR DURING SYNTAX PARSE ; 2 => ERROR DURING SEMANTIC PARSE ; 3 => STRING > 33 CHARACTERS ; ; .NLIST TOC ;TBL OF CONTENTS NOT WANTED ; .TITLE CSIFP .SBTTL USE CSI TO PARSE FILE NAME STRINGS ;***DEBUG< .ENABL AMA ;NO PC-REL ADDRS ;***DEBUG> ; .MCALL SUBR,RTN .MCALL MINIT,PUSH,POP .MCALL CSI$,CSI$1,CSI$2 ; .GLOBL .CSI1,.CSI2 ;SUBRS CALLED ; MINIT ; HT =11 ;DEFINE HORIZONTAL TAB ; SUBR CSIFP,4 MOV (R5)+,R4 ;INPUT BUFFER ADDR MOV (R5)+,R2 ;IPT ADDR ADD (R2),R4 ;COMPUTE START ADDR DEC R4 ;REL 0 NOT 1 PUSH R4 ;SAVE FOR LATER PUSH (R5)+ ;SAVE CSI BLOCK ADDR MOV (R5),R5 ;GET NER ADDR CLR (R5) ;INIT TO 0 MOV #34.,R3 ;MAX # OF CHARS TO SCAN CSI20: MOV #NTRMTB,R0 ;# OF CHARS IN TABLE CSI30: CMPB TRMTB-1(R0),(R4) ;IS THIS TERMINATOR BEQ CSI40 ;YES SOB R0,CSI30 ;LOOP THROUGH TERMINATORS INC R4 ;LOOK AT NEXT CHAR INC (R2) ;INC IPT 30$: SOB R3,CSI20 ;GET NEXT CHAR BR ER30 ;STRING TOO LONG CSI40: POP ;GET CSIBLK AND BUFF ADDR SUB R1,R4 ;COMPUTE NC TO PARSE CSI$1 ,R1,R4 ;SYNTAX PARSE BCS ER10 CSI$2 ,OUTPUT ;SEMANTIC PARSE BCS ER20 RTN: RTN ER30: INC (R5) ER20: INC (R5) ER10: INC (R5) BR RTN ; TRMTB: .ASCII <33><15><0>'=!/ ' NTRMTB = .-TRMTB ;# OF TERM CHARS TO CHECK .EVEN CSI$ ;DEFINE CSI OFFSETS .EVEN ; ; DEFINE FLAGS FOR FORTRAN COMMON ; .PSECT CSIDEF,RW,D,OVR,GBL .BYTE 0,CS.EQU,0,CS.NMF,0,CS.DIF .BYTE 0,CS.DVF,0,CS.WLD,0,CS.MOR .WORD C.SIZE/2 .END