.TITLE CWDCSI - PARSE CWD COMMAND .IDENT /V01/ .ENABL LC ;+ ; WRITTEN BY: GARY L. MAXWELL ; 22-SEP-79 ; NATIONAL STRONG MOTION DATA CENTER ; U.S. GEOLOGICAL SURVEY ; MENLO PARK, CALIFORNIA ; ; CWDCSI ACCEPTS THE MCR COMMAND LINE FOR THE CWD/PWD TASKS ; AND PARSES IT USING THE TPARS TABLE PARSER. THE ROUTINE ; ENFORCES BOTH SYNTACTIC AND SEMANTIC RULES FOR THE CWD ; COMMAND LINE (SEE CWD MAIN MODULE FOR COMMAND SYNTAX). ; ; LOCAL SYMBOLS ;- CM.RSE = 1 ; MASK FOR CWD RESET COMMAND CM.NDV = 2 ; MASK FOR NO DEVICE SPEC IN COMMAND CM.NGP = 4 ; MASK FOR NO GROUP SPEC IN COMMAND CM.NMB = 10 ; MASK FOR NO MEMBER SPEC IN COMMAND CM.NUL = CM.NDV!CM.NGP!CM.NMB SPACE = <' > ; ASCII SPACE CHAR .MCALL ISTAT$,STATE$,TRAN$ .MCALL ERROR,PMSG .MCALL EXIT$S ;+ ; LOCAL DATA ;- .PSECT CMDFLG:: .WORD 0 ; MASK WORD FOR TPARS TRANSITIONS .NLIST BEX CHLPM: .ASCII <12>^CWD -- Change Working Directory Command:^<15><12> .ASCII ^(All arguments in brackets are optional)^<15><12><12> .ASCII <11>^>CWD [ddn:] [ggg] [,mmm]^<15><12><12> .ASCII ^Performs the following:^<15><12> .ASCII <11><11>^'ddn:' is assigned as device SY0:^<15><12> .ASCII <11><11>^[ggg,mmm] is set as the default UIC^<15><12><12> .ASCII ^(Any missing arguments remain at their current^ .ASCII ^ assignment)^<15><12><12><12> .ASCII <11>^>CWD [.:] [.] [,.]^<15><12><12> .ASCII ^Resets any unspecified argument back to its login setting.^ .ASCII <15><12>^(A specified argument will leave its current^ .ASCII ^ assignment unchanged)^ .BYTE <15>,<12>,<12>,<12> .ASCII <11>^>CWD^<15><12><12> .ASCII ^Resets SY0: and UIC to their login assignments.^<15><12> CHLPML = .-CHLPM PHLPM: .ASCII <12>^PWD -- Print Working Directory Command:^<15><12><12> .ASCII <11>^>PWD^<15><12><12> .ASCII ^Will print user's current SY0: assignment and default UIC,^ .BYTE <15>,<12> .ASCII ^free space information on SY0:, and checks that a^ .ASCII ^ User File Directory^<15><12> .ASCII ^exists on the volume.^<15><12> PHLPML = .-PHLPM .EVEN .LIST BEX .PAGE ;+ ; REQUIRED INPUTS: ; R4 MUST POINT TO BEGINNING OF CWD/PWD COMMAND ; R3 EQUALS THE LENGTH OF THE COMMAND LINE ; ; FOR PROPER FUNCTIONING, CWDCSI MUST BE CALLED WITH THE ; FOLLOWING GLOBAL LOCATIONS PRE-INITIALIZED: ; ; $UGRP: (BYTE) CURRENT DEFAULT GROUP SPEC ; $UMEM: (BYTE) CURRENT DEFAULT MEMBER SPEC ; $LGRP: (BYTE) LOGIN GROUP SPEC ; $LMEM: (BYTE) LOGIN MEMBER SPEC ; ; IF A SYNTAX ERROR IS DETECTED, CWDCSI PRINTS A DIAGNOSTIC ; MESSAGE AND EXITS TO MCR. ; ; OUTPUTS FROM CWDCSI: ; ; $FLAG: MASK WORD FOR ACTION TO BE TAKEN BY CWD ; $DNAM: ASCII NAME OF DEVICE FROM COMMAND LINE ; ('SY' IF NO DEVICE SPECIFIED) ; $DNUM: BINARY UNIT NUMBER FROM COMMAND (ZERO IF ; NO DEVICE SPECIFIED) ; $UGRP: BINARY GROUP TO BE USED IN 'SET /UIC' COMMAND ; $UMEM: BINARY MEMBER TO BE USED IN 'SET /UIC' COMMAND ;- .PAGE ;+ ; INITIALIZE AND CALL TABLE PARSER ;- CWDCSI:: MOV #<"SY>,$DNAM ; DEFAULT DEVICE CLR $DNUM ; UNIT #0 CLR $FLAG ; CLEAR CWD ACTION MASK CLR CMDFLG ; CLEAR PARSING MASK WORD CLR R1 ; HAVE TPARS IGNORE BLANKS MOV #CSTRT,R5 ; BEGINNING STATE TABLE MOV #CWDKTB,R2 ; START OF KEYWORD TABLE CALL .TPARS ; CALL PARSER BCS SYNERR ; SYNTAX ERROR ;+ ; PERFORM SEMANTIC ACTION (SET UP $FLAG MASK FOR CWD) ;- BIS #,$FLAG ; FREE SPACE / UFD SEARCH BIT #CW.PWD,$FLAG ; PWD COMMAND? BNE CSIRET ; YES, JUST EXIT BIS #CW.SET,$FLAG ; ALWAYS DO 'SET /UIC' MOV CMDFLG,R0 ; GET COMMAND MASK BIT #CM.RSE,R0 ; CWD RESET COMMAND? BNE 10$ ; YES, SKIP AHEAD BIT #CM.NDV,R0 ; USER SPECIFY A DEVICE? BEQ 100$ ; YES, SKIP AHEAD BIC #CW.FRE,$FLAG ; NO, DON'T SHOW FREE SPACE BR CSIRET ; AND RETURN 100$: BIS #CW.ASN,$FLAG ; ELSE SET UP 'ASN DDN:=SY0:' BR CSIRET ; AND EXIT 10$: BIS #CW.PWD,$FLAG ; ALWAYS DO A PWD FOR RESETS BIT #CM.NDV,R0 ; SAVE CURRENT SY0:? BNE 200$ ; NO, SKIP AHEAD BIC #CW.FRE,$FLAG ; YES, DON'T SHOW FREE SPACE BR 20$ ; GO CHECK DEVICE SPECS 200$: BIS #CW.RSE,$FLAG ; ELSE DO 'ASN =SY0:' 20$: BIT #CM.NGP,R0 ; SAVE CURRENT GROUP? BEQ 30$ ; YES, SKIP AHEAD MOVB $LGRP,$UGRP ; ELSE RESET TO LOGIN VALUE 30$: BIT #CM.NMB,R0 ; SAVE CURRENT MEMBER? BEQ CSIRET ; YES, GO RETURN MOVB $LMEM,$UMEM ; ELSE RESET TO LOGIN VALUE CSIRET: RETURN SYNERR: BIT #CW.PWD,$FLAG ; CWD OR PWD COMMAND? BNE PERR ; PWD ERROR ERROR < CWD -- Syntax error> PERR: ERROR < PWD -- Syntax error> .PAGE ;+ ; DEFINE PARSING TABLES ;- ISTAT$ CWDSTB,CWDKTB ;+ ; START PARSE OF COMMAND ;- STATE$ CSTRT TRAN$ "PWD",PSWCK,,CW.PWD,$FLAG TRAN$ "CWD" ;+ ; LOOK FOR POSSIBLE DEVICE SPEC (FRAGMENT = "CWD ") ;- STATE$ TRAN$ <'/>,CSWCK TRAN$ <'[>,CBRK,,CM.NDV,CMDFLG TRAN$ <'.>,CPER,,CM.RSE,CMDFLG TRAN$ <',>,CCMA,,,CMDFLG TRAN$ $EOS,$EXIT,,,CMDFLG TRAN$ $ALPHA,CDVA,DV1 TRAN$ $NUMBR,CGRP1,GGRP,CM.NDV,CMDFLG ;+ ; FRAGMENT = 'CWD D' ;- STATE$ CDVA TRAN$ $ALPHA,,DV2 STATE$ TRAN$ $NUMBR,CDVN,DV3 TRAN$ $LAMDA STATE$ CDVN TRAN$ <':> ;+ ; FRAGMENT = 'CWD DDNN:' ;- STATE$ TRAN$ <'[>,CBRK TRAN$ <',>,CCMA1,,CM.NGP,CMDFLG TRAN$ $EOS,$EXIT,,,CMDFLG TRAN$ $NUMBR,CGRP1,GGRP .PAGE ;+ ; FRAGMENT = 'CWD ,' ;- STATE$ CCMA TRAN$ <'.>,EXST,,CM.RSE,CMDFLG TRAN$ $EOS,$EXIT,,,CMDFLG TRAN$ $NUMBR,EXST,GMEM ;+ ; FRAGMENT = 'CWD DDNN:,' ;- STATE$ CCMA1 TRAN$ $EOS,$EXIT,,CM.NMB,CMDFLG TRAN$ $NUMBR,EXST,GMEM ;+ ; FRAGMENT = 'CWD DDNN:GGG' OR 'CWD GGG' ;- STATE$ CGRP1 TRAN$ !CGRP,EXST ;+ ; FRAGMENT = 'CWD .' ;- STATE$ CPER TRAN$ <':>,PDV TRAN$ $EOS,$EXIT,,,CMDFLG TRAN$ !PGRP,EXST,,CM.NDV,CMDFLG ;+ ; FRAGMENT = 'CWD .:' ;- STATE$ PDV TRAN$ <'[>,PBRK TRAN$ $EOS,$EXIT,,,CMDFLG TRAN$ !PUIC,EXST ;+ ; FRAGMENT = 'CWD .:[' ;- STATE$ PBRK TRAN$ !PUIC,CRBRK .PAGE ;+ ; FRAGMENT = 'CWD [' ;- STATE$ CBRK TRAN$ <']>,EXST,,,CMDFLG TRAN$ <'.>,CBP,,CM.RSE,CMDFLG TRAN$ <',>,CBC,,CM.NGP,CMDFLG TRAN$ !CUIC,CRBRK ;+ ; FRAGMENT = 'CWD [.' ;- STATE$ CBP TRAN$ !PGRP,CRBRK ;+ ; FRAGMENT = 'CWD [,' ;- STATE$ CBC TRAN$ <'.>,CRBRK,,CM.RSE,CMDFLG TRAN$ <']>,EXST,,,CMDFLG TRAN$ !CCOM ;+ ; EXPECT A CLOSING ']' ;- STATE$ CRBRK TRAN$ <']> ;+ ; END COMMAND LINE ;- STATE$ EXST TRAN$ $EOS,$EXIT .PAGE ;+ ; PARSE UIC SUBEXPRESSIONS ;- STATE$ CUIC TRAN$ <',>,CCOM,,CM.NGP,CMDFLG TRAN$ $NUMBR,CGRP,GGRP TRAN$ $LAMDA,$EXIT,,,CMDFLG STATE$ CGRP TRAN$ <',>,CCOM TRAN$ $LAMDA,$EXIT,,CM.NMB,CMDFLG STATE$ CCOM TRAN$ $NUMBR,$EXIT,GMEM TRAN$ $LAMDA,$EXIT,,CM.NMB,CMDFLG STATE$ PUIC TRAN$ <',>,PCOM,,CM.NGP,CMDFLG TRAN$ <'.>,PGRP TRAN$ $LAMDA,$EXIT,,,CMDFLG STATE$ PGRP TRAN$ <',>,PCOM TRAN$ $LAMDA,$EXIT,,CM.NMB,CMDFLG STATE$ PCOM TRAN$ <'.>,$EXIT TRAN$ $LAMDA,$EXIT,,CM.NMB,CMDFLG ;+ ; SWITCH PROCESSING ;- STATE$ PSWCK TRAN$ <'/>,CSWCK TRAN$ $EOS,$EXIT STATE$ CSWCK TRAN$ "HE",$EXIT,HLPCMD STATE$ ;+ ; END OF STATE/TRANSITION TABLES ;- .PAGE ;+ ; SEMANTIC CODE TO INTERPRET DEVICE AND UIC SPECS ;- DV1: MOVB .PCHAR,$DNAM ; STORE FIRST DEVICE CHAR RETURN DV2: MOVB .PCHAR,$DNAM+1 ; STORE SECOND CHAR RETURN DV3: MOV .PNUMB,$DNUM ; DEVICE NO. RETURN GGRP: TST .PNUMH ; CHECK HIGH ORDER NUMBER BNE UFAIL ; NON-ZERO: GROUP TOO HIGH TSTB .PNUMB+1 ; CHECK HIGH BYTE - LOW ORDER BNE UFAIL ; STILL TOO HIGH MOVB .PNUMB,$UGRP ; ELSE STORE GROUP BEQ UFAIL ; DON'T ALLOW GROUP '0' BR UEXIT ; GO EXIT GMEM: TST .PNUMH ; CHECK HIGH ORDER BNE UFAIL ; FAIL IF NON-ZERO TSTB .PNUMB+1 ; CHECK LOW ORDER HIGH BYTE BNE UFAIL ; STILL TOO HIGH MOVB .PNUMB,$UMEM ; ELSE ALL RIGHT BEQ UFAIL ; DON'T ALLOW MEMBER '0' BR UEXIT ; AND RETURN UFAIL: ADD #2,(SP) ; REJECT TRANSITION UEXIT: RETURN ; EXIT TO TPARS HLPCMD: BIT #CW.PWD,$FLAG ; 'PWD /HE'? BNE PHLP ; YES, SKIP AHEAD PMSG #CHLPM,#CHLPML,#SPACE BR TSKEX ; EXIT AFTER PRINTING MESSAGE PHLP: PMSG #PHLPM,#PHLPML,#SPACE ; PRINT PWD HELP TSKEX: EXIT$S ; EXIT PROGRAM .END