.TITLE SRDINI .IDENT -6.62- ; Nov-87 .ENABL LC ;+ ; ; **SRD--SORT DIRECTORY ; ; TASK INITIALIZATION PHASE ; ; ; THIS TASK WILL SORT A RSX11M DIRECTORY ; THEN CREATE A LISTING WITH SEVERAL SELECTION OPTIONS ; ;- ; ; MODIFICATIONS: ; ; BT001 - 01-DEC-81 ; CORRECT CHECK FOR /WB TO SEE IF WE SHOULD SORT THE DIRECTORY; ; ADD /ZE SWITCH; ; CHANGE SYMBOL FOR /00 SWITCH VALUE TO ZDSW (FROM ZESW) AND MOVE ; TO SWMS3$; ; TURN OFF /WI AND /WD IF /SE SPECIFIED ; ; RBD001 13-Jul-82 ; Add exit with status support for '11M ; Delete garbage at the end of the file ; ; BT002 - 18-May-83 ; Merged in /SM, /HD, and /BK switches from Glen Everhart's ; Fall 1982 version; ; Do not allow /DE without file name or /SE specified; ; When file name on command line has no ".", append ".*;*" ; only when original search string ended in "*" (e.g., ; /SE:*ABC*); otherwise, append ".;*", to prevent deletion ; of all files with that name and any type (e.g., when ; GHI/DE specified) ; ; CEF001 - 01-June-83 ; CREATE I (RO) AND D (RW) PSECTS ; ; ; VERSION 6.4 - 07-Nov-83 (;BT003) ; ; Bob Turkelson ; SRD Working Group ; ; Use additional LUN for reading headers. For directories too ; large to fit into memory, the directory is kept open while ; processing it in pieces. Thus the directory LUN can not be ; re-used for reading the headers. ; Display original command line the user entered, before the ; replacement of certain symbols in the /SE, /SD, and date ; switches. ; Add sort by date capability. Merged from Henry Tumblin's ; version of SRD (which does not appear on the SIG tapes). ; Allow specification of major and minor sort keys in any order ; in the /SR:x:x:x switch, also allowing the sort to be either ; ascending or descending for any key (file name, type, version ; date). Ascending and descending capability adopted from ; changes by Dave Sides (Sachs/Freeman Assoc., Inc., c/o ; JHU/Applied Physics Laboratory)(;DJS001). Ideas for ; specifying sort keys came from the version of SRD in the ; U. S. Forest Service collection of programs appearing on the ; Spring 1982 SIG tape. The implementation here is quite ; different. ; Added the command file generation switch /CM, taken from the ; version of SRD submitted to the Spring 1982 SIG tape in the ; U. S. Forest Service collection of programs. ; Added the /PA switch to pack the file names (remove any blanks). ; Added the /TB switch to include in the summary the number of ; blocks used/allocated even if it would not otherwise appear. ; Added the /GT:n switch to select files with allocated sizes of ; at least n. blocks. ; Added the /FI:n switch to select by file ID. ; Added the /FO:[g,m] switch to select files by file owner, with ; /FO defaulting to files owned by the directory being listed; ; may be negated to select files with different file owners. ; Added the /ER switch to display files which produce errors ; when attempting to read their headers. ; Created the /NV (new version) switch as a synonym for /SV. ; Temporarily do not report errors when reading extension ; headers - treat the file as if it had a single header - unless ; the temporary switch /H2 is specified. A bug in RSX-11M V4.0 ; and RSX-11M-PLUS V2.0 causes a privilege violation reading an ; extension header unless you are in a privileged UIC or in the ; file owner's UIC. We recently determined that this does not ; occur in RSX-11M V3.2, and this problem has been corrected in ; V4.1 and RSX-11M-PLUS V2.1. ; When the date stored in the file header is corrupt, issue a ; non-fatal diagnostic message. (Previously the same fatal ; message was issued for this situation as was given for when ; an invalid date was specified in the command line.) ; Use three letters of the task name in the program prompt and in ; error messages. ; Set /SR if /SV, /NV, /OV, or /PU is specified (even if /-SR ; is specified) in order to make sure the directory gets sorted ; for these functions. ; Correctly terminate each switch value table. ; In diagnostic messages which refer to specific files include ; the UIC and file name in the message. ; Form a UIC string when the directory is opened in SRDOPR for ; use in UIC headings and diagnostic messages. ; Removed CLR instructions from SRDINI for those locations ; already cleared in the STACLR:: section of data in SRDATA. ; The check for /WB in SRDINI changed from BITB to BIT. ; ; ; VERSION 6.5 - 16-Jan-85 (;WG001) ; ; SRD Working Group ; ; Add the /AP switch to append the listing to an existing file. ; Interpret the input file spec and switches before opening ; the output file to allow /AP on either the output or input ; file specification. ; Use decimal format for file version numbers in P/OS. ; ; ; Version 6.6 - 12-Jun-85 (;WG6.6) ; ; SRD Working Group ; ; Turn off /HD (command line display) when a listing file is ; not specified. There is no need to display the command ; line when listing files on TI:. ; Move restoring of the original command line to the end of ; the module to correct problem where an output filename ; spec with embedded blanks resulted in a "Directory not ; found" error message. ; ; Version 6.61 - 06-May-1987 (;ASDL6.61) ; ; Florida Atlantic University Enhancements ; ; Conditionalized Decimal Version Number Support ; on Symbol F$$DVN ; ; Version 6.62 - 28-Nov-1987 (;bfb001) ; ; Barton F. Bruce / Cambridge Computer Associates, Inc. ; ; redefine F$$DVN and N$$DIR to indicate that support is ; desired subject to FEAT$ saying it is present in the SYSTEM. ; ;= ; ; SYSTEM MACRO CALLS ; ;CEF001 .PSECT SRDATA,D,RW,LCL,REL,CON ;CEF001 ; ;CEF001 ; .MCALL CSI$1,CSI$2,DIR$,EXIT$S,GCMLD$,GCML$,FHDOF$,ALUN$S .MCALL GTIM$S,WTSE$S,CSI$SW,CSI$SV,CSI$ND,NMBLK$,CLOSE$ .mcall feat$s ;bfb001 .MCALL FDOP$R ;WG001 .IF DF R$$11M .MCALL EXRG$S,GPRT$ ; 04 EXTEND REQION .MCALL EXST$S ;RBD001 .ENDC ;BT003 .MCALL GTSK$ ; GET TASK PARAMETERS. FHDOF$ DEF$L ; DEFINE FILE HEADER ; .IF DF R$$11M GETPAR: GPRT$ ,PARBF$ .ENDC ;BT003 GTSK: GTSK$ PARBF$ STRING: .ASCII /SY:/ CMFLDS: .ASCIZ /OLTVS/ ; Valid letters for second value in /CM: switch,;BT003 ; ; in order of appearance on generated cmd line;BT003 KEYBYT: .ASCIZ /T/<0>/N/<0>/V/<0>/D/<0> ; Valid values for sort keys ;BT003 ; ; each followed by a flag ;BT003 ; ; (0 if key not specified) ;BT003 .EVEN ;BT003 KEYDFT: .ASCII /T N VD/<0><0> ; Default ordering of sort keys for /-NA ;BT003 KEYDFN: .ASCII /N T VD/<0><0> ; Default ordering of sort keys for /NA ;BT003 .EVEN SWTABL: CSI$SW NA,NASW,SWMSK$,SET,NEG CSI$SW MI,MISW,SWMSK$,SET,NEG,FUVAL CSI$SW SP,SPSW,SWMSK$,SET,NEG CSI$SW HV,HVSW,SWMS2$,SET,NEG,HVVAL CSI$SW NE,NESW,SWMSK$,SET,NEG CSI$SW BE,,SWMSK$,SET,NEG,BEVAL CSI$SW AF,,SWMSK$,SET,NEG,AFVAL CSI$SW SE,SESW,SWMSK$,SET,,SEVAL CSI$SW SD,,SWMSK$,SET,NEG,SEVAL CSI$SW PU,,SWMSK$,SET,NEG,PUVAL CSI$SW OV,,SWMSK$,SET,NEG,PUVAL CSI$SW WB,WBSW,SWMS2$,SET,NEG CSI$SW SV,SVSW,SWMSK$,SET,NEG,PUVAL CSI$SW NV,SVSW,SWMSK$,SET,NEG,PUVAL ; Make /NV equivalent to /SV ;BT003 CSI$SW LI,LISW,SWMSK$,SET,NEG,FUVAL CSI$SW DE,DESW,SWMSK$,SET,NEG CSI$SW DA,DASW,SWMSK$,SET,NEG,AFVAL CSI$SW FU,FUSW,SWMSK$,SET,NEG,FUVAL CSI$SW CO,COSW,SWMS2$,SET,NEG CSI$SW LO,LOSW,SWMS2$,SET,NEG CSI$SW MU,MUSW,SWMS2$,SET,NEG CSI$SW ID,IDSW,SWMS2$,SET ; +007 /IDENT CSI$SW SI,SISW,SWMS2$,SET ; +007 /SI CSI$SW AE,,SWMSK$,SET,NEG,AFVAL CSI$SW BF,,SWMSK$,SET,NEG,BEVAL CSI$SW RD,RDSW,SWMS2$,SET,NEG CSI$SW SR,SRSW,SWMS2$,SET,NEG,SRVAL ;BT003 CSI$SW SY,SYSW,SWMS2$,SET,NEG CSI$SW AT,ATSW,SWMS2$,SET,NEG CSI$SW WI,WISW,SWMS2$,SET,NEG CSI$SW WD,,SWMS2$,SET,NEG CSI$SW 00,ZDSW,SWMS3$,SET,NEG ;BT001 CSI$SW HE,HESW,SWMS2$,SET,NEG CSI$SW M2,M2SW,SWMS2$,SET,NEG CSI$SW ZE,ZESW,SWMS2$,SET,NEG ;BT001 CSI$SW BK,BKSW,SWMS3$,SET,NEG ;BT002 CSI$SW SM,SMSW,SWMS3$,SET,NEG ;BT002 CSI$SW HD,HDSW,SWMS3$,SET,NEG ;BT002 CSI$SW GT,GTSW,SWMS3$,SET,NEG,GTVAL ;BT003 CSI$SW ER,ERSW,SWMS3$,SET,NEG ;BT003 CSI$SW TB,TBSW,SWMS3$,SET,NEG ;BT003 CSI$SW FI,FISW,SWMS3$,SET,NEG,FIVAL ;BT003 CSI$SW PA,PASW,SWMS3$,SET,NEG ;BT003 CSI$SW CM,CMSW,SWMS3$,SET,NEG,CMVAL ;BT003 CSI$SW FO,FOSW,SWMS3$,SET,NEG,FOVAL ;BT003 CSI$SW H2,H2SW,SWMS3$,SET,NEG ; Temporary switch (reading ;BT003 ; ; extension header problem) ;BT003 CSI$SW AP,APSW,SWMS3$,SET,NEG ;WG001 CSI$ND CSI$SV ASCII,SEBUF$,16.,SEVAL CSI$ND ;BT003 CSI$SV DECIMAL,LINSZ$,2,FUVAL CSI$ND ;BT003 CSI$SV DECIMAL,VRSCT$,2,PUVAL CSI$ND ;BT003 CSI$SV ASCII,AFBUF$,15.,AFVAL CSI$ND ;BT003 CSI$SV ASCII,BEBUF$,15.,BEVAL CSI$ND ;BT003 .IF DF F$$DVN ;ADL6.61 CSI$SV DECIMAL,LVNUM$,2,HVVALd ;bfb001 .ENDC ;F$$DVN ;ADL6.61 CSI$SV OCTAL,LVNUM$,2,HVVAL ;WG001 CSI$ND CSI$SV DECIMAL,GTBUF$,4,GTVAL ;BT003 CSI$ND ;BT003 CSI$SV OCTAL,FIBUF$,2,FIVAL ;BT003 CSI$SV OCTAL,FIBUF$+2,2 ;BT003 CSI$SV OCTAL,FIBUF$+4,2 ;BT003 CSI$SV OCTAL,FIBUF$+6,2 ;BT003 CSI$ND ;BT003 CSI$SV ASCII,SKBUF$,2,SRVAL ;BT003 CSI$SV ASCII,SKBUF$+2,2 ;BT003 CSI$SV ASCII,SKBUF$+4,2 ;BT003 CSI$SV ASCII,SKBUF$+6,2 ;BT003 CSI$SV ASCII,SKBUF$+10,2 ;BT003 CSI$ND ;BT003 CSI$SV ASCII,CMBUF$,3,CMVAL ;BT003 CSI$SV ASCII,CMBF2$,5 ;BT003 CSI$ND ;BT003 CSI$SV OCTAL,FOGBF$,2,FOVAL ;BT003 CSI$SV OCTAL,FOMBF$,2 ;BT003 CSI$ND DFNB: NMBLK$ 200200,DIR,1,SY,0 ; ;CEF001 .PAGE ;CEF001 .SBTTL SRDINI - CODE ;CEF001 .PSECT SRDCOD,I,RO,REL,CON,LCL ;CEF001 SRDINI:: DIR$ #GTSK ; Get task parameters ;BT003 MOV PARBF$+G.TSTN,R1 ; Get first half of RAD50 task name ;BT003 CMP R1,#^R... ; Does task name begin with "..."? ;BT003 BNE 10$ ; NE - no, use the first part of name ;BT003 MOV PARBF$+G.TSTN+2,R1 ;Use second half of RAD50 task name ;BT003 BR 30$ ; ;BT003 10$: CMP R1,#^RTT0 ; Might task name begin as TTn (0<=n<=7) ? ;BT003 BLO 30$ ; LO - no, use first part of name ;BT003 CMP R1,#^RTT7 ; Does task name begin as TTn (0<=n<=7) ? ;BT003 BLOS 40$ ; LOS - yes, use SRD> prompt ;BT003 30$: MOV #ERMESG,R0 ; Point to task name part of error msg string ;BT003 MOV R0,R3 ; Copy pointer ;BT003 CALL $C5TA ; Convert part of task name to ASCII ;BT003 MOV #CMDBLK+G.DPRM+2,R0 ; Point to get command line prompt string ;BT003 MOV (R3)+,(R0)+ ; Move first two bytes of task name ;BT003 MOVB (R3),(R0) ; Move third byte of task name ;BT003 40$: ;BT003 clr featsw ; assume no features found with FEAT$ ;bfb001 .ifdf f$$dvn ;bfb001 feat$s #fe$dvn ; test for decimal version support in sys ;bfb001 cmp $dsw,#is.set ;bfb001 bne 50$ ;bfb001 bis #featdv,featsw ; remember it ;bfb001 mov hvvald,hvval ; replace octal conversion code with decimal ;bfb001 50$: ;bfb001 .endc ; f$$dvn ;bfb001 .ifdf n$$dir ;bfb001 feat$s #fe$nam ; test for named dir support in sys ;bfb001 cmp $dsw,#is.set ;bfb001 bne 60$ ;bfb001 bis #featnd,featsw ; remember it ;bfb001 60$: ;bfb001 .endc ; n$$dir ;bfb001 ; ; get the task's build date + time setup for /id display ; mov #tkbtim,r0 ; buffer to return stuff in ;bfb001 mov #$dbts,r1 ; date of task build ;bfb001 call $dat ; convert to ascii ;bfb001 movb #' ,(r0)+ ; blank between fields ;bfb001 mov #$dbts+6,r1 ; time of task build ;bfb001 mov #4,r2 ; conversion format code ;bfb001 call $tim ; convert to ascii ;bfb001 ; .IF DF R$$11M ; 4.1 IF RUNNING ON RSX11M... DIR$ #GETPAR ; 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 MOV R0,DIRBE$ ; SAVE END OF DIRECTORY BUFFER .IF DF D$$CAL ; IF DYNAMIC CHECKPOINT ALGORITHM AVAILABLE... SUB LIMBF$,R0 ; FIND SIZE OF REAL WORK BUFFER MOV R0,R1 ; COPY THAT CLC ; 04 ROR R1 ; UN-SIGNED DIVIDE BY 2 ASR R1 ; 04 ASR R1 ASR R1 ASR R1 ASR R1 ; BY 64. NEG R1 ; BLOCK COUNT NEGATIVE EXRG$S R1 ; TRY TO SHRINK TASK BCS LOOP ; BR IF DIDN'T WORK BIC #77,R0 ; MODULO 64 BYTES SUB R0,DIRBE$ ; REDUCE SIZE OF BUFFER .ENDC .IFF ; IF ON RSX11D OR IAS... MOV PARBF$+G.TSTS,R0 ; Get end of buffer (from GTSK$) ;BT003 MOV R0,DIRBE$ ; SET END OF BUFFER. .ENDC LOOP: MOV #SWINI,SWMSK$ ; Initialize masks from TKN Global Definitions MOV #SW2INI,SWMS2$ ; MOV #SW3INI,SWMS3$ ;BT001 ; Clear the area of data starting with STACLR:: in SRDATA ;BT003 MOV #STACLR,R1 ; GET START ADDRESS TO CLEAR MOV #LENCLR,R2 ; AND LENGTH ; 3$: CLRB (R1)+ ; CLEAR A BYTE SOB R2,3$ ; AND SO ON CLR NXUIC$ ; ASSUME NO WILD CARD UICS GCML$ #CMDBLK ; GET COMMAND LINE BCC CMDOK ; BR=AOK CMPB CMDBLK+G.ERR,#GE.IOR ; I/O ERROR? BEQ 1$ ; YES CMPB #GE.EOF,G.ERR(R0) ; LOOK FOR END-OF-FILE BEQ 5$ ; BR IF EXPECTED ERROR FERR GCME ; ELSE LOG ERR 1$: DIAG GCME ; ISSUE DIAGNOSTIC 5$: JSR R0,ATTDET ; TRY TO DETACH DEVICE. .WORD IO.DET ; .IF DF R$$11M ;RBD001 EXST$S X$STAT ; TRY TO EXIT WITH STATUS ;RBD001 .ENDC ;RBD001 EXIT$S ; EXIT ;RBD001 ; ; ; CMDOK: MOV G.CMLD+2(R0),R1 ; Command start ;BT003 MOV G.CMLD(R0),R2 ; Command length ;BT003 BEQ 15$ ; EQ - no command string entered ;BT003 MOV #LINBUF,R3 ; Temporary buffer to hold original cmd line ;BT003 10$: MOVB (R1)+,(R3)+ ; Copy each byte of original command ;BT003 SOB R2,10$ ; Continue to end of command ;BT003 MOV G.CMLD+2(R0),R1 ; Command start ;BT003 MOV G.CMLD(R0),R2 ; Command length ;BT003 BNE 20$ ; NE - command string entered ;BT003 15$: ;BT003 MOV #STRING,R1 ; SET DEFAULT COMMAND MOV #3,R2 ; LENGTH 20$: CALL SRDREP ; REPLACE SYMBOLS CSI WILL OBJECT TO CSI$1 #CSIBLK,R1,R2 ; CK SYNTAX BCS CS1ERR ; BR IF BAD MOV #SWTABL,C.SWAD(R0) ; SET SWITCH TABLE ADDRESS MOVB #CS.OUT,(R0) ; ASSUME THAT OUTPUT IS ALL THAT WAS GIVEN MOV #LSTDFN,R3 ; GET DEFAULT NAME BLOCK FOR LISTING CLR R2 ; ASSUME NO NAME FOR OUTPUT IN STRING .IF NDF I$$AS ; IF NOT ON IAS... MOV #"TI,N.DVNM(R3) ; ASSUME THAT THE "TI:" IS WHERE IT GOES .IFF ; BUT IF ON IAS... MOV #"TO,N.DVNM(R3) ; ASSUME THAT THE "TO:" IS WHERE IT GOES .ENDC BIT #CS.EQU*400,(R0) ; WAS AN "=" GIVEN? BEQ 30$ ; BR IF NO-ASSUMPTIONS WERE CORRECT MOV #"SY,N.DVNM(R3) ; NAME GIVEN-CHANGE DEFAULT TO "SY0:" CALL .CSI2 ; PARSE REAL OUTPUT NAME BCS CS2OER ; OUTPUT SPEC ERROR MOVB #CS.INP,(R0) ; SET UP TO DO INPUT NEXT MOV #,R2 ; GET DATA-SET-DESCRITOR ADDRESS BIS #OUTFSW,FLAGS$ ; Set the bit to say we had a file 30$: MOV #LSTFDB,R0 ; SET FILE-DESCRIPTOR-BLOCK MOV #,R1 ; AND FILE-NAME-BLOCK FOR PARSE CALL .PARSE ; ---AND PARSE IT! BCS PARSER ; BR IF FAILED MOV #CSIBLK,R0 ; SET CSI BLOCK CALL .CSI2 ; GET COMMAND FOR UFD TO SORT BCS CS2IER ; INPUT SPEC ERROR ; Open the listing file after input spec switches are determined in order ;WG001 ; to allow the /AP switch on either the output or input specification ;WG001 FDOP$R #LSTFDB,,,,#FO.WRT ; Set write access for listing file ;WG001 BIT #APSW,SWMS3$ ; Was /APPEND switch specified? ;WG001 BEQ 35$ ; EQ - no, open new listing file ;WG001 FDOP$R #LSTFDB,,,,#FO.APD ; Set append access for listing file ;WG001 MOV LSTFDB+F.FNB+N.FVER,R1 ; Save desired file version number ;WG001 CALL .OPFNB ; Try to open the listing file for append ;WG001 BCC DEVATT ; CC - file opened OK ;WG001 ; Could not open file for append ;WG001 MOV R1,LSTFDB+F.FNB+N.FVER ; Restore desired file version number ;WG001 BEQ 32$ ; EQ - highest version (;0) ;WG001 FERR OPNAPF ; Fatal open append (for non-zero file version) ;WG001 ; ;WG001 32$: DIAG OPNAPW ; Issue warning for open append error (;0) ;WG001 FDOP$R #LSTFDB,,,,#FO.WRT ; Set write access, removing append access ;WG001 35$: CALL .OPFNB ; Try to open a new listing file ;WG001 BCC DEVATT ; CC - file opened OK ;WG001 FERR OPNO ; Fatal open on output file ;WG001 ; ;WG001 ; Command errors ;WG001 ; ;WG001 CS1ERR: FERR CS1E ;WG001 CS2IER: FERR CS2I ;WG001 CS2OER: FERR CS2O ;WG001 CMDERR: FERR GCME ;WG001 PARSER: FERR PRSE ;WG001 ; ;WG001 DEVATT: ;WG001 BITB #FD.REC,F.RCTL+LSTFDB ; RECORD DEVICE? BEQ 45$ ; BR IF NO BIT #ATSW,SWMS2$ ; Attaching if terminal? BEQ 45$ ; If EQ no - omit attach BIT #HESW!IDSW!SISW,SWMS2$ ; A proper listing? BNE 45$ ; If NE no - don't attach BIT #LISW!MISW!FUSW,SWMSK$ ; Sure? BEQ 45$ ; If EQ no - don't attach JSR R0,ATTDET ; TRY TO ATTACH .WORD IO.ATT ; 45$: BIT #SESW,SWMSK$ ; WAS /SE SWITCH SPECIFIED? ;**-9 BEQ 46$ ; IF EQ NO - PROCEED ;BT001 BIC #,SWMS2$ ; NO IMPLICIT WILDCARDING WITH /SE ;BT001 46$: ;BT001 BITB #CS.MOR,C.STAT+CSIBLK ; CHECK FOR INVALID SYNTAX BNE CMDERR ; BR IF THERE BITB #CS.NMF,C.STAT+CSIBLK ; WAS A NAME FIELD SPECFIED? BNE 47$ ; BR IF YES ;BT002 BIT #SESW,SWMSK$ ; WAS SELECT SWITCH SPECIFIED? ;BT002 BNE SETUP ; BR IF YES ;BT002 BIT #DESW,SWMSK$ ; WAS /DE SPECIFIED WITHOUT /SE OR NAME FIELD? ;BT002 BEQ SETUP ; BR IF NO ;BT002 JMP CS1ERR ; Signal error condition - call it syntax error ;BT003 47$: MOV C.FILD+2+CSIBLK,R1 ; GET STRING ADDRESS MOV C.FILD+CSIBLK,R0 ; NOW LENGTH CLR C.FILD+CSIBLK ; DONT LET PARSE SEE NAME MOV #SEBUF$,R2 ; STRING BUFFER ADDRESS BIT #SESW,SWMSK$ ; WAS SELECT SW SPECIFIED? BEQ 50$ ; BR IF NO-NAME IS IMPLIED SELECT TSTB (R2) ; WAS A STRING GIVEN? BEQ 50$ ; EQ - no, proceed ;BT003 JMP CS1ERR ; 2 Select strings is a command error ;BT003 ; 50$: BIS #SESW,SWMSK$ ; EFFECT A SELECT ; 60$: MOVB (R1)+,(R2)+ ; COPY A BYTE DEC R0 ; MOVE ENTIRE STRING? BLE 70$ ; BR IF YES CMP R2,#SEBUF$+19. ; RUN OUT OF SPACE? BLO 60$ ; IF NO-LOOP AGAIN ; 70$: CLRB (R2) ; SET SENTINEL FOR STRING END SETUP: BIT #HESW,SWMS2$ ; Help switch? BEQ 5$ ; If EQ no - process normally DIR$ #HLSPWN ; Yes - ask for help WTSE$S #1 ; Wait for it to finish CLOSE$ #LSTFDB ; Close the Output File CLOSE$ #UFDFDB ; and the input one JMP LOOP ; Get next command ; 5$: BIT #SESW,SWMSK$ ;DOING SELECTIVE SEARCH? BEQ 70$ ;IF EQ NO - OMIT CHECKS CLR R1 ;NO DOT FOUND YET MOV #SEBUF$,R0 ;GET BUFFER ADDRESS 10$: TSTB (R0) ;FIND TERMINATING NULL? BNE 30$ ;IF NE NO - CARRY ON LOOKING TST R1 ;FOUND A DOT? BNE 20$ ;IF NE YES - DON'T PUT ANOTHER IN MOVB #'.,(R0)+ ;NO - INSERT ONE CMPB -2(R0),#'* ; DID ORIGINAL SEARCH STRING END IN '*'? ;BT002 BNE 20$ ; IF NE NO - DO NOT USE WILDCARD TYPE ;BT002 MOVB #'*,(R0)+ ;If no . then wildcard extension 20$: MOVB #';,(R0)+ ;AND SEMI-COLON (OR WE WOULDN'T BE HERE) MOVB #'*,(R0)+ ; If no ; then wildcard version CLRB (R0)+ ; INSERT TERMINATING NULL ;BT002 BR 70$ ;CARRY ON 30$: CMPB (R0),#'. ;FOUND A DOT? BNE 40$ ;IF NE NO - KEEP LOOKING INC R1 ;YES - FLAG IT INC R0 ;SET TO NEXT CHAR BR 10$ ;AND CHECK IT ; 40$: CMPB (R0),#'# ;FOUND A HASH? (I.E. A SEMI-COLON) BNE 45$ ;IF NE NO - KEEP LOOKING MOVB #';,(R0) ;YES - REPLACE IT WITH A SEMI-COLON 45$: CMPB (R0)+,#'; ;FOUND A SEMI-COLON? BNE 10$ ;IF NE NO - CHECK NEXT ONE TST R1 ;YES - HAVE WE HAD A PERIOD? BNE 70$ ;IF NE YES - EXIT OK DEC R0 ;SET BACK TO SEMI-COLON MOV R0,-(SP) ;STORE IT ON THE STACK 50$: TSTB (R0)+ ;FIND THE NULL BNE 50$ ; MOV R0,R1 ;SAVE ADDRESS INC R1 ;SHOVE UP ONE TO ALLOW ROOM FOR DOT ;BT002 60$: MOVB -(R0),-(R1) ;SHIFT THE BYTES UP ONE ;BT002 CMP R0,(SP) ;DONE THE LOT? BNE 60$ ;NO - DO ANOTHER MOV (SP)+,R0 ; Get address of ; back MOVB #'.,(R0)+ ; Insert a . 70$: MOV #LINSZ$,R0 ; POINT AT LINE SIZE SW VALUE TST (R0) ; DID USER SPECIFY VALUE? BNE 80$ ; BR IF YES! MOV LSTFDB+F.BBFS,(R0) ; SET DEVICE BUFFER SIZE FOR LINE SIZE 80$: CMP (R0),#72. ; CK LINE SIZE AGAINST MIN BHIS 90$ ; BR IF SIZE OK MOV #72.,(R0) ; SET ACCEPTABLE VALUE 90$: CMP (R0),#132. ; NOW CK AGAINST MAX BLOS 100$ ; BR IF OK MOV #132.,(R0) ; SET ACCEPTABLE LINE SIZE 100$: BIT #OUTFSW,FLAGS$ ; Listing file specified? ;WG6.6 BNE 110$ ; NE - yes ;WG6.6 BIC #HDSW,SWMS3$ ; If listing defaults to terminal, set to /-HD ;WG6.6 110$: ;WG6.6 LST1: ;**-1 MOV #TDBUF$,R0 ; POINT AT DATE BUFFER MOV #HDBUF$,R1 ; SCRATCH AREA GTIM$S R1 ; FIND THE TIME CALL $DAT ; CONVERT DATE TO NORMAL FORM 10$: MOVB #40,(R0)+ ; SEPARATE DATE AND TIME MOV #TDTIM$,R0 ; GET ADDRESS FOR TIME MOV #2,R2 ; SET TO CONVERT HR,MIN CALL $TIM ; AND CONVERT THE TIME BIT #DASW,SWMSK$ ; DATE SELECT BEQ 30$ ; BR IF NO BIT #AFSW!BESW!AESW!BFSW,SWMSK$ ; JUST /DA SPECIFIED? BEQ 15$ ; IF EQ YES, USE /AF BUFFERS BIT #AFSW!AESW,SWMSK$ ; /AF SPECIFIED? BEQ 23$ ; IF EQ NO - JUST SET UP /BE 15$: MOV #AFBUF$,R1 ; SET TO POINT AT FIRST SW BUFFER TST (R1) ; ANY DATE SUPPLIED? BNE 20$ ; BR IF YES-USE USER SUPPLIED DATE MOV #TDBUF$,R1 ; IF NON SUPPLIED-USE TODAY! BISB #'0,(R1) ; FIRST CHARACTER MUST BE NUMERIC 20$: CALL CNVDAT ; CHANGE TO INTEGER FORMAT BCS 28$ ; CS - Report error in date format ;BT003 MOV R2,AFBUF$ ; SAVE TARGET DATE MATCH MOV R3,AFBUF$+2 ; SAVE TARGET TIME MATCH 23$: BIT #AFSW!BESW!AESW!BFSW,SWMSK$ ; JUST /DA GIVEN? BNE 25$ ; IF NE NO - CARRY ON MOV AFBUF$,BEBUF$ ; YES - SET /BE FROM /AF MOV AFBUF$+2,BEBUF$+2 ; BIS #AESW!BESW,SWMSK$ ; Set the other flags BR 30$ ; AND CARRY ON 25$: MOV #BEBUF$,R1 ; SET TO POINT AT SECOND SW BUFFER TST (R1) ; ANY DATE SUPPLIED? BNE 27$ ; BR IF YES-USE USER SUPPLIED DATE MOV #TDBUF$,R1 ; IF NON SUPPLIED-USE TODAY! BISB #'0,(R1) ; FIRST CHARACTER MUST BE NUMERIC 27$: CALL CNVDAT ; CHANGE TO INTEGER FORMAT BCC 29$ ; CC - No date format error detected ;BT003 28$: FERR BADD ; Report error in date format ;BT003 29$: ;BT003 MOV R2,BEBUF$ ; Save Target Date Match MOV R3,BEBUF$+2 ; Save Target Time Match ; 30$: MOV SWMSK$,R1 ; WE DON'T NEED TO SORT IF THESE ARE OFF BIC #^C,R1 ;BT001 BNE 35$ ;BT001 BIT #WBSW,SWMS2$ ; /WB SPECIFIED? ;BT001 BNE 35$ ; IF NE YES, DO NOT TURN OFF SORT ;BT001 BIC #SRSW,SWMS2$ ; 35$: BIT #NOFOSW,FLAGS$ ; Was /-FO or /NOFO detected (in SRDREP)? ;BT003 BEQ 36$ ; EQ - no ;BT003 BIS #FOSW,SWMS3$ ; Set the /FO switch for SRDLST ;BT003 36$: BIT #SVSW,SWMSK$ ; Version selection required (/NV,/SV,/OV,/PU)? ;BT003 BEQ 37$ ; EQ - no ;BT003 BIS #SRSW,SWMS2$ ; If version selection, make sure sort occurs ;BT003 37$: BIT #SRSW,SWMS2$ ; Sort specified? ;BT003 BEQ 350$ ; EQ - no ;BT003 ; ;BT003 ; Check for values given in /SR: switch. Keys must be valid. Duplicates ;BT003 ; are not allowed. No value may follow a null value (e.g. /SR:N::T). ;BT003 ; ;BT003 MOV #KEYBYT+1,R1 ; Point to first flag field in valid sort key ;BT003 ; ; value table ;BT003 110$: CLRB (R1)+ ; Initialize flag field ;BT003 TSTB (R1)+ ; At end of table? ;BT003 BNE 110$ ; NE - no, more to do ;BT003 CLR R2 ; Show null field not yet found ;BT003 MOV #SKBUF$,R0 ; Start of sort keys specified in /SR switch ;BT003 120$: TST (R0) ; Null value in this position? ;BT003 BNE 130$ ; NE - no, proceed ;BT003 INC R2 ; Signal that a null value has been found ;BT003 BR 170$ ; Go check next field ;BT003 130$: TST R2 ; Was a null field previously found? ;BT003 BNE 150$ ; NE - yes, key following a null is invalid ;BT003 MOV #KEYBYT,R1 ; Point to table of valid sort keys ;BT003 140$: CMPB (R0),(R1)+ ; Found key specified in the table? ;BT003 BEQ 160$ ; EQ - yes, here it is ;BT003 TSTB (R1)+ ; Not yet; skip up to next key in table ;BT003 TSTB (R1) ; Are we at the end of the table? ;BT003 BNE 140$ ; NE - no, check the next key ;BT003 150$: FERR BADSK ; Invalid key specified ;BT003 160$: TSTB (R1) ; Have we seen this key before? ;BT003 BNE 150$ ; NE - yes, duplicate key specified ;BT003 INCB (R1) ; Indicate we have seen this key ;BT003 CMPB (R0),#'D ; Was this the date sort key? ;BT003 BNE 170$ ; NE - no ;BT003 BIS #DATSRT,FLAGS$ ; Set special flag ;BT003 170$: TST (R0)+ ; Point to next sort key specified in /SR switch;BT003 CMP R0,#SKEND$ ; Are we at the end of the specified keys? ;BT003 BLO 120$ ; LO - no, check the next sort key ;BT003 ; ;BT003 ; If /NV, /SV, /OV, or /PU are specified, there are certain requirements on ;BT003 ; the order of the sort keys. The first sort key must be T or N, the second ;BT003 ; one must be either T or N and different from the first one, and the ;BT003 ; third key must be V. When checking keys in order, if we find a null, ;BT003 ; the keys are valid - the section after this one will fill in the missing ;BT003 ; required keys in the correct order. We do not need to check that the ;BT003 ; first and second are different - the check for duplicate keys was done ;BT003 ; above. ;BT003 ; ;BT003 200$: BIT #SVSW,SWMSK$ ; Version selection required (/NV,/SV,/OV,/PU)? ;BT003 BEQ 300$ ; EQ - no, proceed ;BT003 MOV #SKBUF$,R0 ; Start of sort keys specified in /SR switch ;BT003 TST (R0) ; Is first key null (and hence all keys)? ;BT003 BEQ 300$ ; EQ - yes, proceed ;BT003 CMPB (R0),#'T ; Is first key "T"? ;BT003 BEQ 210$ ; EQ - yes, first key is OK ;BT003 CMPB (R0),#'N ; Is first key "N"? ;BT003 BNE 230$ ; NE - no, version selection cannot be requested;BT003 210$: TST (R0)+ ; Point to second specified key ;BT003 TST (R0) ; Is second key null? ;BT003 BEQ 300$ ; EQ - yes, so switch is valid ;BT003 CMPB (R0),#'T ; Is second key "T"? ;BT003 BEQ 220$ ; EQ - yes, second key is OK ;BT003 CMPB (R0),#'N ; Is second key "N"? ;BT003 BNE 230$ ; NE - no, version selection cannot be requested;BT003 220$: TST (R0)+ ; Point to third specified key ;BT003 TST (R0) ; Is third key null? ;BT003 BEQ 300$ ; EQ - yes, so switch is valid ;BT003 CMPB (R0),#'V ; Is third key "V"? ;BT003 BEQ 300$ ; EQ - yes, switch is valid ;BT003 230$: FERR BADSV ; Specified keys invalid with /NV,/SV,/PU,/OV ;BT003 ; ;BT003 ; Move in required keys which have not been specified ;BT003 ; ;BT003 300$: MOV #KEYDFT,R1 ; Start of default sort keys for /-NA ;BT003 BIT #NASW,SWMSK$ ; Sorting by name first? ;BT003 BEQ 310$ ; EQ - no ;BT003 MOV #KEYDFN,R1 ; Start of default sort keys for /NA ;BT003 310$: MOV #SKBUF$,R0 ; Start of sort keys specified in /SR switch ;BT003 320$: TST (R0) ; Was a key specified in this position? ;BT003 BEQ 330$ ; EQ - no ;BT003 CMPB (R0),(R1) ; Found this key here? ;BT003 BEQ 340$ ; EQ - yes ;BT003 TST (R0)+ ; Point to next sort key ;BT003 CMP R0,#SKEND$ ; At end of specified sort keys? ;BT003 BLO 320$ ; LO - no, look for the key in this position ;BT003 BR 150$ ; Should never get here: past all sort key ;BT003 ; ; fields without using up all defaults ;BT003 330$: MOV (R1),(R0) ; Copy in default key ;BT003 340$: TST (R1)+ ; Point to next default key ;BT003 TST (R1) ; Any more default keys left to check? ;BT003 BNE 310$ ; NE - yes, search for next default key ;BT003 ;BT003 350$: BIT #CMSW,SWMS3$ ; Generating command file? ;BT003 BEQ 450$ ; EQ - no ;BT003 BIS #PASW,SWMS3$ ; Set the pack-file-name switch ;BT003 CLR CMFLG$ ; Clear all bits in /CM flag word ;BT003 MOV #CMBF2$,R1 ; Point to start of second /CM: switch value ;BT003 TSTB (R1) ; Any value specified? ;BT003 BEQ 450$ ; EQ - no ;BT003 410$: MOV #CMFLDS,R2 ; Point to valid options (OLTVS) ;BT003 MOV #1,R3 ; Bit 0 in flag word represents first option ;BT003 420$: CMPB (R2)+,(R1) ; Found specified character in table of options?;BT003 BEQ 430$ ; EQ - yes ;BT003 ASL R3 ; Next bit to left represents next option ;BT003 TSTB (R2) ; At end of options? ;BT003 BNE 420$ ; NE - no, check next one ;BT003 DIAG BADCM ; Specified value invalid; tell user; ignore ;BT003 BR 440$ ; Go on to next specified character ;BT003 430$: BIS R3,CMFLG$ ; Set this bit in /CM flag word ;BT003 440$: TSTB (R1)+ ; Point to next specified character ;BT003 TSTB (R1) ; At end of characters specified in switch? ;BT003 BNE 410$ ; NE - no, another character present - process ;BT003 ;BT003 450$: ;BT003 BITB #CS.WLD,C.STAT+CSIBLK ; ANY WILD CARDS AROUND HERE? BEQ OPN1 ; BR IF NO! MOV C.DIRD+2+CSIBLK,R3 ; GET ADDRESS OF DIRECTORY STRING MOV C.DIRD+CSIBLK,R0 ; NOW LENGTH BEQ OPN1 ; BR IF NO DIRECTORY STRING 40$: DEC R0 ; COUNT DOWN NUMBER CHARS TO SCAN BMI OPN1 ; BR IF DIDN'T FIND WILD CARD FLAG CMPB (R3)+,#'* ; IS THAT A WILD CARD FLAG? BNE 40$ ; BR IF NO INC NXUIC$ ; SET UIC TO START AT 1 MOV C.DIRD+2+CSIBLK,R3 ; POINT AT DIRECTORY DESC. CLR WCGRP$ ; ASSUME WILD GROUP INC R3 ; SKIP [ CMPB #'*,(R3)+ ; IS IT WILD? BEQ 70$ ; BR IF YES 60$: CMPB #',,(R3)+ ; LOOK FOR END OF NUMBER BNE 60$ ; BR IF NOT FOUND MOV R3,R1 ; COPY START OF USER NUMBER DEC R1 ; BACK UP TO COMMA MOV #'[,R2 ; SET OTHER END OF FIELD CALL GETUIC ; CONVERT TO RAD50 MOV R1,WCGRP$ ; SAVE SELECTED GROUP 70$: CMPB #'],(R3)+ ; LOOK FOR END OF USER NUMBER BNE 70$ ; BR IF NOT FOUND CLR WCUSR$ ; ASSUME WILD CARD USER MOV R3,R1 ; COPY PLACE IN STRING CMPB -(R1),-(R1) ; BACK UP TO LAST DIGIT IN NUMBER CMPB #'*,(R1)+ ; IS IT WILD BEQ 80$ ; BR IF YES MOV #<',>,R2 ; SET END OF FIELD CALL GETUIC ; CONV TO RAD50 FORM MOV R1,WCUSR$ ; SAVE THAT CODE 80$: MOV #LSTNX$,(SP) ; SET RETURN ADDRESS OPN1: MOV #UFDFDB,R0 ; GET FDB MOV #,R1 ; FILE NAME BLOCK MOV #,R2 ; DATA SET DESCRIPTOR MOV #DFNB,R3 ; DEFAULT NAME BLOCK TST NXUIC$ ; DOING WILD CARD OPERATION? BEQ 10$ ; BR IF NO CALL .PRSDV ; PARSE DEVICE ONLY BCC INIEX ; EXIT INIT IF OK FERR PRSE ; INDICATE ERROR 10$: CALL .PARSE ; BCC SRTDIR ; BR IF OK ; FERR DIRF ; DIRECRORY FIND ERR ; SRTDIR: ; ; DIRECTORY FIND WAS SUCCESSFUL ; MOV F.FNB+N.DID(R0),SAVDID ;SAVE DIRECTORY ID MOV F.FNB+N.DID+2(R0),SAVDID+2 MOV F.FNB+N.DID+4(R0),SAVDID+4 MOV F.FNB+N.DVNM(R0),SAVDVN ;---AND DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER MOV N.DID(R1),N.FID(R1) ;COPY DIRECTORY I.D. CLR N.DID(R1) ;REMOVE DIRECTORY ID MOV N.DID+2(R1),N.FID+2(R1) ;TO FILE ID SPACE MOV N.DID+4(R1),N.FID+4(R1) ;JUST FOR "GRINS", THIS TOO! MOVB #FO.RD!FA.SHR,F.FACC(R0) ;ASSUME ONLY READ ACCESS BIT #WBSW,SWMS2$ ; Is directory to be written back? ;BT003 BEQ 5$ ;BR IF NO MOVB #FO.MFY,F.FACC(R0) ;REQUEST ACCESS OF FILE FOR MODIFY 5$: MOV #SAVDID,READHD+Q.IOPL ;SET DIRECTORY ID FOR HEADER READ ALUN$S #UFDLUN,SAVDVN,SAVUNM ALUN$S #HDRLUN,SAVDVN,SAVUNM ; Set LUN for reading headers ;BT003 MOV #HDBUF$,HDPTR$ ; Use main header buffer ;BT003 DIR$ #READHD ;REQUEST THE READ BCC 20$ ;BR IF AOK CALL ALERR ;DIAGNOS ERR BR 5$ ;RETRY IF THAT IS POSIBLE 20$: WTSE$S #EFN1 ;WAIT FOR THAT TO STOP MOVB HDBUF$+1,R1 ;GET OFFSET TO IDENT AREA ADD #I.FNAM,R1 ;POINT AT FILE NAME ADD #HDBUF$,R1 ;ADD IN OFFSET FOR BUFFER MOV (R1)+,F.FNAM(R0) ;SET TOP 1/3 OF DIRECTORY NAME MOV (R1)+,F.FNAM+2(R0) ;-AND MIDDLE 1/3 MOV (R1),F.FNAM+4(R0) ;-AND BOTTOM 1/3 BR INIXIT ; Exit routine ;WG6.6 ;**-1 INIEX: MOV F.FNB+N.DVNM(R0),SAVDVN ; SAVE DEVICE NAME MOV F.FNB+N.UNIT(R0),SAVUNM ;ALSO UNIT NUMBER ALUN$S #UFDLUN,SAVDVN,SAVUNM ALUN$S #HDRLUN,SAVDVN,SAVUNM ; Set LUN for reading headers ;BT003 ; ;WG6.6 ; Copy back original command line for including in output later ;WG6.6 INIXIT: MOV CMDBLK+G.CMLD+2,R1 ; Command start ;WG6.6 MOV CMDBLK+G.CMLD,R2 ; Command length ;WG6.6 BEQ 43$ ; EQ - no command string entered ;WG6.6 MOV #LINBUF,R3 ; Point to copy of original cmd line ;WG6.6 44$: MOVB (R3)+,(R1)+ ; Copy back each byte of original command ;WG6.6 SOB R2,44$ ; Continue to end of command ;WG6.6 43$: ;WG6.6 RETURN ; ; GETUIC---LOCAL SUBROUTINE TO CONVERT A 1 TO 3 BYTE NUMERIC STRING ; INTO 3 RADIX 50 CHAR FORMAT CONSISTANT WITH DIRECTORY NAMES GETUIC: MOV #UICS$,R0 ; POINT AT 4 BYTE STRING BUFFER MOV #"00,(R0)+ ; ASSUME LEADING ZEROS NEEDED CLRB (R0)+ ; ADVANCE PONTER 10$: CMPB -(R1),R2 ; IS THIS TERMINAL CHAR? BEQ 20$ ; BR IF YES MOVB (R1),-(R0) ; NO-SET DATA INTO STRING BR 10$ ; TRY AGAIN 20$: MOV #UICS$,R0 ; RESET POINTER CALL $CAT5 ; CONVERT TO RAD50 RETURN .END