;COMMAND LINE PARSER (PARSX.MAC) ; ; PAUL ELKINS 1-SEPT-84 ; ; LOS ALAMOS NATIONAL LAB. ; PO BOX 1663 MS-J957 ; LOS ALAMOS NM 87545 ; 505 667 3502 ; ; ; ;COPYRIGHT, 1984,THE REGENTS OF THE UNIVERSITY OF CALIFORNIA. ;THIS SOFTWARE WAS PRODUCED UNDER A U.S. GOVERNMENT CONTRACT ;(W-7405-ENG-36) BY THE LOS ALAMOS NATIONAL LABORATORY,WHICH ;IS OPERATED BY THE UNIVERSITY OF CALIFORNIA FOR THE U.S. ;DEPARTMENT OF ENERGY. THE U.S. GOVERNMENT IS LICENSED TO USE, ;REPRODUCE, AND DISTRIBUTE THIS SOFTWARE. PERMISSION IS GRANTED ;TO THE PUBLIC TO COPY AND USE THIS SOFTWARE WITHOUT CHARGE, ;PROVIDED THAT THIS NOTICE AND ANY STATEMENT OF AUTHORSHIP ARE ;REPRODUCED ON ALL COPIES. NEITHER THE GOVERNMENT NOR THE ;UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ;ANY LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE. ; ; ;CALLING SEQUENCE ; CALL PARSX(CMDLIN,ODSPT,IDSPT,IDS) ; CMDLIN=START OF COMMAND LINE BUFFER ; ODSPT=8 WORD INTEGER ARRAY(OUTPUT DSPT) ; IDSPT=8 WORD INTEGER ARRAY(INPUT DSPT) ; IDS=INTEGER STATUS WORD ; .TITLE PARSX .LIST MEB ;DELIMITER MACRO ; .MACRO DELIM,CHR,LA,MA,LN,MN,LAN,MAN .WORD CHR ;DELIMITER CHARACTER(S) .IF B LA .BYTE 0 .IFF .BYTE LA ;MINIMUM # OF ALPHA'S .ENDC .IF B MA .BYTE 0 .IFF .BYTE MA-LA ;MAXIMUM REMAINING .ENDC .IF B LN .BYTE 0 .IFF .BYTE LN ;MINIMUM # OF NUMERICS .ENDC .IF B MN .BYTE 0 .IFF .BYTE MN-LN ;MAXIMUM REMAINING .ENDC .IF B LAN .BYTE 0 .IFF .BYTE LAN ;MINIMUM # OF ALPHANUMERICS .ENDC .IF B MAN .BYTE 0 .IFF .BYTE MAN-LAN ;MAXIMUM REMAINING .ENDC .ENDM XX1=2 ;COMMAND LINE OFFSET XX2=4 ;OUTPUT DATA SET DESCR. TABLE OFFSET XX3=6 ;INPUT DATA SET DESCR. TABLE OFFSET XX4=10 ;STATUS OFFSET XDEV=0 ;DEVICE DSPT OFFSET XUIC=4 ;UIC DSPT OFFSET XNAM=10 ;FILE NAME DSPT XNOD=14 ;MODE NAME DSPT OFFSET PARSX:: MOV SP,SAVSP ;SAVE STACK POINTER MOV #IS.SUC,@XX4(R5) ;ASSUME SUCCESS MOV XX2(R5),R0 MOV XX3(R5),R1 MOV #10,R2 1$: CLR (R0)+ ;CLEAR IDSDP CLR (R1)+ ;CLEAR ODSDP SOB R2,1$ MOV XX1(R5),R0 ;CMD LINE CMPB 3(R0),#40 ;MUST BE SPACE BNE ERR ;ERROR MOV XX2(R5),-(SP) ;START WITH OUTPUT DSDP ADD #4,R0 ;POINT TO FIRST CHARACTER 3$: JSR PC,SCAN ;FIND DELIMITER CMP R3,NODX ;NODE ? BNE 5$ ;NO MOV (SP),R3 ;GET DSDP ADDRESS MOV R4,XNOD(R3) ;NODE LENGTH MOV R1,XNOD+2(R3) ;NODE ADDRESS JSR PC,SCAN ;FIND DELIMITER 5$: CMP R3,DEVX ;DEVICE ? BNE 10$ ;NO MOV (SP),R3 MOV R4,XDEV(R3) ;DEVICE LENGTH MOV R1,XDEV+2(R3) ;DEVICE ADDRESS JSR PC,SCAN 10$: CMP R3,LBRX ;LEFT BRACKET ? BNE 15$ ;NO SKIP UIC MOV R4,SAV1 ;SAVE UIC SIZE MOV R1,SAV2 ;SAVE UIC POINTER JSR PC,SCAN CMP R3,COMX ;COMMA ? BNE ERR ;NO ERROR ADD R4,SAV1 ;SAME UIC GROUP SIZE JSR PC,SCAN CMP R3,RBRX ;RIGHT BRACKET ? BNE ERR ;NO ERROR ADD SAV1,R4 MOV (SP),R3 MOV R4,XUIC(R3) ;UIC LENGTH MOV SAV2,XUIC+2(R3) ;UIC ADDRESS JSR PC,SCAN 15$: CMP R3,PERX ;PERIOD ? BNE 25$ ;NO MOV R4,SAV1 ;SAVE FILE NAME LENGTH MOV R1,SAV2 ;SAVE FILE NAME POINTER JSR PC,SCAN CMP R3,SEMX ;SEMICOLON ? BNE 20$ ;NO ADD R4,SAV1 ;UPDATE FILE NAME LENGTH JSR PC,SCAN CMP R3,EQUX ;EQUALS ? BEQ 18$ ;YES CMP R3,CRX ;CARRIAGE RETURN ? BNE ERR ;NO ERROR 18$: CMP LASTF,#2 ;VERSION MUST BE NUMERIC BNE ERR ADD SAV1,R4 MOV (SP),R3 MOV R4,XNAM(R3) ;FILE NAME LENGTH MOV SAV2,XNAM+2(R3) ;FILE NAME ADDRESS BR 25$ 20$: CMP R3,EQUX ;EQUAL SIGN ? BEQ 22$ ;YES CMP R3,CRX ;CARRIAGE RETURN ? BNE ERR ;NO ERROR 22$: ADD SAV1,R4 ;TOTAL FIELD SIZE MOV (SP),R3 MOV R4,XNAM(R3) ;FILE NAME LENGTH MOV SAV2,XNAM+2(R3) ;FILE NAME ADDRESS 25$: MOV XX3(R5),(SP) ;SWITCH TO INPUT DSDP CMP (R2),EQUX ;MUST BE EQUALS OR CR BEQ 3$ ;YES TRY AGAIN CMP (R2),CRX ;MUST BE CR CLC ;SET STATUS OK CODE BEQ EXIT ;YES EXIT ERR: MOV #IE.BAD,@XX4(R5) SEC ;SET ERROR CODE EXIT: MOV SAVSP,SP RTS PC ; ;SCAN ONE FIELD(R0=BYTE POINTER) ; ; R0,R2,R3,R4 ARE MODIFIED ; SCAN: MOV R0,R1 ;INIT START ADDRESS CLR LASTF ;INIT LAST FIELD FLAG 5$: JSR PC,ALPNUM ;SCAN FIELD BCS 10$ ;END OF FIELD INC R0 BR 5$ 10$: JSR PC,DELIM ;IS IT DELIMITER ? BCS ERR ;NO FATAL ERROR RTS PC ; ;R0=BYTE POINTER ;R1=STARTING BYTE POINTER ;R2=DELIMITER LIST ;R3=DELMINITER CHARACTER(S) ;R4=FIELD SIZE ; DELIM: MOV #DLTBL,R2 ;GET LIST START MOV R0,R4 CLR -(SP) ;RESERVE STACK MOVB (R0),(SP) ;GET BYTE CMPB (R0),1(R0) ;NODE ? BNE 5$ ;NO INC R4 ;BUMP POINTER MOVB 1(R0),1(SP) ;GET SECOND CHARACTER 5$: CMP (SP),(R2) ;MATCH ? BEQ 8$ ;YES ADD #LDLTBL,R2 ;NEXT ENTRY TST (R2) ;END OF LIST ? BNE 5$ ;TRY AGAIN BR 45$ ;ERROR ; ;CHECK FOR ALPHA ; 8$: TST (SP)+ ;CLEANUP STACK MOV R1,R0 ;START OF FIELD MOVB 2(R2),R3 ;MIN. BYTE COUNT BEQ 12$ ;MOVE SKIP 10$: JSR PC,ALPHA ;ALPHA ? BCS 45$ ;ERROR INC R0 ;NEXT CHARACTER SOB R3,10$ 12$: MOVB 3(R2),R3 ;MAX BYTE COUNT BEQ 18$ ;MOVE SKIP 15$: JSR PC,ALPHA ;ALPHA ? BCS 18$ ;NO DONE INC R0 ;NEXT CHARACTER SOB R3,15$ ; ;CHECK NUMERICS ; 18$: MOVB 4(R2),R3 ;MIN BYTE COUNT BEQ 22$ ;NONE SKIP 20$: JSR PC,NUM ;NUMERIC ? BCS 45$ ;NO ERROR INC R0 ;NEXT CHARACTER SOB R3,20$ 22$: MOVB 5(R2),R3 ;MAX BYTE COUNT BEQ 28$ ;NONE SKIP 25$: JSR PC,NUM ;NUMERIC ? BCS 28$ ;DONE INC R0 SOB R3,25$ ; ;CHECK ALPHANUMERICS ; 28$: MOVB 6(R2),R3 ;MIN BYTE COUNT BEQ 32$ ;NO SKIP 30$: JSR PC,ALPNUM ;ALPHANUMERIC ? BCS 45$ ;ERROR INC R0 ;NEXT CHARACTER SOB R3,30$ 32$: MOVB 7(R2),R3 ;MAX BYTE COUNT BEQ 38$ ;DONE 35$: JSR PC,ALPNUM ;ALPHANUMERIC ? BCS 38$ ;DONE INC R0 ;NEXT CHARACTER SOB R3,35$ 38$: JSR PC,ALPNUM ;MUST NOT BE ALPHANUMERIC BCC 45$ ;TOO MANY CHARACTERS MOV (R2),R3 ;GET CHARACTER(S) INC R4 ;POINT TO NEXT CHARACTER MOV R4,R0 SUB R1,R4 ;FIELD SIZE CMP R3,EQUX ;DON'T COUNT EQUALS BEQ 40$ CMP R3,CRX ;DON'T COUNT CR BNE 42$ 40$: DEC R4 ;CR/EQUALS 42$: CLC BR 50$ 45$: SEC 50$: RTS PC ; ALPNUM: JSR PC,NUM ;CHECK NUMBER BCC 5$ ;YES EXIT JSR PC,ALPHA ;ALPHA ? 5$: RTS PC ; ALPHA: CMPB (R0),#101 ;LT A ? BLT 5$ ;YES EXIT CMPB (R0),#132 ;LE Z ? BLE 10$ ;YES OK 5$: SEC ;NOT ALPHA BR 15$ 10$: CLC ;ALPHA CHARACTER BIS #1,LASTF ;SET ALPHA BIT 15$: RTS PC ; NUM: CMPB (R0),#60 ;LT ZERO ? BLT 5$ ;YES EXIT CMPB (R0),#71 ;LE 9 ? BLE 10$ ;YES NUMBER 5$: SEC ;NOT NUMBER BR 15$ 10$: CLC BIS #2,LASTF ;SET NUMERIC BIT 15$: RTS PC ; SAVSP: .WORD 0 SAV1: .WORD 0 SAV2: .WORD 0 LASTF: .WORD 0 ;DELIMITER TABLE ; DLTBL: NODX: DELIM "::,,,,,3,4 ;NODE DELIMITER DEVX: DELIM ':,2,2,0,2 ;DEVICE DELIMITER LBRX: DELIM '[ ;LEFT BRACKET(UIC) DELIMITER COMX: DELIM <',>,,,1,3 ;COMMA(UIC) DELIMITER RBRX: DELIM '],,,1,3 ;RIGHT BRACKET(UIC) DELIMITER PERX: DELIM '.,,,,,0,9. ;FILE NAME/TYPE DELIMITER SEMX: DELIM <';>,,,,,0,3 ;FILE TYPE/VERSION DELIMITER EQUX: DELIM '=,,,,,0,3 ;INPUT/OUTPUT DELIMITER CRX: DELIM 15,,,,,0,3 ;END OF COMMAND LINE LDLTBL=DEVX-NODX .END