.TITLE INIT1 .IDENT /V2.0/ ; ;+ ;***** ; ; THIS MODULE PERFORMS THE INITIAL TASK SIZING FUNCTION OF THE ; "SRDINI" MODULE AS WELL AS PREFORMING PRELIMINARY MANIPULATIONS ; OF THE INPUT COMMAND TO ALLOW "CSI" TO PARSE IT CORRECTLY. ; ; THE BULK OF THE TASK THAT INCORPORATES THIS MODULE IS TAKEN FROM ; "SRD V5.0" SUBMITTED TO THE RSXSIG AT F'79 DECUS SYMPOSIUM. ; ; THIS SOFTWARE REVISION WAS UNDERTAKEN TO ALLOW SRD TO ACCEPT A NEW ; COMMAND FORMAT SIMILAR TO RT-11 V3B. THIS MODULE WAS DESIGNED TO BE ; INSTALLED UNDER THE NAMES "...DIR", "...DEL", AND "...PUR". ; THESE DIFFERENT TASK NAMES WILL CHANGE THE ENTRY POINTS IN THE ; INITIALIZATION PART OF THE TASK SUCH THAT DIFFERENT DEFAULT SWITCH ; SETTINGS MAY BE SPECIFIED. ; THIS MODULE WILL THEN PERFORM THE "DCL" TYPE COMMANDS FOR GETTING ; DIRECTORY INFORMATION, DELETING FILES, AND PURGING FILES WHILE ; EXTENDING A SIMPLE "PIP" BASED CCL COMMAND BY ALLOWING INCLUSION OF ; DATE SWITCHES, AND WILD CHARACTER AND WILD STRING SEARCHES. ; ; THIS VERSION OF INIT1 DETERMINES THE SIZE OF THE DIRECTORY BUFFER, ; FETCHES AN ENTIRE MCR COMMAND, FETCHES ANY ADDITIONAL INFORMATION ; NEEDED BY QIO READ-AFTER-PROMPT, AND DOES A PRELIMINARY MANIPULATION ; ON THE COMMAND TO ALLOW PARSING BY CSI. ; ; PAUL SORENSON ; PULMONARY RESEARCH ; S3, MAYO CLINIC ; ROCHESTER, MN 55904 ; ;***** ; ; UPDATE 8/80--PRS; ORIGINAL EDIT ; ; UPDATE 11/80--PRS; CORRECT USUAL BUGS THAT CROP UP; /OUTPUT SWITCH ; WAS NOT HANDLED CORRECTLY, SET LISTING FILE TO BE UNDER ; PROTECTION UIC RATHER THEN DEFAULT UIC (NO DIFFERENCE IF ; PRIVILEGED, BUT PUT NON-PRIVILEGED USER'S STUFF WHERE IT ; BELONGS...ON HIS ACCOUNT), ADD CHECK FOR MULTIPLE INPUT ; FILE SPECS, WHICH ARE NOT SUPPORTED AS YET. ; ; UPDATE 2/82 -- PRS; ALTER INITIAL COMMAND PARSE TO ALLOW WILD ; STRINGS/CHARACTERS IN UIC FIELD, E.G. [2??,*3*]. TRY ; TO STREAMLINE SOME OF THE CODE WITHOUT A MAJOR REWRITE ; ; UPDATE 3/82 -- PRS; USE GET-MULTIPLE-CHARACTERISTICS SUPPORT TO ; DETERMINE USER'S PRIVILEGE STATUS. STREAMLINE PRELIMINARY ; COMMAND PARSE...MAJOR REWRITE. ; ;***** ;- ; .MCALL DIR$,GTSK$S,GPRT$S,EXST$S,QIOW$S,WTSE$S .NLIST BEX ; ; LOCAL SYMBOLS, ENABLE DEBUGGING OF COMMAND PARSE ; ;DEBUG =0 ; ; LOCAL DATA ; .PSECT $IDATA,RW,D,LCL,CON,REL FLAGS: UFDFLG: .BYTE 0 ;FLAG SET WHEN IN UFD FIELD ASKFLG: .BYTE 0 ;FLAG AFTER PROMPT FOR MORE INFO MLTFSP: .WORD 0 ;FLAG SET WHEN HAVE MULTIPLE FILE SPECS IN COMMAND ; (MULTIPLE FILE SPECS CURRENTLY NOT SUPPORTED) ; POINTS TO END OF 1ST FILE SPEC .EVEN .PSECT $PDATA,RO,D,LCL,CON,REL .NLIST BEX .ENABL LC ASKMSG: .ASCII <15><12>/File ? / ;PROMPT FOR ADDITIONAL INFO LENGTH=.-ASKMSG ; ;DEFCMD: ; .ASCIZ /SY:/ ;DEFAULT COMMAND STRING FOR "DIRECTORY" ; ; CURRENTLY NOT USED .DSABL LC .EVEN .PSECT $CODE1,RO,I,LCL,CON,REL .INIT1:: ; *** THIS SECTION VERBATIM FROM SRDINI MOV $XX1,DIRBF$ ;FIGURE OUT LOWEST AVAILABLE LOCATION CMP DIRBF$,$XX2 BHI 44$ MOV $XX2,DIRBF$ 44$: CMP DIRBF$,$XX3 BHI 45$ MOV $XX3,DIRBF$ 45$: ADD #3,DIRBF$ ;ROUND UP TO NEXT 4-BYTE BOUNDARY BIC #3,DIRBF$ GTSK$S #PARBF$ ;++001 GET TOP OF TASK ; ALSO DEFINES PROTECTION UIC--SEE INIT2 MOV PARBF$+G.TSTS,R0 ;+001 CALC. LENGTH CMP PARBF$+G.TSSY,#1 ;1=M BNE 50$ ;SKIP OVER NEXT SECTION IF IN D OR IAS ; *** THIS SECTION FOR 11M ONLY *** GPRT$S ,#PARBF$ ;FIND SIZE OF PARTITION MOV PARBF$+2,R0 ;PICK UP SIZE OF PAR/100 (OCTAL) SWAB R0 ;THIS ROUTINE- ASRB R0 ;CONVERTS THAT SIZE- ROR R0 ;INTO SIZE OF PARTITION- ROR R0 ;IN BYTES ADD $DSW,R0 ;ADD IN BASE OF PARTITION ; *** END 11M SECTION *** 50$: MOV R0,DIRBE$ ;SAVE END OF DIRECTORY BUFFER ; ;***** ; ; FIND OUT IF USER IS PRIVILEGED--MAY BE USED TO DISABLE SOME FUNCTIONS ; MOST NOTABLY, ABILITY TO SET FILE EXPIRATION DATES. ; ;***** ; QIOW$S #SF.GMC,#TILUN,#TIEFN,,,,<#$TIPRV,#2> ; ;***** ; ; CLEAR OUT ANY OLD STUFF ; ;***** ; RESET: MOV #EX$SUC,EXSTAT ;SET EXIT STATUS=SUCCESS, ALTERED ON VARIOUS ;UNEXPECTED CASES (DIAG/FATAL ERRORS, ETC.) MOV #$TBLKU,R0 ;FETCH 1ST ADDRESS OF 7 DOUBLE PRECISION MOV #14.,R1 ; VARIABLES USED TO KEEP STATS ON DIRECTORY 5$: CLR (R0)+ ;CLEAR COUNTER SOB R1,5$ ;CONTINUE TILL DONE CLR PRMPT ;1ST ELEMENT OF PRMPT AND LINBUF USED AS STRING CLR LINBUF ;LENGTH SPEC. IN PROCESSING COMMAND-CLEAR THEM CLR SWMS1$ CLR SWMSK$ CLR OUBUF$ CLR LINSZ$ CLR NXUIC$ CLR AFVAL$ .IF DF ST$DAT ;INCLUDE IF SUPPORT SETTING FILE DATES CLR SWMS2$ ;CLEAR CSI SWITCH MASK WORD CLR SDBUF$ ;SHOW NO DATE DEFINED .ENDC ;ST$DAT CLR SEBUF$ CLR SRBUF$ CLR SVNUM$ MOV #-1,BEVAL$ MOV #"TI,LSTDFN+N.DVNM ;FORCE DEFAULT LISTING DEVICE AS TI: CALL DEFUFD ;DETERMINE RAD50 FOR DEFAULT GROUP/USER TSTB $PRIV ;CHECK USER'S PRIVILEGE STATUS BEQ GETCMD ;BR IF NOT PRIVILEGED BIS #SYSW,SWMSK$ ;SET SWITCH ALLOW WILD UFD'S TO LIST ; SYSTEM FILES GETCMD: DIR$ #MCRCMD ;FETCH MCR COMMAND LINE MOV $DSW,CMDSIZ ;STORE # BYTES READ IN BGT 2$ ;BRANCH IF COMMAND THERE FERR GCME ;ELSE, FATAL ERROR 2$: MOV #MCRCMD+G.MCRB,R0 ;FETCH START OF COMMAND CLR R1 ;SET $CAT5 ATTRIBUTE CALL $CAT5 ;PUT 1ST THREE CHARACTERS INTO RAD50 BCC 10$ ;BRANCH IF NO PROBLEMS FERR CS1E ;FATAL COMMAND SYNTAX ERROR 10$: MOV R1,CMDNAM ;STORE TASKNAME ; ;***** ; ; SORT OUT SWITCHES FROM FILE SPECIFICATIONS. FILE SPECS START AFTER ; FIRST SPACE IN COMMAND LINE. CURRENTLY DON'T SUPPORT ; MULTIPLE FILE SPECS, BUT RECOGNIZE "COMMA" (UNLESS IN ; A UFD FIELD) AS VALID FILESPEC DELIMITER. PUT ALL SWITCHES INTO ; "LINBUF" BUFFER AND ALL FILESPECS INTO "PRMPT" BUFFER ; KEEP R5 = 0 IF IN A SWITCH FIELD ; KEEP R5 >/< 0 IF IN FILE SPEC FIELD ; ;***** ; SORT: ;START MANIPULATING COMMAND MOV #LINBUF+2,R2 ;FETCH PLACE FOR SWITCHES MOV #PRMPT+2,R3 ;FETCH PLACE FOR FILE SPECS. CLR FLAGS ;CLEAR UFD SPEC AND PROMPT FLAGS CLR MLTFSP ;CLEAR MULTIPLE FILE SPEC FLAG CLR R5 ;CLEAR R5, NOT IN FILE SPEC MOV CMDSIZ,R1 ;FETCH COMMAND SIZE SUB #3,R1 ;ADJUST FOR 1ST 3 CHARACTERS BLE 52$ ;BRANCH IF NOTHING LEFT .IF DF DEBUG CALL TYPEIT ;SHOW ME COMMAND .ENDC ;DEBUG ; ;***** ; ; SKIP OVER TASK NAME = EVERYTHING UP TO 1ST "/" OR 1ST SPACE ; ;***** ; 5$: MOVB (R0)+,R4 ;FETCH CHARACTER CMPB R4,#'/ ;HIT A SWITCH ? BEQ 45$ ;BRANCH IF YES CMPB R4,#' ;HIT 1ST SPACE ? BEQ 33$ ;BRANCH IF YES SOB R1,5$ ;LOOK AGAIN BR 52$ ;BRANCH, DONE WITH COMMAND SORT ; ;***** ; ; MAIN SORT LOOP, FILESPECS SEPARATED BY COMMAS OR SPACES ; ;***** ; 15$: MOVB (R0)+,R4 ;FETCH NEXT CHARACTER CMPB R4,#'[ ;AT START OF UFD ? BNE 20$ ;BRANCH IF NO INCB UFDFLG ;YES, SET FLAG BR 40$ ; AND CONTINUE 20$: CMPB R4,#'] ;AT END OF UFD ? BNE 25$ ;BRANCH IF NO DECB UFDFLG ;YES, RESET FLAG BR 40$ ; AND CONTINUE 25$: TSTB UFDFLG ;IN A UFD FIELD ? BNE 40$ ;BRANCH IF YES, SKIP "," AND " " CHECK 30$: CMPB R4,#', ;HIT A COMMA ? BEQ 33$ ;BRANCH IF YES CMPB R4,#' ;HIT A SPACE ? BNE 35$ ;BRANCH IF NO MOVB #',,R4 ;FORCE FILE SPEC DELIMITER TO "," 33$: MOV #1,R5 ;FLAG ENTERING FILE SPEC FIELD CMP #PRMPT+2,R3 ;COPIED ANYTHING TO FILE SPEC BUFFER ? BEQ 50$ ;NO, DON'T INCLUDE DELIMITER TST MLTFSP ;ALREADY SET MULTIPLE FILE SPEC FLAG ? BNE 42$ ;BRANCH IF YES DIAG MLTFIL ;NO, ISSUE DIAGNOSTIC MESSAGE MOV R3,MLTFSP ;SAVE POINTER TO END OF 1ST FILE SPEC BR 42$ ;COPY FILE SPEC + DELIMITER 35$: TST R5 ;IN A FILE SPEC FIELD ? BEQ 45$ ;BRANCH IF NO 37$: CMPB R4,#'/ ;HIT A SWITCH ? BNE 42$ ;BRANCH IF NO CLR R5 ;YES, CLEAR FLAG - OUT OF FILE SPEC FIELD BR 45$ 40$: TST R5 ;IN A FILE SPEC FIELD ? BEQ 45$ ;BRANCH IF NO 42$: MOVB R4,(R3)+ ;COPY CHARACTER TO FILE SPEC BUFFER BR 50$ 45$: MOVB R4,(R2)+ ;COPY CHARACTER TO SWITCH BUFFER 50$: SOB R1,15$ ;LOOP TIL DONE ; ;***** ; ; PRELIMINARY COMMAND SORT DONE, FIND OUT LENGTHS OF ; COMMAND COMPONENTS. IF NECESSARY, DETERMINE DEFAULT COMMAND, OR FETCH ; REQUIRED COMMAND LINE. IF UFDFLG >/< 0, UFD DELIMITERS MISMATCHED. ; ;***** ; 52$: TSTB UFDFLG ;CHECK UFD FIELD FLAG BEQ 53$ ;BRANCH IF 0, CONTINUE FERR CS1E ;FATAL SYNTAX ERROR, UNMATCHED [] 53$: CMP R3,#PRMPT+2 ;ANY FILE SPEC FOUND ? BNE 70$ ;BRANCH IF YES CMP CMDNAM,#DI$CMD ;DOING A "DIRECTORY" BEQ 60$ ;BRANCH IF YES, USE DEFAULT COMMAND ; 55$: ; FOR "DEL" AND "PUR" -- TSTB ASKFLG ;ALREADY PROMPTED ONCE ? BNE 59$ ;BRANCH IF YES MOVB #1,ASKFLG ;NO, SET FLAG MOV #1,R5 ;ASSUME GOING TO FETCH FILESPEC STRING CALL ASK ;PROMPT FOR NECESSARY INFO BCS 58$ ;BRANCH ON ERROR TST R1 ;CHECK # BYTES READ BNE 15$ ;NON-ZERO, PROCESS INPUT STRING 58$: JMP EXIT ;ELSE, EXIT WITH STATUS 59$: FERR NOFILE ;"DEL" AND "PUR" REQUIRE FILE SPEC ; 60$: ; FOR "DIR" -- .IF DF DEFCMD MOV #DEFCMD,R0 ;FETCH DEFAULT COMMAND STRING 65$: MOVB (R0)+,(R3)+ ;COPY STRING (IN ASCIZ) BNE 65$ .ENDC ;DEFCMD 70$: ; .IF DF DEBUG MOV #PRMPT+2,R0 ;SHOW ME ALL FILE SPECS MOV R3,R1 SUB R0,R1 BEQ 71$ CALL TYPEIT 71$: .ENDC ;DEBUG ; TST MLTFSP ;SEE MORE THAN 1 FILESPEC ? BEQ 75$ ;BRANCH IF NO MOV MLTFSP,R3 ;YES, RESTORE POINTER TO END OF 1ST FILE SPEC 75$: CMPB -1(R3),#'; ;ALREADY HAVE ";" TERMINATOR ? BEQ 77$ ;BRANCH IF YES MOVB #';,(R3)+ ;NO, FORCE ';' AT END OF STRING 77$: SUB #PRMPT+2,R3 ;DETERMINE LENGTH OF FILE SPEC MOV R3,PRMPT ; AND SAVE IT SUB #LINBUF+2,R2 ;DETERMINE LENGTH OF SWITCHES MOV R2,LINBUF ; AND SAVE IT ; .IF DF DEBUG MOV #PRMPT,R0 ;FETCH ADDRESS OF STRING MOV (R0)+,R1 ;FETCH LENGTH OF STRING BEQ 100$ CALL TYPEIT ;SHOW ME COMMAND 100$: MOV #LINBUF,R0 ;FETCH ADDRESS OF STRING MOV (R0)+,R1 ;FETCH LENGTH OF STRING BEQ 101$ CALL TYPEIT ;SHOW ME COMMAND 101$: .ENDC ;DEBUG ; ;***** ; ; NOW TIME TO REPACK COMMAND INTO MCR BUFFER. ; 2 MAJOR PROBLEMS USING CSI: ; 1) WON'T ALLOW WILD CHARACTERS IN FILE NAME/TYPE OR ; IN UFD'S ; 2) WON'T HANDLE THE SWITCH : /OUTPUT:DEV:[M,N]FILESPEC.EXT;V ; SO, HAVE TO DO SOME JUGGLING OF COMMAND TO PULL OUT WILD UFD'S, ; ANY FILE NAME/TYPE, AND THE "/OU" SWITCH. ALSO, PARSE VERSION ; #'S. ; ;***** ; REPCK1: MOV #PRMPT,R0 ;FETCH ADDRESS OF FILE SPEC STRING MOV (R0)+,R1 ;FETCH LENGTH, ALWAYS SOMETHING HERE MOV #MCRCMD+G.MCRB,R2 ;FETCH START OF MCR BUFFER MOVB #'=,(R2)+ ;SHOW ANY DEVICE/UFD AS "INPUT" TO CSI 10$: MOVB #':,R3 ;TRY TO FIND DEVICE SPEC CALL SCAN BCS 20$ ;BRANCH IF NO DEVICE FIELD 15$: MOVB (R0)+,(R2)+ ;COPY OVER DEVICE SPEC DEC R1 ;ADJUST # BYTES LEFT CMP R0,R3 ;CHECK IF DONE BLOS 15$ ;BRANCH IF NO 20$: CMPB (R0),#'[ ;AT A UFD FIELD ? BNE 30$ ;BRANCH IF NO CALL PRSUFD ;PARSE OUT UFD ; ;***** ; ; TIME TO HANDLE FILE NAME/TYP FIELD, ALWAYS TERMINATED BY ";". ; ;***** ; 30$: MOV #SEBUF$,R3 ;FETCH PLACE TO PUT FILE SPEC 32$: MOVB (R0)+,R4 ;FETCH NEXT CHARACTER MOVB R4,(R3)+ ;MOVE IT OVER CMPB R4,#'; ;WAS IT ";" TERMINATOR ? BEQ 35$ ;BRANCH IF YES SOB R1,32$ ;NO, LOOK AGAIN 35$: CMP R3,#SEBUF$+1 ;COPY MORE THAN JUST ";" ? BEQ 38$ ;BRANCH IF NO BIS #SESW,SWMS1$ ;FLAG SELECTIVE LISTING DEC R1 ;ADJUST BYTE COUNT BGT 40$ ;BRANCH IF STILL SOMETHING LEFT CMP CMDNAM,#DE$CMD ;DOING "DEL" ? BNE 49$ ;BRANCH IF NO, SELECT NEWEST VER. (0) FERR NOVER ;"DEL" REQUIRES EXPLICIT VERSION 38$: CMP CMDNAM,#DI$CMD ;DOING "DIR" ? BEQ 50$ ;BRANCH IF YES, SELECT EVERYTHING FERR NOFILE ;"DEL" AND "PUR" REQUIRE EXPLICIT ; FILE SPEC ; ;***** ; ; ANYTHING LEFT IN "PRMPT" BUFFER MUST BE VERSION # (# OR "*") ; TERMINATED BY ";" ; ;***** ; 40$: MOVB (R0),R3 ;FETCH CHARACTER CMPB R3,#'* ;VERSION WILD ? BEQ 50$ ;BRANCH IF YES, SELECT ALL VERSIONS CMPB R3,#'- ;NEGATIVE VERSION # ? BNE 46$ ;BRANCH IF NO MOV #-1,SVNUM$ ;YES, SELECT OLDEST VER. (-1) BR 49$ 46$: MOV R2,R3 ;SAVE CURRENT POINTER CALL $COTB ;CONVERT STRING TO BINARY CMPB R2,#'; ;";" TERMINATED CONVERSION ? BEQ 47$ ;BRANCH IF YES, VALID # FERR CS1E ;ELSE, SYNTAX ERROR 47$: MOV R3,R2 ;RECOVER POINTER MOV R1,SVNUM$ ;SAVE DESIRED VERSION # 49$: BIS #SVSW,SWMS1$ ;FLAG SELECTED VERSION # 50$: ; ;***** ; ; NOW MOVE SWITCHES TO COMMAND LINE, LOOK FOR "/OU" ; ;***** ; REPCK2: MOV #LINBUF,R0 ;FETCH ADDRESS OF STRING MOV (R0)+,R1 ;FETCH LENGTH OF STRING BEQ 25$ ;BRANCH IF NOTHING THERE 20$: MOVB (R0)+,R3 ;FETCH CHARACTER CMPB R3,#'/ ;AT START OF SWITCH ? BNE 23$ ;BR IF NO CALL OUTSW ;IF YES, CHECK FOR "/OUTPUT:" SWITCH BCC 24$ ;BRANCH IF FOUND 23$: MOVB R3,(R2)+ ;ELSE, MOVE CHARACTER 24$: SOB R1,20$ ;LOOP TIL DONE 25$: CLR LINBUF ;SHOW NOTHING HERE ANYMORE CLR PRMPT ;HERE TOO MOV #MCRCMD+G.MCRB,R0 ;FETCH START ADDRESS OF NEW COMMAND MOV R0,CMDADR ;SAVE IT CLRB (R2) ;SET A NULL FOR NO PARTICULARLY GOOD ; REASON SUB R0,R2 ;FIND OUT NEW LENGTH MOV R2,CMDSIZ ;SAVE IT .IF DF DEBUG MOV CMDSIZ,R1 MOV CMDADR,R0 CALL TYPEIT ;SHOW ME THE COMMAND TST NXUIC$ ;ANY WILD UFD ? BEQ 30$ MOV #$GRPS,R0 ;SHOW ME WILD GROUP AND USER STRINGS MOV #4,R1 CALL TYPEIT MOV #$USRS,R0 MOV #4,R1 CALL TYPEIT 30$: BIT #SESW,SWMS1$ ;ANY FILE SPEC SELECTED ? BEQ 35$ MOV #SEBUF$,R0 ;SHOW ME FILE SELECTION MOV #20.,R1 CALL TYPEIT 35$: BIT #OUTFSW,SWMSK$ ;ANY OUTPUT FILE SPEC ? BEQ 40$ MOV #OUBUF$,R0 ;SHOW ME OUTPUT FILE SPEC MOV (R0)+,R1 BEQ 40$ CALL TYPEIT 40$: .ENDC ;DEBUG CONTIN: ; *** ; *** CALL .INIT2 ;PROCEED TO INIT2 FOR MORE ;INITIALIZATION--DEPENDING ON TASK SIZE ;MAY WANT TO MOVE THIS CALL OUT TO ;DIRROT TO DROP OVERLAY SEGMENT LENGTH RETURN ;ALL DONE ; ;***** ; ; EXIT CALL--ENTRY AT THIS POINT INDICATES SOMETHING FUNNY IN RESPONSE ; TO "FILES ?" REQUEST FROM ROUTINE ASK, OR FAILED TO PULL OFF A RAD50 ; CONVERSION ON THE TASK NAME SECTION OF THE MCR COMMAND (HOW COULD ; THAT HAPPEN ?). ; ;***** ; EXIT: EXST$S EXSTAT ;GET OUT OF TASK WITH STATUS WORD .PAGE ; ;***** ; ; LOCAL SUBROUTINE SECTION ; ;***** ; ;***** ; ; SUBROUTINE OUTSW--MOVE ANY OUTPUT FILE SPECIFIER FROM A "/OUTPUT:" ; SWITCH INTO "OUBUF$". VALID FORMS ARE: "/OU", "/OU:","/OU:xxxxx" ; ;***** ; OUTSW: CMP R1,#3 ;NEED AT LEAST 3 CHARACTERS FOR "/OU" BLT 21$ ;BRANCH IF NOT ENOUGH MOV R0,-(SP) ;SAVE POINTER CMPB (R0)+,#'O ;TO GET HERE ALREADY HAVE "/", CHECK FOR "O" BNE 20$ ;BR IF NOT "O" CMPB (R0)+,#'U ;CHECK FOR "U" BNE 20$ ;BR IF NOT "U" TST (SP)+ ;DESTROY POINTER CMP CMDNAM,#DI$CMD ;DOING DIRECTORY ? BEQ 3$ ;BRANCH IF YES FERR CS2I ;NO, INVALID SWITCH FOR "DEL" AND "PUR" 3$: BIS #OUTFSW,SWMSK$ ;FLAG OUTPUT SWITCH SEEN SUB #3,R1 ;ADJUST # BYTES LEFT BLE 18$ ;BRANCH IF DONE 5$: CMPB (R0),#'/ ;AT NEXT SWITCH ? BEQ 18$ ;BRANCH IF YES CMPB (R0)+,#': ;AT ":" DELIMITER ? BEQ 10$ ;BRANCH IF YES SOB R1,5$ ;LOOP TIL DONE BR 18$ 10$: DEC R1 ;ADJUST COMMAND LENGTH BLE 18$ ;BR IF ":" LAST THING IN COMMAND MOV #OUBUF$+2,R3 ;HAVE OUTPUT SPEC, PUT IT INTO OUBUF$ 13$: CMPB (R0),#'/ ;AT NEXT SWITCH ? BEQ 15$ ;BRANCH IF YES MOVB (R0)+,(R3)+ ;NO, COPY CHARACTER SOB R1,13$ ;LOOP TIL DONE 15$: SUB #OUBUF$+2,R3 ;COMPUTE LENGTH OF FILE SPEC MOV R3,OUBUF$ ;AND STORE IT 18$: INC R1 ;R1 WILL BE DECREMENTED WHEN RETURN CLC ;FLAG SUCCESS RETURN 20$: MOV (SP)+,R0 ;RESTORE POINTER 21$: SEC ;FLAG FAILURE RETURN ; ;***** ; ; SUBROUTINE ASK- USES QIO READ AFTER PROMPT REQUEST FOR RETRIEVING ; ADDITIONAL COMMAND INFORMATION. RETURN TO CALLER WITH R0= ; START OF COMMAND AND R1= LENGTH OF COMMAND. COMMAND PLACED INTO ; MCR BUFFER. ; ;***** ; ASK: MOV #MCRCMD+G.MCRB,R0 ;FETCH BUFFER FOR INPUT QIOW$S #IO.RPR,#TILUN,#TIEFN,,#IOSB$,, TSTB IOSB$ ;CHECK FOR SUCCESS BLE 5$ ;NO, GET OUT CMP #IS.CR,IOSB$ ;WAS RETURN THE QIO TERMINATOR ? BNE 5$ ;NO, DON'T ALLOW OTHER TERMINATORS MOV IOSB$+2,R1 ;YES, FETCH # BYTES READ IN BGT 10$ ;IF STUFF THERE, OKAY; OTHERWISE- 5$: MOV #EX$WAR,EXSTAT ;SHOW PROBLEM TO INTERESTED PARTY AS A ;WARNING SEC ;SET CARRY BIT ON ERROR RETURN 10$: CLC ;CLEAR CARRY BIT ON SUCCESS RETURN ; ;***** ; ; SUBROUTINE SCAN--GIVEN A CHARACTER TO MATCH IN R3, LOOK FOR MATCH IN ; STRING POINTED TO BY R0, WITH R1 CHARACTERS. IF FIND MATCH, RETURN ; CARRY BIT CLEAR AND R3 = ADDRESS OF MATCHING CHARACTER. ; IF NO MATCH FOUND, SET CARRY BIT. SCAN TERMINATED BY EITHER 1) ; FINDING DESIRED CHARACTER, 2) HITTING END OF STRING , OR 3) HITTING ; "/" OR ",". ; ; REGISTERS R4, R5 ASSUMED FREE FOR USE ; ;***** ; SCAN: MOV R0,R4 ;COPY CURRENT POINTER MOV R1,R5 ;COPY CURRENT STRING LENGTH 10$: CMPB (R4),R3 ;HIT DESIRED CHARACTER ? BEQ 20$ ;BRANCH IF YES CMPB (R4),#'/ ;HIT "/" ? BEQ 15$ ;BRANCH IF YES CMPB (R4)+,#', ;HIT "," ? BEQ 15$ ;BRANCH IF YES SOB R5,10$ ;CONTINUE TO END OF STRING 15$: SEC ;SHOW FAILURE RETURN ; AND EXIT 20$: MOV R4,R3 ;RETURN POINTER TO DESIRED CHARACTER IN R3 CLC ;SHOW SUCCESS RETURN ; AND EXIT ; ;***** ; ; SUBROUTINE PRSUFD-PARSES OUT UFD FIELD. IF WILD CHARACTER/STRING ; FOUND IN UFD, SETS UP FOR THE WILD UFD SEARCH. IF NO WILD CHARACTERS ; SEEN IN EITHER GROUP OR MEMBER #'S, UFD FIELD IS PLACED IN THE COMMAND ; LINE BEING BUILT SO CAN OPEN CORRECT UFD LETTING FCS LOOK THROUGH MFD. ; FOR WILD UFD SEARCHES, GROUP/USER STRING MUST TERMINATE IN ";" TO ; USE THE FILE NAME MATCHING ROUTINE "SRDTST". IF NO UFD FIELD IS ; PRESENT, THE TASKS DEFAULT UIC WILL BE "PARSED" WHICH SIMPLY MEANS ; PLACING RAD50 GROUP/USER #'S IN WCGRP$/WCUSR$ SO CAN FILL IN ; UFD FIELD IN DIRECTORY HEADER LINE OF LISTING. ; ; REGISTER USAGE: ; R0 - POINTS TO CHARACTER IN MASTER STRING BEING PARSED ; R1 - # CHARACTERS LEFT TO PROCESS IN R0 STRING ; R2 - POINTS TO NEXT AVAILABLE SPOT IN COMMAND LINE BEING BUILT ; R3,R4,R5 - USED, NOT RESTORED ; ;***** ; PRSUFD: MOV R0,-(SP) ;SAVE SOME REGISTERS MOV R1,-(SP) MOV R2,-(SP) INC R0 ;STEP R0 OVER "[" DEC R1 ;ADJUST # BYTES LEFT BLE 29$ ;BRANCH IF NOTHING LEFT, ERROR MOVB #',,R3 ;LOOK FOR "," CALL SCAN BCS 29$ ;BRANCH ON FAILURE, SYNTAX ERROR MOV #$GRPS,R2 ;SETUP TO MOVE GROUP # STRING CALL 20$ ;MOVE STRING MOVB #'],R3 ;LOOK FOR "]" CALL SCAN BCS 29$ ;BRANCH ON ERROR MOV #$USRS,R2 ;SETUP TO MOVE USER # STRING CALL 20$ ;MOVE STRING BR 30$ ;BRANCH TO CONTINUE 20$: SUB R0,R3 ;DETERMINE # CHARACTERS TO DELIMITER CMP R3,#3 ;WITHIN 3 ? BGT 29$ ;BRANCH IF NO, SYNTAX ERROR 23$: MOVB (R0)+,(R2)+ ;COPY STRING DEC R1 ;KEEP R1 UP TO DATE SOB R3,23$ ;CONTINUE UP TO DELIMITER MOVB #';,(R2) ;MOVE TERMINATOR INTO STRING INC R0 ;STEP POINTER OVER DELIMITER DEC R1 ;ADJUST # BYTES LEFT BLE 29$ ;BRANCH IF NO MORE, ERROR RETURN ; ELSE, RETURN 29$: FERR CS1E ;FATAL SYNTAX ERROR IN UFD FIELD ; ; SCAN GROUP/USER STRINGS FOR WILD CHARACTERS. IF FOUND, SET "NXUIC$" ; TO 1. IF ONE STRING IS WILD AND OTHER NOT, SAVE THE RAD50 EQUIVALENT ; OF NON-WILD #. ; 30$: MOV #WCGRP$,R3 ;FETCH ADDRESS FOR RAD50 GROUP CODE CALL 100$ ;SCAN FOR WILD CHARACTERS MOV #WCUSR$,R3 ;FETCH ADDRESS FOR RAD50 USER CODE CALL 100$ ;SCAN FOR WILD CHARACTERS MOV (SP)+,R2 ;RECOVER POINTER INTO COMMAND BEING BUILT TST (SP)+ ;POP OLD LENGTH MOV (SP)+,R3 ;POP ORIGINAL POINTER (R0) INTO R3 TST NXUIC$ ;DOING WILD CARD UFD ? BNE 50$ ;BRANCH IF YES, LEAVE UFD FIELD OUT OF ; NEW COMMAND LINE MOV R0,R4 ;NO WILD UFD, COPY UFD FIELD TO NEW ; COMMAND LINE...COPY CURRENT POINTER SUB R3,R4 ;SUB ORIGINAL POINTER FOR # CHARS 45$: MOVB (R3)+,(R2)+ ;COPY UFD FIELD TO NEW COMMAND LINE SOB R4,45$ ;TIL DONE 50$: RETURN ;RETURN TO MAINLINE CODE ; ; SUBROUTINE TO SCAN UFD STRING, WILD CHARACTERS ARE: %,?, OR * ; 100$: MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,R0 ;COPY POINTER TO WORD PRECEEDING STRING MOV #"00,(R0)+ ;FORCE IT TO 00 FOR RAD50 CONVERSION CMPB #';,(R0) ;HIT TERMINATOR IN STRING ? BEQ 115$ ;BRANCH IF YES, SYNTAX ERROR 110$: CMPB #'?,(R0) ;WILD ? BEQ 120$ ;BRANCH IF YES CMPB #'*,(R0) BEQ 120$ CMPB #'%,(R0) BEQ 120$ CMPB #';,(R0)+ ;HIT TERMINATOR ? BNE 110$ ;BRANCH IF NO SUB #4,R0 ;RESET POINTER TO START OF 3 CHAR STRING CLR R1 ;DON'T ALLOW "." CALL $CAT5 ;CONVERT TO RAD50 BCC 130$ ;BRANCH IF OKAY 115$: FERR CS1E ;FATAL SYNTAX ERROR 120$: MOV #1,NXUIC$ ;SIGNAL WILD UFD FIELD FOUND CLR R1 ;SET RAD50 CODE # TO 0 130$: MOV R1,(R3) ;SAVE RAD50 CODE # MOV (SP)+,R2 ;RECOVER REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 RETURN ;ALL DONE, RETURN TO PRSUFD ; ;***** ; ; DEFUFD; LOCAL SUBROUTINE TO FILL IN DEFAULT GROUP/USER RAD50 CODE #'S ; ; REGSITER USAGE: ; R0-R4 USED, NEITHER SAVED NOR RESTORED ; ;***** ; DEFUFD: MOV #HDBUF$,R2 ;FETCH BUFFER FOR ASCII UIC MOV PARBF$+G.TSPC,R3 ;FETCH BINARY UIC MOV #3,R4 ;INCLUDE LEADING 0'S, SUPPRESS ; SEPARATORS MOV R2,R0 ;COPY CURRENT SPOT IN BUFFER CALL .PPASC ;CONVERT UIC CLR R1 ;DON'T ALLOW "." CALL $CAT5 ;CONVERT 1ST 3 CHARACTERS TO RAD50 MOV R1,WCGRP$ ;SAVE IT AS GROUP CODE CLR R1 ;DON'T ALLOW "." CALL $CAT5 ;CONVERT 2ND 3 CHARACTERS TO RAD50 MOV R1,WCUSR$ ;SAVE IT AS USER CODE RETURN ;EXIT ; ;***** ; ; SUBROUTINE TYPEIT-OUTPUT LINE USING QIO READ AFTER PROMPT ; TO SHOW A LINE TO TERMINAL AND WAIT FOR CARRAIGE RETURN. ; WHEN CALLED R0=POINTER TO STUFF TO OUTPUT, R1=#CHARACTERS TO OUTPUT. ; USES HDBUF$FOR RESPONSE BUFFER. ; ;***** ; .IF DF DEBUG TYPEIT: QIOW$S #IO.RPR,#TILUN,#TIEFN,,#IOSB$,,<#HDBUF$,#2.,,R0,R1,#044> ;OUTPUT IT AND WAIT FOR CONTINUE TSTB IOSB$ ;CHECK ERROR STATUS BGT 5$ ;NO ERROR, LEAVE MOV #EXIT,(SP) ;ALTER RETURN POINT ON ERROR TO EXIT 5$: RETURN .ENDC ;DEBUG .END