1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-03 07:10:22 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/wild/wild.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

2526 lines
83 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE .WILD -- SUBROUTINE TO PERFORM WILDCARD LOOKUP %7D(347)
SUBTTL P.CONKLIN/PFC/JNG/MD/RKH/LLN/LCR/KPY/PY 6-SEP-85
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1971,1972,1973,1974,1975,1976,1977,1978,1981,1982,1984,1986. ALL RIGHTS RESERVED.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
CUSTVR==0 ;CUSTOMER VERSION
DECVER==7 ;DEC VERSION
DECMVR==4 ;DEC MINOR VERSION
DECEVR==347 ;DEC EDIT VERSION
;SUBROUTINE TO SCAN DIRECTORIES AND RETURN LOOKUP BLOCKS FOR THE
;VARIOUS NAMES WHICH MATCH WILD-CARDS.
SEARCH MACTEN,UUOSYM,SCNMAC
SALL
.BCOPY
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1986. ALL RIGHTS RESERVED.
.ECOPY
\;END COPYRIGHT MACRO
;ASSEMBLY INSTRUCTIONS:
;
;
;THEN LOAD THE .REL FILE WITH ANY PROGRAM NEEDING IT.
XP %%WILD,<CUSTVR>B2+<DECVER>B11+<DECMVR>B17+DECEVR
%%%WLD==:DECVER ;[333] Provide a version number for checking
; TABLE OF CONTENTS FOR WILD
;
;
; SECTION PAGE
; 1. REVISION HISTORY...................................... 5
; 2. MISC. DEFINITIONS..................................... 7
; 3. INITIALIZE AND PRESET CALL............................ 8
; 4. LOOKUP ONE FILE....................................... 9
; 5. SECONDARY WILD-CARD LOGIC............................. 25
; 6. DIRECTORY SUBROUTINES................................. 35
; 7. STRUCTURE SUBROUTINES................................. 49
; 8. USEFUL SUBROUTINES.................................... 54
;THIS SUBROUTINE WORKS ON THE DATA BASE LEFT BY THE COMMAND SCANER.
;A LIST OF PARAMETER AREAS DEFINES THE FILES REQUESTED AND THE VARIOUS
;SYSTEM STRUCTURES AND DIRECTORIES ARE SEARCHED.
ENTRY .LKWLD
;ONLY ONE PRINCIPLE ENTRY POINT IS DEFINED--GET THE FIRST OR NEXT FILE.
;CALL: MOVE T1,[LENGTH,,BLOCK]
; PUSHJ P,.LKWLD
; RETURN CPOPJ IF NO MORE FILES WITH T1=-1 (OR DEVCHR IF DISK ONLY)
;SKIP RETURN WITH OPEN BLOCK AND LOOKUP BLOCK PRESET
; INDEX LOCATION WILL POINT TO CURRENT SCANER FILE SPEC
; WITH T1=THE DEVCHR OF THE NEXT DEVICE
; WITH T2=-1 IF DISK, 0 IF DTA, 1 OTHERS OR NUL:
;BLOCK+0: LH = LOCATION CONTAINING FIRST WORD OF FIRST SCANER FILE SPEC
; RH = 0 OR LOCATION CONTAINING FIRST WORD OF LAST SPEC
; 1: LH = LOCATION OF OPEN BLOCK (3 WORDS LONG)
; RH = LOCATION OF LOOKUP BLOCK
; 2: LH = LENGTH OF FILE SPEC FROM SCANER
; RH = LENGTH OF LOOKUP BLOCK
; 3: LH = CHANNEL FOR DATA FILE READING IF ANY AND FLAGS
; 1B0=1 HANDLE ALL DEVICES (ELSE, JUST DISK)
; 1B1=1 SCAN DIRECTORY BEFORE DOING ITS SFD'S
; 1B2=1 RESERVED
; 1B3=1 SEARCH SYS [1,4] AFTER NEW [1,5] , IF SYS
; IS SEARCHED AND /NEW ENABLED.
; RH = LOCATION OF POINTER TO FILE SPEC (INITIALLY 0)
; 4: RH = LOCATION OF ROUTINE TO NOTIFY AT END OF DIRECTORY
ENTRY .SCWLD
;ENTRY POINT TO COMPUTE SECONDARY FILE GIVEN
; INPUT AND WILD-CARDS.
;
;CALL: MOVE T1,[LENGTH,,BLOCK]
; PUSHJ P,.SCWLD
; ERROR RETURN IF NOT POSSIBLE TO SETUP (MESSAGE ALREADY ISSUED)
; SKIP RETURN WITH DEVICE CHARACTERISTICS IN T1
; AND T2=-1 IF DISK OR SPOOLED, 0 IF DTA, 1 OTHERWISE OR NUL:
;
;BLOCK THROUGH BLOCK+2 MANDATORY, LH=INPUT, RH=OUTPUT
;BLOCK+0: ADDRESS OF SCAN FORMAT FILE SPEC (AT LEAST 32 WORDS)
; 1: OPEN BLOCK (3 WORDS)
; 2: LOOKUP/ENTER BLOCK (EXTENDED FORMAT)
; 3: LH=ADDRESS OF DEFAULT OUTPUT EXTENSION WITH RH=-1
; RH=LENGTH OF ENTER BLOCK
;AT RETURN, OUTPUT OPEN AND ENTER BLOCKS WILL BE SETUP
;SECONDARY ENTRY POINTS:
; PUSHJ P,E.DFO
; REPORTS OPEN ERROR FOR DATA FILE
; PUSHJ P,.NXDTW
; EOF RETURN
; NORMAL RETURN WITH NEXT WORD IN T1
; READS ONE BYTE
; PUSHJ P,E.DFL
; REPORTS LOOKUP ERROR
; ERROR INFO IN LOOKUP BLOCK
; PUSHJ P,.LKERR
; REPORTS LOOKUP ERROR MESSAGE (NO FILE)
; (CODE IN T1)
; (PROT. IN 0-8 OF T3)
; PUSHJ P,.CHKTM
; CHECKS /BEFORE AND /SINCE CONSTRAINTS
; (ASSUMES LOOKUP WAS DONE INTO AREA LAST
; POINTED TO BY LAST CALL TO .LKWLD)
; (ASSUMES PARAM AREA POINTED TO BY RH(E+3)
; IN LAST CALL TO .LKWLD)
; PUSHJ P,E.SCO
; REPORTS OPEN ERROR
; PUSHJ P,E.SCL
; REPORTS ENTER ERROR FROM ENTER BLOCK
;.WLDFL =FLAG (-1 IF WILD, +1 IF STR WILD, -2 IF BOTH)
;.WIFIR =LOCATION OF START OF CONCATENATED SET
;.WILAS =LOCATION OF END ... (X+Y)
;B.DC =LOCATION OF BUFFER HEADER
;.WLDBF =BUFFER WITH CURRENT DIRECTORY BLOCK
;.WILDZ =START OF WILD LOW SEG
;.WILDL =LENGTH OF WILD LOW SEG
TWOSEG
RELOC 400000
ND FT$COR,-1 ;+ TREATED SAME AS 'OR'
ND FT$SFD,-1 ;SUB-FILE DIRECTORIES
IFLE .FXLND-1,<FT$SFD==0
.FXLND==1>
SUBTTL REVISION HISTORY
;%1 -- 6/71 WITH 5.03 MONITOR (NAMED LOKWLD)
;A) SHIFT INDEX TO P1 WHICH IS PRESERVED. UPDATE USER'S
; INDEX VIA ARGUMENT.
;B) UPDATE TO USE THE REVISED TYPEOUT ROUTINES IN SCAN.
;C) CHANGE CALL TO BE A BLOCK POINTED TO FROM T1.
;D) USE CHANNEL 0 FOR ALL DIRECTORY READING. HANDLE SFDS. DIRECTORY
; READING IS NOW IN DUMP MODE.
;E) USE ARGUMENT CHANNEL FOR DATA READS.
;F) USE C.MAC (AND SCNMAC.MAC) FOR ALL BITS AND BYTES INCLUDING THE
; FILE SPEC AREA.
;G) HANDLE [,] [P,] [,P] AND [-] NOTATIONS.
;H) HANDLE + FOR UFDS (DEFICIENCY OF VERSION 1).
;I) USE PATH. WHERE POSSIBLE FOR SYS:, ETC.
;J) HANDLE STR, CONTROLLER CLASS, AND CONTROLLER ABBREVIATIONS.
;K) FLAG FOR CALLER BOTH STRS AND WILD (.WLDFL=-2).
;L) DO NOT OPEN DATA CHANNEL.
;M) RETURN LOOKUP BLOCK IN CORE INSTEAD OF ACS.
;N) ADD ROUTINE (.CHKTM) TO CHECK /BEFORE AND /SINCE SWITCHES.
;O) DELAY DIRECTORY LOOKUP ERRORS TO END IN CASE SOME OTHER
; STRUCTURE GETS IT OK.
;P) MAKE OPEN FAILURE FATAL. INCLUDE ASSIGNED JOB NUMBER IF KNOWN.
;Q) ADD SEARCH LIST EMPTY (24) TO STANDARD LOOKUP ERRORS.
;R) CHKACC DIRECTORIES
;S) HANDLE SPECIAL DEVICES SUCH AS HLP:, ALL:, SXS:, ETC.
;77 CORRECT BUG WHEN READING BLOCKS OF THE DIRECTORY. EXAMINED
; ONLY 63 FILES PER BLOCK INSTEAD OF 64.
;%3(77) -- 6/72
;100 USE .FX SYMBOLS FROM SCNMAC %3(50)
;101 USE .FXDFX TO FLAG MFD FIXUPS. HANDLE SYS:.UFD
;102 ALLOW REENTRY AFTER NON-DISK DEVICE.
;103 ALLOW FX.ADD OR .FXTRO FOR OR FUNCTION.
;104 ADD DEFENSIVE HALT IN CASE LH(DIRECTORY)=0. (SPR 10-7182)
;105 REPLACE INTERNS BY :: FLAG.
;106 USE REAL EXTENSION IN LOOKUP ERROR MESSAGE
;107 ADD DTA HANDLING
;110 CORRECT SUBSCRIPTS IN E.DFL ROUTINE
;111 SET /DEN/PAR SWITCHES FOR MTA
;112 CONSIDER /BEFORE AND /SINCE =-1 TO BE ABSENT
;113 [*,NOT *,...] WILL NOT MATCH FOR USER PROJECT GT 7
; AND TARGET PROJECT LE 7
;114 HANDLE [1,1].UFD CORRECTLY. THIS ELIMINATES THE OLD NOTATION
; OF #X0000YY.UFD[1,1]
;115 FIX BUG IN CHKACC LOGIC OF MFD.
;116 FIX BUG IN SYS: INTRODUCED BY 107.
;117 ADD ENTRY .CHKTA FOR DIRECT
;120 INCLUDE "." IN MODULE NAME.
;121 ADD SYMBOLS .WILDZ AND .WILDL FOR START AND LENGTH OF
; LOW CORE AREA
;122 HANDLE NO MFD MESSAGE GRACEFULLY.
;%4(122) -- 12/72 WITH DIRECT %3
;123 ADD ERROR MESSAGE "NO FILE NAME SPECIFIED".
;124 ADD ROUTINE .SCWLD FOR SECONDARY WILDCARD (E.G., OUTPUT)
;125 SIMPLIFY CHECKS FOR END OF DIRECTORY LIST
;126 CHANGE HALT TO JRST AT WILDK
;127 ADD E.LKEN AND .TFILB AS GENERAL SCAN-STYLE TYPEOUTS
;130 CREATE MODULE\WILDDM
;131 DEFAULT OUTPUT PROTECTION IF TO SAME OWNER AS
; INPUT FILE IS XYY WHERE X IS SYSTEM FILE PROT AND YY
; IS COPIED FROM THE INPUT FILE
;132 SUPPORT DATE75
;133 SUPPORT /OKPROT AND /ERPROT. DEFAULT IS /ERPROT
; UNLESS WILD UFD.
;134 FIX BUG IN E.LKEN (EDIT 127)
;135 HANDLE NUL: CORRECTLY
;136 (10-10819) REMOVE BUG IN DECTAPE DIRECTORY READ
;137 GET RIGHT DIRECTORY WHEN UFD READ PROTECT. ERROR
;140 PREFIX ALL ERROR MESSAGES WITH WLDXXX
;141 (10-11421) CHECK /STR/PHY ON DIRECTORY MATCHING
;142 CORRECTLY STORE POINTER TO INPUT SPEC FOR CALLER
;%5(142) DEC, 73
;143 CORRECT BUG IN MULTIPLE DIRECTORY WILD-CARD LOGIC
;144 CORRECT SKIP INSTRUCTION ERROR IN DTA DIRECTORY LOGIC
;145 DON'T DELETE ACCESS TABLES IF WE ARE THE OWNER
;146 ADD ENTRY POINTS .INSTR, .NXSTR
;147 CONVERT TO USE C, SCNMAC AS UNIVERSALS
;150 SUPPORT /MESSAGE FROM .GTWCH
;151 MOVE .PTWRD TO .SCAN
;152 SUPPORT /MESSAGE FROM SCAN
;153 (10-12368) HANDLE UFD NAME CORRECTLY AS A FILE
;154 FIX /STRS ON NON-WILD TO GET RIGHT MESSAGE AND DIRECTORY
;155 IF /OKNONE AND NOT WILD, NO ERROR
;156 (10-12368) SUPPORT /SINC/BEFOR ON DTA
;157 ADD OPTION TO .LKWLD TO INDICATE END OF DIRECTORY
;160 ADD OPTION TO .LKWLD TO SCAN DIRECTORIES BEFORE SFD
;161 SUPPORT /ABEFORE/ASINCE/ERSUPERSEDE/LENGTH/ESTIMATE/VERSION
;162 (QAR 1882) FIX 153
;163 MORE 161
;164 MORE 153
;165 MORE 135
;%6(165) JUNE, 1974
;300 SUPPORT OF 'OR', ETC., (ADD FT$COR)
;301 DEFAULT TO /OKPROTECT IF ANY WILDCARDS
;302 ADD ERROR TWC IF TWO MANY WILD-CARDS ON INPUT
;303 IGNORE SINGLE ACCESS F/S IF NOT OWNED BY THIS JOB
;304 WARN WLDAFP IF ALL FILES PROTECTED
;305 WARN WLDAFR IF ALL FILES REJECT CONDITIONS
;306 (10-13,944) FIX TYPO IN MESSAGE
;307 (QAR 2760) ADD WLDSDP
;310 (QAR 2836) BUG IN 304
;311 ADD WLDSFP
;%7(311) SEPTEMBER, 1974
;312 (10-14727) FIX CHKTST TO WORK WITH FORCED DIRECTORY AND SFD
;313 (10-14841) FIXES TO CODE FOR SECONDARY LOOPUP BLOCKS
;314 (10-14839) SAVE PROTECT FOR LOOKUP ERROR PRINTOUT
;315 (SER S55-076) CORRECT BUG TO FIND FILES IF DEFAULT PATH IS AN
; SFD AND REFERENCE IS ERSATZ
;316 (QAR 3672) HANDLE FIVE DEEP SFDS
;317 DO NOT CLEAR DIRECTORY IF STRUCTURE NOT MOUNTED
;320 ADD EXTERNAL SYMBOL .FRCPP FOR FRCPPN.
;321 ADD NEW ENTRY POINT FOR .INSTR WHICH CAUSES FRCPPN TO BE SET.
;322 MAKE .NXSTR AND .INIST ENTRY POINTS.
;323 DON'T DISCARD SFDS WHEN ERSATZ DEVICE AND FILE IS WILD
;324 (SPR-17317) USE 'SYS' AS 'NEW,SYS' IF /NEW ENABLED
; AND ERSATZ DEVICE SYS IS REQUESTED.
;325 (SPR 10-17642) ALLOW 'NOT' GUIDE WORD TO WORK WITH PPNS
;%7A(325) JANUARY, 1976
;326 ALLOW THE USE OF ERSATZ DEVICES WHEN PATH SET TO AN SFD.
; 18-MAY-76 LCR.
;327 MAKE NEW: GIVE CORRECT RESULTS [1,5] ONLY
; 07-JUN-76 LCR.
;
;330 HANDLE '+' NOTATION. BROKEN BY EDIT [325].
; 07-JUN-76 LCR.
;
;[331] Synchronize the saving of the LOOKUP error code and the PROTECTION code with the POP's.
; Areas affected:E$$LKE:
; L.C.R. 05-Oct-76.
;
;332 SPR # 10-21940 L.C.R. 21-Feb-77.
; Clean up EDIT #327
; Areas affected: STR1:
;
;333 Provide a symbol equal to the version number for
; version checking by programs like QUEUE. LLN, SPR #
; 10-22263, 24-Mar-77
;
;334 SPR # 10-22140 LCR. 08-JUN-77.
; Set on the flag indicating "SEARCHING SYS" when using the construct
; SYSA: or SYSB: so that both [1,5] and [1,4] is searched for these variations.
; Areas affected: INSTR:
;
;335 Remove edits 326 and 323. This prevents %non-existent
; directory errors for certain combinations of directories and
; search lists, but restricts the problem solved by 323.
; LLN, SPR # 10-25314, 12-Jun-78.
;336 REMOVE 2 REDUNDANT LINES FROM EDIT 334 BEFORE INSTR2:
; SPR 10-26341 BY BBE 8/7/78
;337 FIX BUG IN EDIT 154, DIR FOO[1,1] YIELDS
; %WLDNSF NO SUCH FILES AS DSK:FOO.*[FOO]
; SPR 10-26446 BY KPY 10/5/78
;340 FIX BUG IN EDIT 331, P1 NOT PRESERVED
; SPR 10-27435, VLR 15-FEB-79.
;341 SPRS 10-(28960,28962,29648,29708) TARL 28-JUN-80
; Another round with SFDs and ersatz devices. Make .DIR DOC give [5,14]
; when pathed into an SFD, while making .DIR DOC:[,,A] give [5,14,A].
; Install code @STR8 and remove edit 335. Also fix DIRERR - SFDs will be
; zapped @STR8 if needed, so dont zap them here.
;342 29-JUN-80 TARL
; Clean up listing, and insert form feeds.
;343 SPR 29673 RKB 26-Aug-80
; Make DECtapes work again. Affects WILDRR + few.
; DIRSTI was being used without index - use T4
;344 8-Aug-81 PY
; Use extended LOOKUP block for SFDs.
;345 21-Aug-81 PY
; Change version to 7D to be same as SCAN and HELPER.
; Version 7B was never shipped, 7C did not exist.
;346 9-Jul-85 MRB
; Fix to print correct directory name when dealing with UFD's.
; (in routine .TFILE)
;347 6-SEP-85 LEO
; Do Copyrights.
;
;%7D(347) SEPTEMBER, 1985
;; END OF REVISION HISTORY
SUBTTL MISC. DEFINITIONS
;ACCUMULATORS
T1=1 ;SCRATCH
T2=2
T3=3
T4=4
P1=5 ;INDEX TO COMMAND SCANNER DATA BASE
P2=6 ;PRESERVED ACS
P3=7
P=17 ;PUSH DOWN LIST
;CHANNELS
WC==0 ;CHANNEL FOR DIRECTORY READING
DC==0 ;READ DATA (UPDATED BY ARGUMENT)
;FLAGS
DOALDV==1B0 ;DO ALL DEVICES
DIRSFD==1B1 ;DO DIRECTORY BEFORE SFD
DIRSYS==1B3 ;[324] SEARCH ON [1,4] AFTER [1,5]
SUBTTL INITIALIZE AND PRESET CALL
;HERE ON EXTERNAL CALL
.LKWLD: MOVEM P1,SAVEP1 ;SAVE POINTER
HLRZ T2,T1 ;GET LENGTH OF BLOCK
PUSHJ P,.GTWRD## ;GET BLOCK+0
TRNE T3,-1 ;SEE IF END GIVEN
HRR T3,(T3) ;YES--GET END OF SPECS
MOVS T4,T3 ;SWITCH TO START
HRR T4,(T4) ;GET START OF SPECS
TLNN T4,-1 ;SEE IF END SPECIFIED
HRL T4,T4 ;NO--USE START
HLRZM T4,AGLIMS ;STORE END FOR TESTS
TLZ T4,-1 ;CLEAR JUNK FOR LATER
PUSH P,T4 ;SAVE AWAY
PUSHJ P,.GTWRD ;GET BLOCK+1
HLRZM T3,AGOPEN ;SAVE OPEN BLOCK
HRRZM T3,AGLOOK ;SAVE LOOKUP BLOCK
SKIPE AGOPEN ;PROTECT AGAINST JUNK
SKIPN AGLOOK ; ..
HALT .+1 ;BAD USER CALL
PUSHJ P,.GTWRD ;GET BLOCK+2
HRRZM T3,AGLENL ;SAVE LENGTH OF LOOKUP BLOCK
HLRZ T3,T3 ;GET LENGTH OF PARAMETER AREA
MOVEM T3,AGLENP ;SAVE FOR LATER
PUSHJ P,.GTWRD ;GET BLOCK+3
HRRZM T3,AGPNTR ;SAVE LOCATION OF POINTER
HRRZ P1,(T3) ;SETUP USER'S POINTER
MOVEM T3,AGFLAG ;STORE FLAGS
HLLZ T4,T3 ;ISOLATE CHANNEL
TLZ T4,777760 ;REMOVE JUNK
LSH T4,5 ;POSITION FOR UUOS
HLLZM T4,AGDCHN ;SAVE FOR DODCHN ROUTINE
PUSHJ P,.GTWRD ;GET BLOCK+4 [157]
HRRZM T3,AGEODN ;SAVE FOR DIRECTORY READER [157]
POP P,T4 ;RESTORE SPEC POINTER
SUBTTL LOOKUP ONE FILE
JUMPN P1,[SKIPN NOTDSK ;IF ALREADY SETUP, CONTINUE
JRST WILDN ;WITH DISK
MOVE P1,.WILAS ;OR AFTER
JRST LOOKST] ; NON-DISK
MOVX T1,%LDMFD ;GET LOCATION OF MFD
GETTAB T1, ;FROM MONITOR
MOVE T1,[1,,1] ;(LEV C)
MOVEM T1,MFDPPN ;SAVE FOR LATER
IFN FT$SFD,<
SETZM PTHARG ;CLEAR PATH
MOVE T1,[PTHARG,,PTHARG+1]
BLT T1,PTHEND ; ..
MOVE T1,[PTHLEN-1,,PTHARG]
SETOM PTHARG ;-1 MEANS RETURN DEFAULT PATH
PATH. T1, ;GET DEFAULT PATH
SETZM PTHARG ;IF ERROR, CLEAR ARGUMENT
>
GETPPN T1, ;GET USER'S NUMBER
JFCL ;IN CASE OF JACCT
MOVEM T1,MYPPN ;STORE FOR LATER
IFN FT$SFD,<
SKIPN PTHDIR ;SEE IF PATH. WORKED
MOVEM T1,PTHDIR ;NO--SIMULATE IT
>
SKIPA P1,T4 ;BRAND NEW--GET STARTING POINT
;LOOP OVER EACH FILE SPECIFICATION IN THE REQUEST
; TO FIND ANY AND ALL FILES WHICH MATCH IT
LOOKST: ADD P1,AGLENP ;NOT BRAND NEW--ADVANCE PARAMETER
HRRZM P1,@AGPNTR ;STORE CURRENT POINTER FOR USER
CAMG P1,AGLIMS ;SEE IF AT END YET
JRST LOOKGO ;NO--GO DO OUR BIT
SETO T1, ;YES--FLAG ALL DONE
EXCH P1,SAVEP1 ;RESTORE POINTER
POPJ P,
;HERE WHEN AN INPUT REQUEST HAS BEEN SPECIFIED AND SETUP IN P1
LOOKGO: SETZM FWAZER ;CLEAR TEMPORARIES
MOVE T1,[FWAZER,,FWAZER+1] ; ..
BLT T1,LWAZER ; ..
MOVEM P1,.WIFIR ;SAVE STARTING BLOCK
;LOOP TO DISCOVER A SET OF CONCATENATED FILE SPECIFICATIONS
;THE USER HAS CONCATENATED THEM TO CAUSE A SINGLE PASS WILD SEARCH.
LOOK1: MOVEM P1,.WILAS ;SAVE ENDING BLOCK
PUSHJ P,SETDIR ;SETUP DIRECTORY DEFAULTS
LDB T1,[POINTR (.FXMOD(P1),FX.TRM)] ;GET TERMINATION
IFN FT$COR,<
CAIN T1,.FXTRC ;IF "+" [300]
MOVEI T1,.FXTRO ; TREAT AS 'OR' [300]
>
CAIE T1,.FXTRA ;IF 'AND' [300]
CAIN T1,.FXTRO ; OR 'OR' [300]
JRST LOOK1A ; CONTINUE IN SET [300]
CAIE T1,.FXTRN ;UNLESS 'NOT' [300]
JRST DIR1 ; END SET [300]
LOOK1A: MOVE T1,.FXDEV(P1) ;[330] GET DEVICE NAME.
ADD P1,AGLENP ;[330] ADVANCE TO NEXT ONE
CAMN T1,.FXDEV(P1) ;[330] IF NOT SAME DEVICE STOP SCAN
CAMLE P1,AGLIMS ;[325] SEE IF OFF END
JRST DIR1 ;[325] DIFFERENT--IGNORE +
PUSHJ P,SETDIR ;[325] SETUP DIRECTORY DEFAULTS
JRST LOOK1 ;[325] LOOP IF MATCH
;HERE WHEN CONCATENATED REQUESTS HAVE BEEN SELECTED TO DETERMINE
; WHAT TYPE OF SEARCHING TO DO ACROSS STRS
DIR1: MOVE P1,.WIFIR ;REFETCH POINTER
MOVX T1,FX.PHY ;SEE IF USER ASKED FOR PHYS.
TDNN T1,.FXMOD(P1) ; ..
JRST NOTPHY ;NO--SKIP TESTS
MOVSI T1,'SYS' ;YES--SEE IF POSSIBLE
DEVCHR T1,UU.PHY ; BY TRYING ONE
TRNE T1,-1 ;SEE IF GOT SOMETHING BACK
SETOM PHYS ;YES--SET FOR PHYS I/O
NOTPHY: MOVSI T2,.FXDEV(P1) ;POINT TO ARGUMENT AREA
HRRI T2,FSTR ;POINT TO INTERNAL AREA
BLT T2,ENDERR ;COPY FOR ANY ERROR MESSAGES
MOVE T2,.FXDEV(P1) ;GET NAME
PUSHJ P,DOPHYS ;GET PHYSICAL
DEVNAM T2, ; DEVICE
MOVEI T2,0 ; NAME
HLRZ T3,T2 ;SAVE GENERIC PART
SYSSTR T2, ;SEE IF STRUCTURE NAME
SKIPA ;NO--OK
MOVEI T3,0 ;YES--KILL NAME
MOVE T2,.FXDEV(P1) ;FIND OUT IF STRUCTURE SEARCH NECESSARY
PUSHJ P,DOPHYS ;PERFORM PHYSICAL I/O CALL
DEVCHR T2, ;SEE IF DISK TYPE DEVICE
CAIN T3,'NUL' ;SEE IF NUL:
TLO T2,-1-<(DV.TTA)> ;YES--CHANGE DEVCHR BITS
MOVEM T2,DVCH ;SAVE FOR USER
TLC T2,-1-<(DV.TTA)> ;BUT NOT
TLCE T2,-1-<(DV.TTA)> ; NUL:
TXNN T2,DV.DSK ; ..
SKIPA ;BAD
JRST ISDISK ;OK--PROCEED
SKIPL AGFLAG ;SEE IF ALL DEVICES TO BE HANDLED
JRST [MOVE T1,T2 ;NO--POSITION DEVCHR
EXCH P1,SAVEP1 ;RESTORE P1
SETOM NOTDSK ;SET FLAG
POPJ P,] ;AND RETURN
TLC T2,-1-<(DV.TTA)> ;WATCH OUT FOR
TLCE T2,-1-<(DV.TTA)> ; NUL:
TXNN T2,DV.DTA ;SEE IF DECTAPE
SKIPA ;NO
JRST ISDTA ;YES--GO HANDLE
SETOM NOTDSK ;FLAG FOR REENTRY
JRST STR7 ;GO SETUP OPEN BLOCK
ISDTA: SETOM FLDTA ;SET FLAG FOR LATER ON
ISDISK: SETCM T1,.FXNMM(P1) ;GET NAME MASK
IOR T1,.FXNAM(P1) ;AND NAME
JUMPE T1,E$$NFS ;ERROR IF NO NAME SPECIFIED
HLRZ T1,.FXEXT(P1) ;GET EXTENSION
SKIPN FLDTA ;IF NOT DECTAPE
CAIE T1,'UFD' ;AND UFD
SETCM T1,.FXNMM(P1) ;CHECK NAME MASK FOR WILDCARD
JUMPN T1,SEEIFD ;IF SO, GO DO WILD THINGS
MOVEI T2,.FXDIR(P1) ;NO--CHECK DIRECTORY
HRLI T2,-.FXLND ;ENTRY BY ENTRY
NOTPH1: SKIPN (T2) ;CHECK DIRECTORY
SKIPE 1(T2) ; AND WILDCARD
SKIPA ;SOMETHING THERE
JRST NOTPH2 ;IF NULL, MUST BE DONE
SETCM T1,1(T2) ;NO--CHECK DIRECTORY MASK
JUMPN T1,SEEIFD ;IF WILD GO SEE IF LEVEL D
AOS T2 ;ANDVANCE
AOBJN T2,NOTPH1 ;AND LOOP BACK
NOTPH2: SETCM T1,.FXEXT(P1) ;NO--CHECK EXTENSION
CAMN P1,.WILAS ;SEE IF CONCATENATION
TRNE T1,-1 ;TEST EXT. MASK
JRST SEEIFD ;WILD--GO SEE IF LEVEL D
;HERE IF NOT A WILD FILE SPECIFICATION
MOVX T1,FX.STR ;NOT WILD--SEE IF STR WILD
TDNE T1,.FXMOD(P1) ; BEING RQUESTED
SKIPE FLDTA ;AND NOT DTA:
JRST STR7 ;NO--JUST USE USER'S DEVICE
MOVEI T1,1 ;YES--FLAG STR WILD (BUT NOT FILE)
JRST DIR2 ;AND GO SELECT A SEARCH LIST
;HERE WHEN THE FILE IS WILD
SEEIFD: SETOB T1,.WLDFL ;SET WILD FILE FLAG
SKIPE FLDTA ;SEE IF DECTAPE
JRST STR7 ;YES--NO DIRECTORY JUNK
DIR2: MOVX T2,%CNSTS ;SEE IF LEVEL D SYSTEM
GETTAB T2, ; ..
MOVEI T2,0 ;(NO)
TXNN T2,ST%TDS ;TEST FIELD
JRST DIR4 ;NO--NO FUNNY F/S LOGIC
MOVEM T1,.WLDFL ;YES--STORE FILE WILD FLAG
TXNE T2,<ST%TDS-1B9> ;SEE IF 5.03 OR LATER
SETOM SY2RCH ;YES--SET FLAG THAT REAL SYS: SL IS AVAILABLE
SETZM SUBSTR ;INDICATE INTERNAL CALL
PUSHJ P,INSTR ;GO INITIALIZE STR SEARCHING
HALT .+1 ;NOT A DISK!
MOVE P1,.WIFIR ;RESTORE INDEX
JUMPGE T1,STR6 ;IF NOT SEARCHING, SKIP STR LOGIC
SKIPGE .WLDFL ;IF WILD FILES,
SOS .WLDFL ;SET FLAG TO -2 TO INDICATE WILD STRS AS WELL
MOVSI T1,'SYS' ;SEE IF PHYSICAL IS POSSIBLE
DEVCHR T1,UU.PHY ;BY TRYING A DEVICE KNOWN TO EXIST
TRNE T1,-1 ;IF IT WORKED,
SETOM PHYS ; FORCE PHYSICAL SINCE STR NAMES
; SHOULD NOT BE TRANSFORMED
JRST STR1 ;GO GET A STRUCTURE
;HERE IF LEVEL-C WILDCARD INDICATED
;NEED TO CHECK FOR "SYS:" AND FIXUP DIRECTORY IF SO
DIR4: MOVS T1,FSTR ;GET DEVICE
CAIN T1,'SYS' ;SEE IF "SYS:"
PUSHJ P,SETSYS ;YES--SETUP FOR SYS:
JRST STR7 ;PROCEED WITHOUT F/S LOGIC
;BACK HERE TO PROCEED TO NEXT STRUCTURE
STR1: MOVE P1,.WIFIR ;RESET INDEX
PUSHJ P,.NXSTR ;GET NEXT STRUCTURE
JUMPN T1,STR7 ;[324] IF NOT DONE, GO PROCESS THIS STR
MOVX T1,DIRSYS ;[324] WANTS TO SEARCH [1,4] AFTER [1,5] ?
HLRZ T4,.FXDEV(P1) ;[327+332] IS THIS DEVICE 'NEW:' ?
CAIE T4,'NEW' ;[327+332] IF SO, WERE DONE.
TDNN T1,AGFLAG ;[324] FLAGS IN THE CALLING BLOCK
JRST LOOKEN ;[324] NO, DOES NOT WANT
SKIPE SYSRCH ;[324] WERE WE LOOKING ON SOME SYS
SKIPN SY2RCH ;[324] WAS IT REAL SYS
JRST LOOKEN ;[324] NO
MOVX T1,%LDNEW ;[324] GET SYSTEM NEW PPN
GETTAB T1, ;[324] ASK SYSTEM
MOVE T1,[1,,1] ;[324] SYSTEM TOO OLD TO HAVE A NEW!
CAME T1,FRCPPN ;[324] WERE WE LOOKING ON THAT NEW PPN
JRST LOOKEN ;[324] NO, THERFORE WE ARE DONE
;[324] NOW WE CAN RESET FOR 1,4
MOVE T1,.FXDEV(P1) ;[324] RESET DEVICE NAME
MOVEM T1,FSTR ;[324] NEEDED BY INSTR
SETZM SUBSTR ;[324] INTERNAL CALL
PUSHJ P,INSTR ;[324] INITIALIZE STR SEARCHING
HALT .+1 ;[324] NOT A DISK!
MOVE P1,.WIFIR ;[340] RESET INDEX
PUSHJ P,SETSYS ;[324] SET FRCPPN TO SYSTEM SYS [1,4]
SKIPE SRCH ;[332] NO STRUCTURES NEEDED FALL THROUGH
JRST STR1 ;[324] STAT FIRST STRUCTURE
;HERE WHEN NO NEED TO SEARCH STRUCTURES
STR6: SKIPL .WLDFL ;SEE IF WILD FILE FLAG
SETZM .WLDFL ;YES--CLEAR WILD CARD INDICATOR
;HERE TO START ONE DEVICE (FILE STRUCTURE)
STR7: AOS NOSTRS ;COUNT STR SELECTED
MOVX T1,FX.DIR ;[341]DIRECTORY SPECIFIED BIT
SKIPE FRCPPN ;[341]ERSATZ DEVICE ?
TDNE T1,.FXMOD(P1) ;[341]AND NO PATH GIVEN ?
JRST STR8 ;[341]NOPE - LEAVE IT ALONE
SETZM .FXDIR+2(P1) ;[341]ZAP SFDS IN CASE WERE PATHED INTO ONE
SETZM .FXDIM+2(P1) ;[341]ZAP THE MASK TOO
STR8: PUSHJ P,SETOPN ;SETUP AN OPEN BLOCK
MOVE T4,DVCH ;GET DEVICE CHARS
TLC T4,-1-<(DV.TTA)> ;SEE IF NUL:
TLCE T4,-1-<(DV.TTA)> ;IF SO, NOT MAG TAPE
TXNN T4,DV.MTA ;XEE IF MAG TAPE
JRST NOTMTA ;NO--PROCEED
MOVX T4,FX.PAR ;GET BIT FOR TEST
TDNE T4,.FXMOD(P1) ;SEE IF /PAR:EVEN
TXO T1,IO.PAR ;YES--SET INTO OPEN
LDB T4,[POINTR (.FXMOD(P1),FX.DEN)] ;GET /DEN
DPB T4,[POINTR (T1,IO.DEN)] ;SET INTO OPEN
NOTMTA: MOVE T4,AGOPEN ;POINT TO USER AREA
MOVEM T1,(T4) ;STORE PHYSICAL BIT, ETC.
MOVEM T2,1(T4) ;STORE DEVICE NAME
MOVEI T3,B.DC ;POINT TO BUFFER HEADER FOR INPUT
MOVEM T3,2(T4) ;STORE FOR USER
SKIPE NOTDSK ;SEE IF NOT DIRECTORY
JRST UFD6 ;RIGHT--GO GIVE ANSWERS
SETZB T4,DEPTH ;CLEAR DEPTH OF NEST
JRST WILDSN ;GO START A NEW UFD
;BACK HERE TO GET NEXT FILE IN THIS DIRECTORY
WILDN: MOVE P1,.WIFIR ;RESET SPEC POINTER
MOVE T4,DEPTH ;SET INDEX TO TABLES
SETZB T3,DIRBU(T4) ;CLEAR DIRECTORY AT THIS LEVEL
LSH T4,1 ;GET DOUBLE WORD POINTER
SETZM UFDPPN(T4) ;CLEAR ERROR MESSAGE STORAGE
SETZM UFDPPN+1(T4) ; AND ITS MASK
LSH T4,-1 ;REPOSITION COUNTER
SKIPG DIRSTI(T4) ;SEE IF WILD AT THIS LEVEL
JRST WILDE ;NO--PRETEND EOF THIS DIRECTORY
SKIPE DIRFLG ;SEE IF DIRECTORY BEING REPEATED
JRST WILDP ;YES--DON'T ADVANCE BUFFER
SOSGE BUFCNT(T4) ;COUNT DOWN FILES IN THIS BLOCK
JRST WILDR ;NON LEFT--GO READ NEXT BLOCK
MOVEI T3,2 ;OK--ADVANCE TWO WORDS
SKIPE FLDTA ;SEE IF DECTAPE
MOVEI T3,1 ;YES--ADVANCE ONE WORD
WILDP: ADDB T3,BUFPOS(T4) ;NOTE NEW POSITION
SKIPE FLDTA ;SEE IF DECTAPE
ADDI T3,^D84 ;POSITION TO FILE NAME
MOVE T1,.WLDBF-2(T3) ;GET FILE NAME
JUMPE T1,WILDN ;NULL--LOOP FOR NEXT FILE
SKIPE FLDTA ;SEE IF DECTAPE
ADDI T3,^D21 ;POINT TO EXTENSION
HLRZ T2,.WLDBF-1(T3) ;GET EXTENSION
SKIPE FLDTA ;SEE IF DECTAPE
JRST WILDF ;YES--NO DIRECTORY JUNK
CAIN T2,'SFD' ;SEE IF SUB-FILE DIRECTORY
JUMPN T4,WILDS ;YES--GO HANDLE
SKIPGE FNDSFD(T4) ;IF REPEATING FOR SFD'S [160]
JRST WILDN ; IGNORE ALL OTHER FILES [160]
CAIN T2,'UFD' ;SEE IF DIRECTORY
JUMPE T4,WILDU ;YES--GO HANDLE
WILDF: LSH T4,1 ;DOUBLE DEPTH
ADDI T4,(P1) ;POINT TO INPUT SPEC
MOVEI T3,0 ;IN CASE ERSATZ [315]
SKIPE DEPTH ;SEE IF UFD READING, [315]
SKIPN FRCPPN ; AND ERSATZ, [315]
JRST [MOVE T3,DEPTH ;GET DEPTH [316]
CAIL T3,.FXLND ;SEE IF IN RANGE [316]
TDZA T3,T3 ;NOT. CLEAR [316]
MOVE T3,.FXDIM(T4);GET DIRECTORY MASK [316]
JRST .+1] ;AND CONTINUE [316]
JUMPN T3,WILDN ;JUMP IF NO FILE LEGAL [315]
;HERE WHEN FOUND A POSSIBLE FILE--SEE IF IT MATCHES
AOS NOFIL ;COUNT FILE AS SEEN
WILDC: MOVE T3,T1 ;GET THIS FILE
XOR T3,.FXNAM(P1) ;COMPARE
HRLZ T4,T2 ;GET THIS EXT
XOR T4,.FXEXT(P1) ;COMPARE,,FETCH MASK
TDNN T3,.FXNMM(P1) ;CHECK NAME
TLNE T4,(T4) ;CHECK EXT
JRST WILDCP ;FAIL--GO LOOP
JRST UFD7 ;WIN--GO GIVE ANSWER TO USER
WILDCP: ADD P1,AGLENP ;ADVANCE SPEC POINTER
CAMG P1,.WILAS ;SEE IF STILL IN RANGE
JRST WILDC ;YES--GO BACK AND CHECK
JRST WILDN ;NO--GO GET NEXT FILE
;BACK HERE WHEN NEW DIRECTORY AND NO WILDCARD NEEDED
WILDNW: SKIPN DEPTH ;IF TOP LEVEL, [154]
SKIPN T1,FRCPPN ; AND NOT FORCING DIRECTORY [154]
MOVE T1,.FXDIR(T3) ;GET NAME
SETOM DIRSTI(T4) ;SET -1 FOR NO-WILD FLAG
MOVE T4,T3 ;SETUP INDEX TO ARGS
JRST WILDK ;GO HANDLE DIRECTORY
;HERE WHEN UFD OR SFD SEEN IN SCANNING THE DIRECTORIES
WILDS: SKIPL FNDSFD(T4) ;UNLESS SFD SECOND PASS, [160]
SKIPE DIRFLG ;SEE IF DIRECTORY REPEATED
JRST WILDL ;YES--HANDLE AS DIRECTORY NOW
MOVX T3,DIRSFD ;SEE IF USER WANTS SFD LATER [160]
TDNE T3,AGFLAG ; (IT'S SLOWER) [160]
JRST [AOS FNDSFD(T4) ;YES--INDICATE ONE FOUND [160]
JRST WILDF] ;AND DO THIS AS FILE NOW [160]
SETOM DIRFLG ;NOT YET--SET FLAG
JRST WILDF ;AND HANDLE AS FILE FIRST
WILDU:
WILDL: SETZM DIRFLG ;CLEAR DIRECTORY FLAG
LSH T4,1 ;DOUBLE DEPTH INDEX
ADDI T4,(P1) ;POINT TO INPUT SPEC
WILDK: SKIPN DEPTH ;SEE IF TOP LEVEL [154]
SKIPN T3,FRCPPN ;YES--SEE IF FORCING PPN [154]
MOVE T3,.FXDIR(T4) ;NO--GET THIS DIRECTORY IN REQUEST
JUMPE T3,WILDN ;NO--GO HANDLE AS FILE
MOVE T3,DEPTH ;YES--GET DEPTH OF OUR WORK
MOVEM T1,DIRBU(T3) ;SAVE DIRECTORY NAME
LSH T3,1 ;DOUBLE POINTER
MOVEM T1,UFDPPN(T3) ;STORE FOR POSSIBLE ERROR MESSAGE
SETOM UFDPPN+1(T3) ;SET MASK ON FULL
SKIPN DEPTH ;SEE IF TOP LEVEL [154]
SKIPN FRCPPN ;YES--SEE IF FORCING PPN [154]
SKIPA ;NO [154]
JRST WILDJ ;YES--MATCH [154]
XOR T1,.FXDIR(T4) ;COMPARE TO REQUEST
TDNE T1,.FXDIM(T4) ;SEE IF MATCH
JRST WILDN ;NO--GO TRY AGAIN
JUMPN T3,WILDJ ;SEE IF UFD
SKIPE T1,.FXDIM(T4) ;YES--SEE IF [*,NOT*]
TLNE T1,-1 ; ..
JRST WILDJ ;NO--OK TO PROCEED
MOVE T1,MYPPN ;YES--GET OUR NUMBER
MOVE T2,UFDPPN ;AND TARGET NUMBER
TLNE T1,777770 ;SEE IF WE ARE GT PROJ 7
TLNE T2,777770 ;AND TARGET IS LE PROJ 7
JRST WILDJ ;NO--PROCEED
JRST WILDN ;YES--SKIP MATCH SINCE THIS
; IS TO A SYSTEM FILE FROM USER
WILDJ: AOS T4,DEPTH ;LOOKS GOOD--ADVANCE DEPTH OF SEARCH
CAIG T4,.FXLND ;SEE IF TOO DEEP
JRST WILDSN ;NO--PROCEED
SOS DEPTH ;YES--BACK UP
JRST WILDN ;AND TRY AGAIN
;HERE WHEN NEW DIRECTORY SELECTED
WILDSN: MOVEI T3,(T4) ;GET DEPTH
LSH T3,1 ;DOUBLE IT
ADDI T3,(P1) ;POINT TO INPUT SPEC
CAIN T4,.FXLND ;[341] NO, SEE IF LIMIT OF DIRECTORY
JRST WILDSG ;[341] YES, GO WITH MATCH
SKIPE FRCPPN ;[341] IF PPN FORCED,
JUMPE T4,WILDNW ;[341] AND MFD LEVEL, TREAT AS NOT WILD.
SETCM T2,.FXDIM(T3) ;GET MASK
JUMPE T2,WILDNW ;IF NO WILD CARD, GO DOWN ONE LEVEL
SKIPE .FXDIR(T3) ;OF RESQUESTED DIRS
JRST WILDD ;NO---SKIP ON
WILDSG: AOS NOUFDF ;YES--COUNT DIRECTORY AS FOUND
AOS NSUFD ;PRECOUNT SUCCESSFUL LOOKUP
SKIPL .WLDFL ;SEE IF WILD FILE NAME
JRST UFD6 ;NO--GIVE TO CALLER
WILDD: SETZM DIRSTI(T4) ;CLEAR USETI POINTER
;HERE WHEN TIME TO READ NEXT BLOCK OF A DIRECTORY
WILDR: MOVEI T1,100 ;SET FOR 100
SKIPE FLDTA ;SEE IF DECTAPE
MOVEI T1,^D22 ;YES--ONLY 22 FILES
MOVEM T1,BUFCNT(T4) ; FILES IN A BLOCK
SETZM BUFPOS(T4) ;CLEAR POSITION IN BLOCK
WILDRR: PUSHJ P,SETOPN ;SETUP OPEN BLOCK
HRRI T1,.IODMP ;READ IN DUMP MODE
SKIPE FLDTA ;SEE IF DECTAPE [136,144]
TXO T1,IO.NSD!IO.SSD ;YES--SET SEMI-STANDARD MODE [136]
OPEN WC,T1 ;OPEN WILD CHANNEL
JRST E.UFO ;ERROR--GO ISSUE MESSAGE
SKIPN FLDTA ;SEE IF DECTAPE
JRST WILDRD ;NO--CHECK DIRECTORY
SKIPLE DIRSTI(T4) ;[343] SEE IF FIRST TIME HERE
JRST WILDE ;NO--GO HANDLE AS EOF
MOVEI T1,^D100 ;SET FOR DECTAPE POSITION
MOVEM T1,DIRSTI(T4) ;[343] FLAG FOR NEXT TIME
JRST WILDRI ;GO READ BUFFER
WILDRD: SETZM DIRBU-1 ;ALWAYS CLEAR SWITCHES (AND MFD)
MOVE T1,DIRBU-1(T4) ;GET THIS DIRECTORY'S NAME
SETZM DIRBU-1(T4) ;CLEAR DIRECTORY
CAIG T4,1 ;SEE IF UFD
JRST WILDRM ;YES--GO HANDLE IT
MOVSI T2,'SFD' ;SET FOR SFD
MOVEI T4,DIRB ;POINT TO PATH
MOVEI T3,1 ;INDICATE NO
MOVEM T3,DIRBS ; DIRECTORY SCANNING
SKIPN DIRBU+1 ;SEE IF FIRST SFD
MOVE T4,DIRBU ;YES--GET UFD
JRST WILDRL ;GO LOOKUP DIRECTORY
WILDRM: MOVSI T2,'UFD' ;SET UFD
MOVE T4,MFDPPN ;SET MFD
SKIPN T1 ;SEE IF TOP LEVEL
MOVE T1,T4 ;YES--READ MFD ITSELF
WILDRL: MOVEM T1,FDBLK+.RBNAM ;[344] STORE THE NAME
MOVEM T2,FDBLK+.RBEXT ;[344] AND THE EXTENSION
MOVEM T4,FDBLK+.RBPPN ;[344] AND THE PPN
MOVEI T2,5 ;[344] GET THE BLOCK LENGTH
MOVEM T2,FDBLK ;[344] STORE THAT TOO
LOOKUP WC,FDBLK ;[344] LOOKUP DIRECTORY
JRST E.UFL ;ERROR--GO GIVE MESSAGE
PUSHJ P,WILDFD ;[344] PUT LOOKUP INFO IN ACCS
SETZM DIRBU-1 ;CLEAR SWITCHES (AND MFD)
SKIPE T4,DEPTH ;RESTORE DEPTH
MOVEM T1,DIRBU-1(T4) ;SET DIRECTORY
HLRZ T1,T3 ;GET PROTECTION CODE
ANDI T1,(RB.PRV) ;CLEAR TO JUST DIRECT. PROT.
HRLI T1,.ACSRC ;SET SEARCH DIRECTORY FUNCTION
MOVE T3,MYPPN ;GET USER'S NUMBER
SKIPN T2,DIRBU ;GET DIRECTORY OWNER
MOVE T2,MFDPPN ;IF MFD, USE MFD NUMBER
MOVEI T4,T1 ;POINT TO ARGS
CHKACC T4, ;CHECK ACCESS RIGHTS
MOVEI T4,0 ;(ASSUME OK)
MOVEI T2,ERPRT% ;SET PROTECTION ERROR JUST IN CASE
HRLZ T3,T1 ;RESTORE PROTECTION JUST IN CASE
JUMPN T4,E.UFL1 ;GIVE ERROR IF NOT PERMITTED
MOVE T4,DEPTH ;RESTORE DEPTH INDEX
AOS T1,DIRSTI(T4) ;ADVANCE BLOCK COUNT
CAILE T1,1
WILDRI: USETI WC,(T1) ;POSITION FILE
MOVE T1,[-200,,.WLDBF-1]
MOVEI T2,0 ;SETUP DUMP LIST
IN WC,T1 ;READ BUFFER
JRST WILDRK ;OK
STATZ WC,IO.ERR ;SEE IF ANY ERRORS
PUSHJ P,E.UFE ;YES--GO TELL USER
STATO WC,IO.EOF ;SEE IF END OF FILE
JRST WILDRK ;NO--PROCEED WITH THIS BLOCK
;HERE AT END OF FILE IN A DIRECTORY
WILDE: MOVEI T1,CL.ACS ;DON'T UPDATE ACCESS DATE [145]
MOVE T2,DIRBU ;IDENTIFY OWNER [145]
CAME T2,MYPPN ;SEE IF SELF [145]
TRO T1,CL.DAT ;NO--DELETE ACCESS TABLE [145]
CLOSE WC,(T1) ;CLOSE DELETING ACCESS TABLES [145]
RELEAS WC, ;RELEASE CHANNEL
MOVE P1,SAVEP1 ;RESTORE AC [157]
SKIPE AGEODN ;SEE IF USER WANTS TO HEAR [157]
PUSHJ P,@AGEODN ; AT EO DIRECTORY [157]
MOVE P1,.WIFIR ;RESTORE INDEX [157]
MOVE T4,DEPTH ;GET DEPTH AS INDEX [160]
SKIPE T1,FNDSFD(T4) ;SEE IF NEED SECOND PASS FOR SFD [160]
JRST [SETZM FNDSFD(T4) ;YES--INDICATE DONE [160]
JUMPL T1,.+1 ;IF END OF SECOND PASS, DONE [160]
SETOM FNDSFD(T4) ;ELSE, FLAG FOR SECOND PASS [160]
JRST WILDD] ;AND DO SECOND PASS [160]
SOSGE T4,DEPTH ;BACK OFF DEPTH
JRST STR1 ;DONE WITH MFD--GO TO NEXT STR
SETZM DIRBU(T4) ;CLEAR DIRECTORY ENTRY
SOSL DIRSTI(T4) ;BACKUP BUFFER INDEX(TO FILE)
JRST WILDRR ;AND RE-READ BUFFER
JRST WILDN ;NOT WILD--GO UP AGAIN
WILDFD: MOVE T2,FDBLK+.RBEXT ;[344] GET THE EXTENSION
MOVE T3,FDBLK+.RBPRV ;[344] AND THE PROTECTION
MOVN T4,FDBLK+.RBSIZ ;[344] AND MINUS SIZE
HRLZ T4,T4 ;[344] PUT IT IN THE LEFT HALF
POPJ P, ;[344] AND RETURN
;HERE WHEN BLOCK READ
WILDRK: CLOSE WC,CL.ACS ;DON'T UPDATE ACCESS DATES
RELEAS WC,
JRST WILDN ;AND GO READ FOR FILES
;HERE WHEN FILE PRESUMED (NO WILD CARD)
UFD6: MOVE T1,.FXNAM(P1) ;GET USER'S NAME
HLRZ T2,.FXEXT(P1) ;AND EXTENSION
AOS NOFIL ;COUNT FILE SEEN
;HERE WHEN A FILE IS FOUND
;SETUP ANSWER BLOCK FOR CALLING PROGRAM
UFD7: AOS NOFILF ;COUNT FILE FOUND
MOVEM T1,FNAM ;SAVE FILE NAME
HRLZM T2,FEXT ;SAVE FILE EXTENSION
MOVE T2,AGLENL ;GET LENGTH OF LOOKUP BLOCK
MOVE T1,AGLOOK ;GET START OF LOOKUP BLOCK
MOVEI T3,-1(T2) ;SET LENGTH IN BLOCK
PUSHJ P,.PTWRD## ;STORE IN BLOCK+0
IFE FT$SFD,<
MOVE T3,UFDPPN
>
IFN FT$SFD,<
SKIPN DIRBU+1 ;SEE IF PATH NEEDED
SKIPA T3,DIRBU ;NO--GET UFD
MOVEI T3,DIRB ;YES--SETUP POINTER
>
JUMPN T3,UFD8 ;IF DIRECTORY SETUP, PROCEED
MOVX T4,FX.DIR ;SEE IF USER SAID NO DIRECT.
TDNE T4,.FXMOD(P1) ; ...
MOVE T3,MFDPPN ;NO--SO MUST BE MFD
UFD8: MOVE T4,T3 ;SAVE FOR LATER
PUSHJ P,.PTWRD## ;STORE IN BLOCK+1
MOVE T3,FNAM ;GET FILE NAME
PUSHJ P,.PTWRD## ;STORE IN BLOCK+2
HLLZ T3,FEXT ;GET EXTENSION
PUSHJ P,.PTWRD## ;STORE IN BLOCK+3
MOVEI T3,0 ;CLEAR PRIV WORD
PUSHJ P,.PTWRD## ;STORE IN BLOCK+4
MOVE T3,T4 ;GET DIRECTORY AGAIN FOR LEVEL C
PUSHJ P,.PTWRD## ;STORE IN BLOCK+5
MOVEI T3,0 ;ZERO ALL THE REST
PUSHJ P,.PTWRD## ;STORE IN BLOCK+6, ETC.
JUMPG T2,.-1 ;LOOP UNTIL DONE
MOVEM P1,@AGPNTR ;UPDATE ARG POINTER FOR CALLER [142]
EXCH P1,SAVEP1 ;RESTORE ARGUMENT
SETCM T2,FLDTA ;GET -1 IF DISK, 0 IF DECTAPE
SKIPE NOTDSK ;SEE IF NOT DIRECTORY DEVICE
MOVEI T2,1 ;RIGHT--SET FLAG
MOVE T1,DVCH ;RESTORE DEVICE CHARS.
JRST CPOPJ1 ;RETURN SUCCESSFULLY
;.CHKTM -- SUBROUTINE TO CHECK CREATION DATE/TIME OF FILE
; AGAINST /BEFORE AND /SINCE SWITCHES
; FOR DISK FILES, IT ALSO CHECKS /ABEFORE/ASINCE
; AGAINST ACCESS DATE AND /LENGTH AGAINST FILE LENGTH
;.CHKTA -- DITTO EXCEPT TESTS FOR ANY DEVICE
;CALL: (AFTER LOOKUP AFTER LAST RETURN FROM .LKWLD)
; PUSHJ P,.CHKTM
; RETURN IF TOO OLD OR TOO YOUNG
; RETURN IF OK
;USES T1-4
.CHKTM::SKIPE NOTDSK ;SEE IF NONDIRECTORY
SKIPE FLDTA ; AND NOT DECTAPE [156]
SKIPA ;OK--GO DO [156]
JRST CPOPJ1 ;YES--ASSUME OK
.CHKTA::MOVE T1,AGLOOK ;GET POINTER TO LOOKUP BLOCK
MOVE T2,.RBPRV(T1) ;CREATION TIME/DATE MUST EXIST
LDB T3,[POINTR (.RBEXT(T1),RB.CRX)]
LSH T3,WID(RB.CRD) ;GET EXTENSION OF CREATION DATE
SKIPE FLDTA ;IF DECTAPE, [156]
TDZA T1,T1 ; NO CREATION TIME [156]
LDB T1,[POINTR (T2,RB.CRT)] ;GET CREATION TIME
IMULI T1,^D60000 ;CONVERT TO MILLI-SEC.
ANDI T2,RB.CRD ;MASK DATE
ADD T2,T3 ;COMBINE WITH DATE EXTENSION
PUSHJ P,.CNVDT## ;CONVERT TO INTERNAL FORMAT
MOVEM T1,FLCRDT ;STORE FOR LOOP [300]
MOVE T1,AGLOOK ;POINT TO LOOKUP BLOCK [300]
MOVE T2,.RBEXT(T1) ;GET ACCESS DATE [161]
ANDX T2,RB.ACD ;REMOVE JUNK [161]
MOVEI T1,0 ;CLEAR TIME [161]
PUSHJ P,.CNVDT## ;CONVERT TO INTERNAL FORMAT [161]
MOVEM T1,FLACDT ;STORE FOR LOOP [300]
;LOOP OVER EACH SPEC IN THE CONCATENATED SET LOOKING FOR MATCH
MOVE T4,.WIFIR ;START AT START [300]
;HERE WHEN WINNING SO FAR
CHKTML: PUSHJ P,CHKTST ;TEST NEXT SPEC FOR MATCH
JRST CHKTMB ;NO--BAD MATCH
CHKTMD: LDB T1,[POINTR (.FXMOD(T4),FX.TRM)] ;GET TERMINATOR
JRST @[CPOPJ1 ;END--WIN BIG
CHKTMC ;'AND'--NEXT MUST ALSO WIN
CPOPJ1 ;'OR'--WIN BIG
CHKTMN ;'NOT'--NEXT MUST NOT WIN
CPOPJ1 ;+ (INDEPENDENT OF FT$COR)--WIN BIG
CPOPJ1 ; (5)--ASSUME WIN BIG
CPOPJ1 ; (6)--ASSUME WIN BIG
CPOPJ1](T1) ; (7)--ASSUME WIN BIG
;HERE WHEN OK SO FAR, THEN 'NOT'
CHKTMN: PUSHJ P,CHKTAD ;ADVANCE TO NEXT SPEC
JRST CPOPJ1 ;NOT THERE!--ASSUME BIG WIN
PUSHJ P,CHKTST ;TEST FOR MATCH
JRST CHKTMD ;NO--PROCEED TO NEXT BASED ON SEPARATOR
;HERE WHEN LOST--MUST WAIT FOR NEXT 'OR' TO WIN
CHKTMB: LDB T1,[POINTR (.FXMOD(T4),FX.TRM)] ;GET TERMINATOR
JRST @[CHKTMF ;END--LOOSE BIG
CHKTMS ;'AND'--SKIP ON
CHKTMC ;'OR'--START MATCHING OVER
CHKTMS ;'NOT'--SKIP ON
CHKTMP ; + --DEPENDS ON FT$COR
CHKTMF ; (5)--ASSUME LOOSE BIG
CHKTMF ; (6)--ASSUME LOOSE BIG
CHKTMF](T1) ; (7)--ASSUME LOOSE BIG
;HERE WHEN SKIPPING TO NEXT 'OR' BECAUSE LOOSING
CHKTMS: PUSHJ P,CHKTAD ;ADVANCE TO NEXT SPEC
JRST CHKTMF ;IF DONE, LOOSE BIG
JRST CHKTMB ;IF SOMETHING, REDISPATCH
;HERE WHEN WINNING AND 'AND' ENCOUNTERED
CHKTMC: PUSHJ P,CHKTAD ;ADVANCE TO NEXT
JRST CPOPJ1 ;IF DONE, ASSUME WIN BIG
JRST CHKTML ;THEN GO TEST THIS ALSO
;HERE IF TOO OLD OR TOO YOUNG
; BACK DOWN SUCCESS COUNTER
CHKTMF: SOS NOFILF ;DECREMENT SUCCESS COUNTER
AOS NOFILR ;COUNT REJECTED FILE [305]
POPJ P, ;GIVE BAD NEWS TO CALLER
;DEFINE + BEHAVIOUR
IFN FT$COR,<CHKTMP==CHKTMC>
IFE FT$COR,<CHKTMP==CHKTMF>
;CHKTST -- CHECK TO SEE IF CURRENT SPEC MATCHES FILE
;CALL: MOVE T4,ADDR OF SPEC
; PUSHJ P,CHKTST
; NON-SKIP IF NO MATCH
; SKIP IF MATCH
;USES T1-3
CHKTST: MOVE T3,AGLOOK ;GET RIB POINTER [161]
HLLZ T2,.RBEXT(T3) ;GET EXTENSION
XOR T2,.FXEXT(T4) ;COMPARE TO MATCH
MOVX T1,FX.NUL ;IF USER OMITTED THE
TDNE T1,.FXMOD(T4) ; EXTENSION, THEN
TLZ T2,-1 ; IGNORE IT IN TEST
MOVE T1,.RBNAM(T3) ;GET FILE NAME
XOR T1,.FXNAM(T4) ;COMPARE TO MATCH
TDNN T1,.FXNMM(T4) ;TEST AGAINST MASK
TLNE T2,(T2) ;TEST AGAINST MASK
POPJ P, ;NO--FAIL
SKIPN T1,.RBPPN(T3) ;GET DIRECTORY [312]
JRST CHKTS1 ;NONE--ASSUME MATCH DIRECTORY [312]
TLNN T1,-1 ;SEE IF SFD [312]
MOVE T1,2(T1) ; YES, GET DIRECTORY FROM PATH BLOCK [312]
CAMN T1,FRCPPN ;SEE IF BEING FORCED
JRST CHKTS1 ;FORCED--ASSUME MATCH DIRECTORY
SKIPE FRCPPN ;SEE IF FORCING
POPJ P, ;YES--DIDN'T MATCH SO REJECT
SKIPN .FXDIR(T4) ;SEE IF LEFT AT [-]
JRST CHKTS1 ;YES--ASSUME MATCH
IFN FT$SFD,<
MOVE T1,.RBPPN(T3) ;GET DIRECTORY AGAIN [312]
TLNE T1,-1 ;SEE IF SFD
JRST CHKTSU ;NO--JUST CHECK UFD
MOVEI T2,(T4) ;GET COPY OF SPEC POINTER
HRLI T1,-.FXLND ;PROTECT END
CHKTSS: MOVE T3,.PTPPN(T1) ;GET SFD DIRECTORY
XOR T3,.FXDIR(T2) ;COMPARE TO SPEC
SKIPN .FXDIR(T2) ;SEE IF MATCH =0
SKIPN T3 ;YES--ERROR IF VALUE NOT 0
TDNE T3,.FXDIM(T2) ;TEST MASK
POPJ P, ;ERROR IF NOT MATCH
SKIPN .PTPPN(T1) ;SEE IF END
JRST CHKTS1 ;YES--WIN ON DIRECTORY
ADDI T2,2 ;ADVANCE SPEC BIWORD
AOBJN T1,CHKTSS ;LOOP OVER DIRECTORY
JRST CHKTS1 ;WIN IF ALL MATCH
>
CHKTSU: XOR T1,.FXDIR(T4) ;MATCH UFD
IFN FT$SFD,<
SKIPE .FXDIR+2(T4) ; (MAKE SURE
SKIPN .FXDIM+2(T4) ; SFDS)
>
TDNE T1,.FXDIM(T4) ;TEST MASK
POPJ P, ;FAIL IF BAD
;NOW TEST SWITCHES
CHKTS1: MOVE T2,AGLENP ;GET BLOCK LENGTH [161]
MOVE T1,FLCRDT ;GET CREATION DATE-TIME [300]
SKIPLE .FXBFR(T4) ;SEE IF /BEFORE GIVEN
CAMG T1,.FXBFR(T4) ;YES--SEE IF TOO YOUNG
CAMGE T1,.FXSNC(T4) ;SEE IF TOO OLD
POPJ P, ;NO--REJECT
CAILE T2,.FXASN ;SEE IF INCLUDES /ASINCE/ABEFORE [161]
SKIPE FLDTA ; AND IF DISK [161]
JRST CPOPJ1 ;NO--ALL DONE WITH TESTS [161]
MOVE T1,FLACDT ;GET ACCESS DATE [300]
SKIPLE .FXABF(T4) ;SEE IF /ABEFORE [161]
CAMG T1,.FXABF(T4) ;YES--SEE IF OK [161]
CAMGE T1,.FXASN(T4) ;OK--COMPARE TO /ASINCE [161]
POPJ P, ;BAD--REJECT [161]
MOVE T3,AGLOOK ;GET POINTER TO FILE SPEC
SKIPL T1,.RBSIZ(T3) ;IF FILE LENGTH SET, [161]
CAIG T2,.FXFLM ; AND SCAN INCLUDES /LENGTH, [161]
JRST CPOPJ1 ;NO--ACCEPT AS OK [161]
SKIPL .FXFLM(T4) ;SEE IF MAX SET [161]
CAMG T1,.FXFLM(T4) ;YES--COMPARE [161]
CAMGE T1,.FXFLI(T4) ;CHECK MIN [161]
POPJ P, ;BAD--REJECT FILE [161]
JRST CPOPJ1 ;JUST RIGHT--GIVE OK RETURN
;CHKTAD -- ROUTINE TO ADVANCE WITHIN A CONCATENATED SPEC
; MAINTAINS T4 AND AGPNTR
CHKTAD: ADD T4,AGLENP ;ADVANCE TO NEXT SPEC
CAMG T4,.WILAS ;SEE IF DONE
AOSA (P) ;NO--SKIP RETURN
MOVE T4,.WIFIR ;YES--GET CLEAN POINTER
MOVEM T4,@AGPNTR ;STORE POINTER
POPJ P, ;RETURN
;HERE AT END OF A REQUEST TO SEE IF ANYTHING WAS FOUND
;IF NOT, AN APPROPRIATE ERROR MESSAGE WILL BE TYPED
LOOKEN: MOVX T1,FX.NOM ;SEE IF WE CARE IF ANY MATCHED
TDNE T1,.FXMOD(P1) ; ..
JRST LOOKNY ;NO--NO WARNINGS AT ALL [311]
HRLZI T1,.FXDEV(P1) ;COPY ORIGINAL REQUEST
HRRI T1,FSTR ; INTO ANSWER AREA
BLT T1,ENDERR ; FOR TYPE OUT
SKIPE NOFILF ;SEE IF ANYTHING FOUND
JRST [SKIPN NOFILP ;YES--SEE IF ANY FILES OR [311]
SKIPE NODIRP ; DIRECTORIES PROTECTED [311]
JRST E$$SFP ;YES--WARN USER [311]
JRST LOOKNY] ;NO--JUST EXIT NORMALLY [311]
SKIPE NOFILR ;SEE IF REJECTIONS [305]
JRST E$$AFR ;YES--INDICATE THAT [305]
SKIPE NODIRP ;SEE IF DIRECTORY PROT FAILURE [307]
JRST E$$SDP ;YES--ISSUE ERROR [307]
SKIPE NOFILP ;SEE IF PROTECT. FAILURES [304]
JRST E$$AFP ;YES--ISSUE ERROR [304]
SKIPE NOFIL ;NO--SEE IF ANY FILES EXAMINED
JRST E$$NSF ;YES--JUST NO SUCH FILES
SKIPE NOUFDF ;NO--SEE IF ANY DIRECTORIES MATCHED
JRST E.DEM ;YES--DIRECTORY EMPTY
SKIPE T2,LASERR ;SEE IF ANY ERRORS LEFT LYING AROUND
JRST DLYERR ;YES--GO GIVE THEM AS EXPLANATION
SKIPE NOSTRS ;SEE IF ANY STRUCTURES FOUND
JRST E$$NSD ;YES--JUST NO SUCH DIRECTORY
;ERROR: SEARCH LIST IS EMPTY
E$$SLE: MOVE T1,['SLE',,[ASCIZ /Search list empty for device /]]
PUSHJ P,WLDWRN ;ISSUE WARNING MESSAGE
JRST LOOKNX ;SKIP REST IF NOT /VERB:FIRST
PUSHJ P,TYPSTR ;AND STR NAME
JRST LOOKNX ;AND RETURN
;ERROR: NO DIRECTORY MATCHES THE USER'S REQUEST
E$$NSD: MOVE T1,['NSD',,[ASCIZ /No such d/]] ;NO--NO SUCH DIRECTORY
PUSHJ P,WLDWRN ;ISSUE WARNING
JRST LOOKNX ;SKIP REST IF NOT /VERB:FIRST
PUSHJ P,DIRERR ;ISSUE DIRECTORY ERROR
JRST LOOKNX ;GO ISSUE CRLF AND RETURN
;ERROR: THE DIRECTORY IS EMPTY
E.DEM: SKIPE UFDEF ;SEE IF WE FOUND AN ERROR YET
JRST LOOKNY ;YES--DON'T REPORT IT AGAIN
SKIPN NSUFD ;SEE IF ANY SUCCESSFULLY LOOKED UP
JRST E$$NXD ;NO--GO GIVE MESSAGE
E$$DEM: MOVE T1,['DEM',,[ASCIZ /D/]]
PUSHJ P,WLDWRN ;ISSUE WARNING
JRST LOOKNX ;SKIP REST IF NOT /VERB:FIRST
PUSHJ P,DIRERR ;ISSUE DIRECTORY ERROR
MOVEI T1,[ASCIZ / is empty/]
PUSHJ P,.TSTRG## ;DIRECTORY EMPTY MESSAGE
JRST LOOKNX ;GO ISSUE CRLF AND RETURN
;ERROR: DIRECTORY COULD NOT BE FOUND ON SOME STRUCTURE
DLYERR: MOVE T2,[ERIPP% ;MFD MISSING
ERSNF% ;SFD MISSING
ERFNF%]-1(T2) ;OR FILE MISSING
SKIPN UFDEF ;SEE IF ERROR ALREADY GIVEN
PUSHJ P,LKERRD ;NO--GIVE THIS ONE
JRST LOOKNY ;AND FINISH UP
;ERROR: ALL MATCHING UFDS WERE NON-EXISTENT
E$$NXD: MOVE T1,['NXD',,[ASCIZ /Non-existent/]]
PUSHJ P,WLDWRN ;ISSUE WARNING
JRST LOOKNX ;SKIP REST IF NOT /VERB:FIRST
PUSHJ P,UFDERR ;ISSUE DEVICE AND UFD CODE
JRST LOOKNY ;AND START OVER
;ERROR: NO FILE MATCHES THE USER'S REQUEST
E$$SFP: MOVE T1,['SFP',,[ASCIZ /Some files protected /]]
JRST E.NSF1 ;ISSUE WARNING [311]
E$$AFP: SKIPA T1,['AFP',,[ASCIZ /All files protected /]]
E$$SDP: MOVE T1,['SDP',,[ASCIZ /Some directories protected /]]
JRST E.NSF1 ;GO ISSUE MESSAGE [305]
E$$AFR: SKIPA T1,['AFR',,[ASCIZ /All files rejected by conditions /]]
E$$NSF: MOVE T1,['NSF',,[ASCIZ /No such files as /]]
E.NSF1: PUSHJ P,WLDWRN ;ISSUE WARNING
JRST LOOKNX ;SKIP REST IF NOT /VERB:FIRST
PUSHJ P,FILOUT ;ISSUE FILE ERROR
JRST LOOKNX ;END LINE AND START OVER
;ERROR: NO FILE NAME SPECIFIED FOR DISK FILE
E$$NFS: MOVE T1,['NFS',,[ASCIZ /No file name specified /]]
PUSHJ P,WLDERR ;ISSUE ERROR
JRST LOOKNX ;SKIP REST IF NOT /VERB:FIRST
PUSHJ P,FILOUT ;ISSUE FILE ERROR
LOOKNX: PUSHJ P,.TCRLF## ;ISSUE NEW LINE
LOOKNY: MOVE P1,.WILAS ;POSITION POINTER
JRST LOOKST ;GO BACK FOR NEXT REQUEST
SUBTTL SECONDARY WILD-CARD LOGIC
;.SCWLD -- ROUTINE TO COMPUTE SECONDARY WILD-CARDS SUCH AS FOR
; ALTERNATE INPUT FILES AND OUTPUT FILES.
;SEE START OF LISTING FOR ARGUMENT FORMAT
.SCWLD::HLRZ T2,T1 ;GET ARGUMENT COUNT
PUSHJ P,.GTWRD## ;GET BLOCK+0
MOVE T4,(T3) ;GET ADDRESS OF OUTPUT SPEC
MOVEM T4,SCOSP ;SAVE FOR LATER
HLRZS T3 ;POSITION FOR INPUT
MOVE T4,(T3) ;GET ADDRESS OF INPUT SPEC
MOVEM T4,SCISP ;SAVE FOR LATER
PUSHJ P,.GTWRD ;GET BLOCK+1
HLRZM T3,SCIOPN ;SAVE INPUT OPEN
HRRZM T3,SCOOPN ;SAVE OUTPUT OPEN
PUSHJ P,.GTWRD ;GET BLOCK+2
HLRZM T3,SCILKP ;SAVE INPUT LOOKUP BLOCK
HRRZM T3,SCOLKP ;SAVE OUTPUT LOOKUP BLOCK
PUSHJ P,.GTWRD ;GET BLOCK+3
HLRZM T3,SCODFE ;SAVE ADDRESS OF DEFAULT EXTENSION
HRRZM T3,SCOLLK ;STORE LENGTH OF OUTPUT LOOKUP BLOCK
PUSHJ P,.SAVE3## ;SAVE P1-P3
MOVE P1,SCOOPN ;POINT TO OUTPUT OPEN BLOCK
MOVE P2,SCOSP ;POINT TO OUTPUT SPEC
SETZB T4,2(P1) ;CLEAR BUFFER POINTERS
MOVX T1,FX.PHY ;CHECK FOR /PHYSICAL
TDNE T1,.FXMOD(P2) ; IN OUTPUT SPEC
TXO T4,UU.PHS ;YES--SET FOR OPEN
MOVE T3,[DEVCHR T2,]
TDNE T1,.FXMOD(P2) ;SEE IF /PHYSICAL
TXO T3,UU.PHY ;YES--TURN ON IN DEVCHR
MOVSI T2,'SYS' ;TRY IT
XCT T3 ; RIGHT
TRNN T2,-1 ;SEE IF SET
TRZ T3,UU.PHY ;NO--PHYS DEVCHR DOESN'T WIN
MOVE T2,.FXDEV(P2) ;GET DEVICE
MOVEM T2,1(P1) ;SET IN OPEN BLOCK
XCT T3 ;GET CHARACTERISTICS
MOVEM T2,SCCHR ;SAVE FOR LATER ALSO
TXNN T2,DV.MTA ;SEE IF MAG TAPE
JRST SCWLD1 ;NO--PROCEED
MOVX T1,FX.PAR ;CHECK FOR /PARITY
TDNE T1,.FXMOD(P2) ; FOR :EVEN
TXO T4,IO.PAR ;YES--SET FOR OPEN
LDB T1,[POINTR (.FXMOD(P2),FX.DEN)] ;GET /DENSITY
DPB T1,[POINTR (T4,IO.DEN)] ;SET INTO OPEN
SCWLD1: MOVEM T4,(P1) ;STORE FIRST WORD OF OPEN BLOCK
ADDI T3,<<DEVTYP T2,>-<DEVCHR T2,>> ;CHANGE TO DEVTYP
MOVE T2,.FXDEV(P2) ;GET DEVICE NAME AGAIN
XCT T3 ;GET DEVTYP
MOVEI T2,0 ;CLEAR IT IF NOT AVAILABLE
MOVEM T2,SCTYP ;SAVE FOR ERROR MESSAGES AND LATER
;HERE TO SETUP SECONDARY LOOKUP BLOCK
MOVE P1,SCOLKP ;POINT TO BLOCK
MOVE T1,SCOLLK ;GET LENGTH
SOS T1 ;MINUS ONE
HRLZI T2,1(P1) ;POINT BEYOND FIRST
HRRI T2,2(P1) ;SETUP BLT POINTER
MOVEM T1,.RBCNT(P1) ;SET LENGTH
ADDI T1,(P1) ;POINT TO END
SETZM 1(P1) ;CLEAR START
BLT T2,(T1) ;CLEAR ENTIRE ARRAY
MOVX T1,RB.NSE ;GET NON-SUPERSEDING ENTER BIT
MOVX T2,FX.SUP ;GET /ERSUPERSEDE BIT
TDNE T2,.FXMOD(P2) ;SEE IF USER SET IT
IORM T1,.RBCNT(P1) ;YES--TELL MONITOR
LDB T1,[POINTR (.FXMOD(P2),FX.PRO)] ;GET /PROTECTION
LSH T1,^D35-POS(RB.PRV) ;POSITION
MOVEM T1,.RBPRV(P1) ;STORE FOR ENTER (WON'T HURT LOOKUP)
SKIPG T1,.FXEST(P2) ;GET /ESTIMATE [161,164]
MOVEI T1,0 ; DEFAULT TO 0 [164]
ADDI T1,177 ;ROUND OFF TO BLOCKS [313]
LSH T1,-7 ;CONVERT TO BLOCKS [161]
MOVE T2,SCOLLK ;GET EXTENDED BLOCK LENGTH+1 [313]
CAILE T2,.RBEST ;SEE IF ROOM IN ENTER BLOCK [161]
MOVEM T1,.RBEST(P1) ;YES--SET IT FOR ENTER [161]
MOVE T1,.FXVER(P2) ;GET /VERSION [161]
CAILE T2,.RBVER ;SEE IF ROOM IN ENTER BLOCK [161]
CAMN T1,[-1] ; AND SEE IF SET [161]
SKIPA ;NO--IGNORE [161]
MOVEM T1,.RBVER(P1) ;YES--SET FOR ENTER [161]
;HERE TO APPLY WILD-CARDS. IDEA IS TO COPY CORRESPONDING INPUT WILD
; CARDS IN THE SAME ORDER OF FILE NAME, EXTENSION, DIRECTORY.
SETZM SCNBT ;CLEAR BIT FETCHER
MOVE T1,SCISP ;GET INPUT SPEC ADDRESS
HRLI T1,-4 ;PRESET COUNTER
ADDI T1,.FXNMM-1 ;POINT TO NAME MASK
MOVEM T1,SCNWD ;SAVE FOR FNDNBT ROUTINE
MOVE P3,SCILKP ;POINT TO INPUT BLOCK
SKIPN T1,.FXNAM(P2) ;GET OUTPUT NAME
SKIPA T1,.RBNAM(P3) ;OR INPUT IF BLANK
SKIPA T2,.FXNMM(P2) ;GET OUTPUT MASK
SETOM T2 ;SET FULL MASK IF BLANK
PUSHJ P,INSWLD ;INSERT WILD CHARS [153]
JRST E$$IWC ;ERROR IF NO MORE
MOVEM T1,.RBNAM(P1) ;STORE OUTPUT NAME
SKIPN T1,.FXEXT(P2) ;GET OUTPUT EXT
HLLO T1,@SCODFE ;GET DEFAULT
HRLO T2,T1 ;GET MASK
TRZ T1,-1 ;CLEAR OUT JUNK
PUSHJ P,INSWLS ;INSERT WILD CHARS
JRST E$$IWC ;ERROR IF NO MORE
HLLZM T1,.RBEXT(P1) ;STORE RESULT FOR ENTER
HLRZ T2,T1 ;SAVE EXTENSION [153]
MOVE T1,.RBNAM(P1) ;GET FILE NAME BACK [153]
CAIE T2,'UFD' ;UNLESS .UFD [153]
PUSHJ P,INSWLF ; COMPACT OUT BLANKS [153]
MOVEM T1,.RBNAM(P1) ;STORE RESULT [153]
MOVEI T1,0 ;CLEAR DIRECTORY (SET [-])
MOVX T2,FX.DIR ;SEE IF ONE GIVEN
TDNN T2,.FXMOD(P2) ; BY THE USER
JRST SCNODR ;NO--USE DEFAULT
MOVE T1,.FXDIR(P2) ;GET USER SPECIFIED UFD
MOVE T2,.FXDIM(P2) ;GET UFD MASK
TLNN T1,-1 ;SEE IF PROJECT
TLO T2,-1 ;NO--SET MASK FULL ON
TLNN T1,-1 ;SEE IF PROJECT
HLL T1,MYPPN ;BLANK--USE LOGGED IN PROJECT
TRNN T1,-1 ;SEE IF PROGRAMMER
TRO T2,-1 ;NO--SET MASK FULL ON
TRNN T1,-1 ;SEE IF PROGRAMMER
HRR T1,MYPPN ;BLANK--USE LOGGED IN PROGRAMMER
PUSHJ P,INSWLD ;INSERT WILD-CARDS
JRST E$$IWC ;ERROR IF NO MORE
SKIPGE T1 ;SEE IF SIXBIT DIRECTORY
PUSHJ P,INSWLF ;YES--FIX IT UP
TLNE T1,-1 ;IF NO PROJECT
TRNN T1,-1 ;OR PROGRAMMER,
JRST E$$NNO ;THEN ERROR
IFN FT$SFD,<
SKIPN .FXDIR+2(P2) ;SEE IF SFD
JRST SCNODR ;NO--JUST USE UFD
MOVEM T1,SCSFDD ;YES--STORE UFD IN PATH
SETZM SCSFD ;CLEAR FIRST ARG
SETZM SCSFDS ;CLEAR SCAN SWITCH
;LOOP OVER SFDS
MOVSI P1,1-.FXLND ;PRESET DEPTH COUNTER
SCSFDL: SKIPN T1,.FXDIR+2(P2) ;GET NEXT SFD
JRST SCSFDM ;DONE--JUST CLEANUP
MOVE T2,.FXDIM+2(P2) ;GET MASK
PUSHJ P,INSWLS ;INSERT WILD CHARACTERS
JRST E$$IWC ;ERROR IF NO MORE
JUMPE T1,E$$NNO ;ERROR IF BLANK
SCSFDM: MOVEM T1,SCSFDD+1(P1) ;STORE SFD
ADDI P2,2 ;ADVANCE SPEC POINTER
AOBJN P1,SCSFDL ;LOOP OVER PATH
SETZM SCSFDD+1(P1) ;FORCE A ZERO
MOVEI T1,SCSFD ;POINT TO PATH
MOVE P1,SCOLKP ;RESTORE OUTPUT BLOCK POINTER
>
SCNODR: MOVEM T1,.RBPPN(P1) ;STORE DIRECTORY OR POINTER
MOVEM T1,.RBSIZ(P1) ;(FOR LEV.C)
SETCMI T2,1 ;SET SINGLE WILD BIT [302]
PUSHJ P,INSWLD ;GO SEE IF ANY LEFT [302]
SKIPA ;NO--WORKED OUT OK [302]
JRST E$$TWC ;YES--TOO MANY ON INPUT [302]
;HERE WHEN ALL DONE
SKIPN T1 ;SEE IF DIRECTORY
MOVE T1,MYPPN ;DEFAULT--USE SELF
TLNN T1,-1 ;SEE IF SFD
MOVE T1,.PTPPN(T1) ;YES--GET OWNER UFD
MOVE T2,SCILKP ;POINT TO INPUT LOOKUP
MOVE T3,.RBPRV(T2) ;GET INPUT PROTECTION
MOVE T2,.RBPPN(T2) ;GET INPUT OWNER
SKIPN T2 ;SEE IF DEFAULT
MOVE T2,MYPPN ;YES--GET SELF
TLNN T2,-1 ;SEE IF SFD
MOVE T2,.PTPPN(T2) ;YES--GET OWNER UFD
SKIPE T1 ;IF NO OUTPUT OWNER
SKIPN T2 ;OR NO INPUT OWNER
JRST SCDONE ;LEAVE PROT. ALONE
SKIPN .RBPRV(P1) ;IF /PROTECTION
CAME T1,T2 ;OR DIFFERENT OWNERS
JRST SCDONE ;LEAVE PROT. ALONE
ANDX T3,<RB.PRV-7B2> ;CLEAR OWNER PROTECTION
JUMPE T3,SCDONE ;IF 000, LEAVE ALONE
MOVX T1,%LDSTP ;GET SYSTEM
GETTAB T1, ;STANDARD FILE PROTECTION
MOVEI T1,0 ;(USE 0XX)
ANDX T1,7B2 ;GET OWNER PROTECTION
IOR T1,T3 ;INCLUDE INPUT FILE PROT
MOVEM T1,.RBPRV(P1) ;STORE FOR ENTER
SCDONE: HLRZ T1,.RBEXT(P1) ;GET RESULTING EXTENSION [153]
CAIN T1,'UFD' ;SEE IF .UFD [153]
JRST [SKIPN T1,.RBPPN(P1) ;YES--GET DIRECTORY [153]
MOVE T1,MYPPN ;BLANK, ASSUME SELF [153]
TLNN T1,-1 ;SEE IF SFD POINTER [153]
MOVE T1,.PTPPN(T1) ;YES--GET UFD [153]
CAMN T1,MFDPPN ;SEE IF MFD: [153]
JRST .+1 ;YES--ALL SET [153]
MOVEM T1,.RBNAM(P1) ;NO--STORE UFD AS NAME [153]
MOVE T1,MFDPPN ;GET MFD [153]
MOVEM T1,.RBPPN(P1) ;STORE AS DIRECTORY [153]
JRST .+1] ;AND PROCEED [153]
MOVE T1,SCCHR ;GET DEVICE CHARACTERISTICS
MOVE T2,.RBNAM(P1) ;GET FILE NAME [164]
TLC T1,-1-<(DV.TTA)> ;WATCH OUT FOR [164]
TLCE T1,-1-<(DV.TTA)> ; NUL: [164]
TXNN T1,DV.DTA!DV.DSK ;IF DISK OR DECTAPE, [164]
SKIPA ;NO [164]
JUMPE T2,E$$NDO ; ERROR IF NULL NAME [164]
MOVE T3,SCTYP ;GET DEVTYP
MOVEI T2,1 ;SET FOR MISC. DEVICE
TLC T1,-1-<(DV.TTA)> ;IF DEVICE
TLCN T1,-1-<(DV.TTA)> ; IS NUL:
JRST CPOPJ1 ; THEN RETURN
TXNN T3,TY.SPL ;SEE IF SPOOLED
TXNE T1,DV.DSK ;OR DISK
SETOM T2 ;YES--FLAG AS SUCH
TXNE T1,DV.DTA ;SEE IF DECTAPE
SETZM T2 ;YES--FLAG
JRST CPOPJ1 ;OK RETURN TO USER
;E.SCO -- REPORT OPEN ERROR
E.SCO::
E$$SCO: MOVE T1,['SCO',,[ASCIZ /OPEN failure on /]]
PUSHJ P,WLDERR ;ISSUE ERROR
PJRST .TCRLF## ;SKIP REST IF NOT /VERB:FIRST
MOVE T1,SCOOPN ;POINT TO OPEN BLOCK
MOVE T1,1(T1) ;GET NAME
PUSHJ P,TYPST1 ;TYPE IT
LDB T2,[POINTR (SCTYP,TY.JOB)] ;GET USER JOB
PJRST OPNER1 ;GO TYPE IT
;ERROR: CAN'T LOOKUP OR ENTER SECONDARY FILE
E.SCL:: MOVE T1,SCOLKP ;POINT TO LOOKUP BLOCK
MOVE T2,SCOLLK ;GET LENGTH
MOVE T3,SCOSP ;POINT TO OUTPUT SPEC
PJRST E.LKEN ;GO OUTPUT ERROR
;ERROR: NULL NAME OR DIRECTORY
E$$NDO: SKIPA T1,['NDO',,[ASCIZ /Null name in output wild-card/]]
E$$NNO: MOVE T1,['NNO',,[ASCIZ /Null directory in output wild-card/]]
JRST ENEWC
;ERROR: INSUFFICIENT INPUT WILD CARD CHARS TO MATCH OUTPUT
E$$TWC: SKIPA T1,['TWC',,[ASCIZ /Too many wild-cards in input for output/]]
E$$IWC: MOVE T1,['IWC',,[ASCIZ /Insufficient wild-cards in input for output/]]
ENEWC: PUSHJ P,WLDERR ;ISSUE ERROR
PJRST .TCRLF## ;SKIP REST IF NOT /VERB:FIRST
PJRST .TFILE ;TYPE ERROR FILE SPEC
;INSWLS -- ROUTINE TO INSERT WILD CHARACTERS IN A WORD AND LEFT COMPRESS NULL CHARS
;INSWLF -- FIXUP WORD BY LEFT COMPRESSING NULL CHARS
INSWLS: PUSHJ P,INSWLD ;INSERT WILD CHARACTERS
POPJ P, ;ERROR RETURN
AOS (P) ;GOOD RETURN
INSWLF: SKIPN T2,T1 ;SHIFT ARGUMENT
POPJ P, ;RETURN IF NULL
MOVEI T1,0 ;CLEAR RESULT
INSWF1: SKIPE T2 ;IF DONE
TLNE T2,(77B5) ;OR NOT NULL
JRST INSWF2 ;GO SHIFT TO ANSWER
LSH T2,6 ;ELSE, COMPRESS NULL
JRST INSWF1 ;AND LOOP
INSWF2: TLNE T1,(77B5) ;SEE IF ALL DONE YET
POPJ P, ;YES--RETURN
LSHC T1,6 ;NO--SHIFT SOME MORE
JRST INSWF1 ;AND LOOP
;INSWLD -- ROUTINE TO INSERT WILD CHARACTERS IN A WORD
;CALL: MOVE T1,PROPOSED WORD (TYPED BY USER OR DEFAULTED)
; MOVE T2,REPLACEMENT MASK (1=LEAVE BIT ALONE)
; PUSHJ P,INSWLD
; ERROR RETURN IF INSUFFICIENT INPUT WILD-CARDS TO MATCH
; SKIP RETURN WITH T1 UPDATED FROM INPUT FILE
;ASSUMES P3 POINTS TO INPUT LOOKUP BLOCK
;GLOBAL VARIABLES SCNBT AND SCNWD MUST BE PRESET FOR FNDNBT ROUTINE
INSWLD: MOVEI T4,^D35 ;BIT COUNTER FOR WORD IN T1
INSWL1: MOVEI T3,1 ;GET A BIT
LSH T3,(T4) ;POSITION
TDNN T2,T3 ;SEE IF NEED REPLACEMENT
JRST INSWL3 ;YES--GO DO IT
INSWL2: SOJGE T4,INSWL1 ;NO--LOOP UNTIL DONE
JRST CPOPJ1 ;SUCCESS RETURN
INSWL3: TDZ T1,T3 ;REPLACE--CLEAR OUTPUT BIT
PUSHJ P,FNDNBT ;FIND VALUE OF NEXT REPLACEMENT BIT
POPJ P, ;NONE--GIVE ERROR RETURN
LSH T3,(T4) ;POSITION REPLACEMENT BIT
IOR T1,T3 ;INCLUDE IT IN RESULT
JRST INSWL2 ;GO REPEAT LOOP
;FNDNBT -- HELPER TO INSWLD TO FIND VALUE OF NEXT REPLACEMENT BIT
;CALL: PUSHJ P,FNDNBT
; ERROR RETURN IF NO MORE INPUT WILD-CARDS
; SKIP RETURN WITH VALUE IN BIT 35 OF T3
;PRESERVES ALL OTHER ACS
;GLOBAL VARIABLES SCNBT AND SCNWD MUST HAVE BEEN PRESET ORIGINALLY
; SCNBT IS BIT DOWN COUNTER FOR SCANNING INPUT SPEC
; SCNWD IS WORD UP COUNTER FOR SCANNING INPUT SPEC
; LH=-3 NAME, -2 EXT, -1 UFD, 0-4 SFD
; RH=LOCATION OF INPUT SPEC MASK
;LOCAL AC USAGE:
; T1 CONTAINS SCNBT
; T2 CONTAINS SCNWD
; T3 GETS RESULT
;P3 IS ASSUMED TO POINT TO THE INPUT LOOKUP BLOCK
FNDNBT: PUSH P,T1 ;SAVE ACS
PUSH P,T2
MOVE T2,SCNWD ;GET SCNWD WHERE IT IS USEFUL
FNDNB1: SOSL T1,SCNBT ;COUNT TO NEXT BIT
JRST FNDNB2 ;STILL SAME WORD--PROCEED
MOVEI T1,^D35 ;SET COUNT FOR NEXT WORD
AOBJP T2,FNDNW1 ;GET NEXT WORD
HLRZ T3,T2 ;NOT SFD--GET INDEX
XCT [JFCL ;FILE NAME--OK
MOVEI T1,^D17 ;EXTENSION IS ONLY 18 BITS
ADDI T2,.FXDIM-.FXEXT-1]+3(T3) ;UFD IS FARTHER DOWN
CAIN T3,-1 ;SEE IF UFD
JRST FNDNW2 ;YES--CHECK FOR PRESENCE
JRST FNDNB2 ;PROCEED
FNDNW1: AOS T2 ;ADVANCE SFD SPEC BY 2
HLRZ T3,T2 ;GET SFD DEPTH
CAIGE T3,.FXLND-1 ;SEE IF ALL DONE
FNDNW2: SKIPN -1(T2) ;SEE IF SFD IS NULL
JRST FNDNBX ;YES--GIVE ERROR RETURN
FNDNB2: MOVEM T1,SCNBT ;STORE UPDATED COUNTER
MOVEI T3,1 ;GET A BIT
LSH T3,(T1) ;POSITION IT
TDNE T3,(T2) ;SEE IF WILD IN INPUT SPEC
JRST FNDNB1 ;NO--REPEAT LOOP
;HERE WHEN FOUND NEXT WILD BIT--GET VALUE
HLRE T3,T2 ;GET WORD TYPE
SKIPLE T1,T3 ;SEE IF SFD
MOVEI T1,0 ;YES--MAKE UNIFORM
XCT [MOVE T3,.RBNAM(P3) ;FILE NAME
HLRZ T3,.RBEXT(P3) ;EXTENSION
JRST [MOVE T3,.RBPPN(P3) ;UFD
TLNN T3,-1 ;SEE IF PATH
MOVE T3,.PTPPN(T3) ;YES--GET TOP OF PATH
JRST .+1]
JRST [ADD T3,.RBPPN(P3) ;SFD--POINT TO PATH
TLNE T3,-1 ;SEE IF PATH
TDZA T3,T3 ;NO--KILL RESULT
MOVE T3,.PTPPN+1(T3) ;YES--GET SFD
JRST .+1]
]+3(T1)
MOVN T1,SCNBT ;GET COMPLEMENT OF BIT POS
LSH T3,(T1) ;POSITION RESULT
ANDI T3,1 ;MASK TO ONE BIT
AOS -2(P) ;SET SKIP RETURN
FNDNBX: MOVEM T2,SCNWD ;STORE UPDATED WORD POINTER
POP P,T2 ;RESTORE ACS
POP P,T1
POPJ P, ;RETURN
SUBTTL DIRECTORY SUBROUTINES
;SUBROUTINE TO SUPPLY DEFAULTS FOR DIRECTORIES
;CALL: MOVEI P1,POINTER TO SPECIFICATION
; PUSHJ P,SETDIR
;USES T1-4
;
;HANDLES [,] (IE, DEFAULT PROJECT, DEFAULT PROGRAMMER),
;HANDLES [-] (IE, DEFAULT TO DEFAULT DIRECTORY)
;HANDLES .UFD (IE, DIRECTORY IS REALLY FILE NAME)
SETDIR: MOVX T1,FX.DFX ;GET FLAG
TDNE T1,.FXMOD(P1) ;SEE IF HERE ALREADY
POPJ P, ;YES--RETURN
IORM T1,.FXMOD(P1) ;NO--SET FLAG FOR LATER
MOVX T1,FX.DIR ;SEE IF DIRECTORY
TDNE T1,.FXMOD(P1) ; SPECIFIED
JRST SETDR2 ;YES--GO HANDLE IT
HLRZ T1,.FXEXT(P1) ;GET EXTENSION
CAIN T1,'UFD' ;SEE IF UFD
JRST SETDR ;YES--GO DO DEFAULTS
LDB T1,[POINTR (.FXMOD(P1),FX.TRM)] ;GET TERMINATOR [300]
IFN FT$COR,<
CAIN T1,.FXTRC ;IF "+" [300]
MOVEI T1,.FXTRO ; TREAT AS 'OR' [300]
>
CAIE T1,.FXTRA ;IF 'AND' [300]
CAIN T1,.FXTRO ; OR 'OR' [300]
JRST SETDR ; NEED TO GO SET DIRECTORY [300]
CAMN P1,.WIFIR ; OR SECOND FILE
CAIN T1,.FXTRN ; OR 'NOT' [300]
JRST SETDR ;YES--SAME AS WILD CARDS
SETCM T1,.FXNMM(P1) ;SEE IF WILD NAME
SETCM T2,.FXEXT(P1) ; OR EXT
TRNN T2,-1 ;IF NOT,
JUMPE T1,SETDR4 ; LEAVE DIRECTORY CLEAR
SETDR:
IFN FT$SFD,<
MOVE T1,[-.FXLND,,PTHDIR]
MOVEI T2,.FXDIR(P1) ;NO--COPY DEFAULT DIRECTORY
SETDR1: SKIPN T3,(T1) ;GET NEXT LEVEL
SOS T1 ;BLANK--HOLD POINTER
MOVEM T3,(T2) ;STORE IN ARGUMENT AREA
SKIPE T3 ;SEE IF BLANK
SETOM T3 ;NO--FULL MATCH
MOVEM T3,1(T2) ;STORE AWAY
ADDI T2,2 ;ADVANCE STORAGE
AOBJN T1,SETDR1 ;LOOP UNTIL DONE
JRST SETDR3 ;AND PROCEED BELOW
>
SETDR2: MOVE T1,.FXDIR(P1) ;GET DIRECTORY
MOVE T2,MYPPN ;DEFAULT PPN--GET USER
TLNN T1,-1 ;SEE IF PROJECT PRESENT
HLLM T2,.FXDIR(P1) ;NO--FILL IN MY PROJECT
TLNN T1,-1 ; ..
HRROS .FXDIM(P1) ; AND NO WILDCARD
TRNN T1,-1 ;SEE IF PROGRAMMER PRESENT
HRRM T2,.FXDIR(P1) ;NO--FILL IN MY PROGRAMMER
TRNN T1,-1 ; ..
HLLOS .FXDIM(P1) ; AND NO WILDCARD
SETDR3:
REPEAT 0,< ;SET /OKPRO IF ANY WILD-CARDS [301]
SETCM T1,.FXDIM(P1) ;SEE IF WILD USER
JUMPE T1,SETDR4 ;NO--OK
>
MOVX T1,FX.PRT ;YES--SET
TDNN T1,.FXMOM(P1) ; /OKPROTECTION
IORM T1,.FXMOD(P1) ; UNLESS /ERPROTECTION
SETDR4: HLRZ T1,.FXEXT(P1) ;GET EXTENSION
CAIE T1,'UFD' ;SEE IF .UFD
POPJ P, ;NO--ALREADY SETUP CORRECTLY
MOVE T1,MFDPPN ;YES--GET CORRECT DIRECTORY
EXCH T1,.FXDIR(P1) ;STORE (MFD)
SETO T2, ;CLEAR WILDCARDS
EXCH T2,.FXDIM(P1) ;SET INTO DIRECTORY
MOVEM T1,.FXNAM(P1) ;MOVE DIRECTORY TO NAME
MOVEM T2,.FXNMM(P1) ;MOVE DIRECTORY TO NAME
IFN FT$SFD,<
SETZM .FXDIR+2(P1) ;CLEAR SUB DIRECTORY
SETZM .FXDIM+2(P1) ; ..
>
POPJ P, ;RETURN
;ERROR: DIRECTORY OPEN
E.UFO: MOVEI T1,[ASCIZ /directory on /]
PUSHJ P,OPNERR
SETOM UFDEF ;INDICATE ERROR MESS FOR DIRECTORY
JRST STR1
;ERROR: DIRECTORY LOOKUP FAILURE
E.UFL: PUSHJ P,WILDFD ;[344] PUT LOOKUP INFO IN ACCS
SKIPE T4,DEPTH ;RESTORE DEPTH POINTER
MOVEM T1,DIRBU-1(T4) ;RESTORE DIRECTORY LIST
E.UFL1: TLZ T2,-1 ;CLEAR JUNK
JUMPE T4,[PUSHJ P,E.MFL ;ISSUE MFD ERROR
JRST WILDE] ;AND LOOP
SOS NSUFD ;DISCOUNT UFD FOUND SUCCESSFULLY
CAIE T2,ERSNF% ;SEE IF SFD ERROR
CAIG T2,ERIPP% ;SEE IF NON-EXISTENT ERROR
SKIPN SRCH ;AND STR SEARCHING
JRST .+2 ;NO--PROCEED
JRST E.UFLX ;YES--SKIP MESSAGE FOR NOW
PUSHJ P,LKERRD ;ISSUE ERROR MESSAGE
JRST WILDE ;AND TRY NEXT DIRECTORY
E.UFLX: CAIN T2,ERSNF% ;COMPACT ERROR CODE
MOVEI T2,2 ; SFD IS WORST
SKIPN T2 ; ..
MOVEI T2,3 ;EXCEPT FOR FILE MISSING
CAMLE T2,LASERR ;SEE IF WORST YET
MOVEM T2,LASERR ;YES--REMEMBER IT
JRST WILDE ;AND CONTINUE ONWARDS
;ISSUE ERROR IN SFD/UFD/MFD
LKERRD: SETOM UFDEF ;FLAG THAT ERROR WAS FOUND
MOVX T1,FX.PRT ;SEE IF
TDNE T1,MOD ;/OKPROTECTION
CAIE T2,ERPRT% ;AND PROTECTION ERROR
SKIPA ;NO
JRST [AOS NODIRP ;YES--INDICATE PRO ERROR [304,307]
POPJ P,] ;RETURN [304]
PUSHJ P,LKERR ;OUTPUT LOOKUP ERROR
JRST E.MFL1 ; (IF MFD FAILED)
PJRST UFDERR ;OUTPUT UFD ERROR AND RETURN
E.MFL1: MOVEI T2,0 ;FUDGE FILE NOT FOUND ERROR
E.MFL: CAIN T2,ERIPP% ;SEE IF ILL PPN
MOVEI T2,ERFNF% ;CHANGE TO NO SUCH FILE (MFD)
PUSHJ P,LKERR ;OUTPUT LOOKUP ERROR
HALT .+1
PJRST MFDERR ;OUTPUT MFD ERROR AND RETURN
;ERROR: I/O ERROR WHILE READING DIRECTORY
E.UFE: GETSTS WC,T1 ;DATA ERROR--GET STATUS
PUSHJ P,STSERR ;OUTPUT MESSAGE
SETSTS WC,(T1) ;AND CLEAR ERROR BITS
PJRST UFDERR ;OUTPUT UFD ERROR
;.NXDTW -- GET NEXT WORD FROM DATA FILE
;CALL: PUSHJ P,.NXDTW
; ERROR RETURN IF END-OF-FILE
; NORMAL RETURN WITH WORD IN T1
.NXDTW::SOSGE B.DC+.BFCTR ;SEE IF WORD IN BUFFER
JRST NXDATR ;NO--READ SOME MORE OF FILE
ILDB T1,B.DC+.BFPTR ;FETCH WORD
JRST CPOPJ1 ;SKIP RETURN
NXDATR: PUSHJ P,DODCHN ;EXECUTE DATA CHANNEL UUO
IN DC, ;READ
JRST .NXDTW ;OK TO PROCEED
PUSHJ P,DODCHN ;EXECUTE DATA CHANNEL UUO
STATZ DC,IO.ERR ;SEE IF ANY ERRORS
PUSHJ P,E.DFE ;YES
PUSHJ P,DODCHN ;EXECUTE DATA CHANNEL UUO
STATO DC,IO.EOF ;SEE IF EOF
JRST .NXDTW ;NO--GET MORE DATA
POPJ P, ;YES--EOF RETURN
;ERROR: DATA FILE OPEN
E.DFO:: MOVEI T1,[0]
OPNERR: PUSH P,T1 ;SAVE MESSAGE INSERT
E$$DFO: MOVE T1,['DFO',,[ASCIZ /Open failure for /]]
PUSHJ P,WLDERR ;ISSUE ERROR
JRST [POP P,T1 ;IF NOT /VERB:FIRST
PJRST .TCRLF##] ; SKIP REST
POP P,T1 ;RECOVER INSERT
PUSHJ P,STRER1 ;OUTPUT STRUCTURE NAME
MOVE T2,FSTR ;GET DEVICE
PUSHJ P,DOPHYS ;GET PHYSICAL BIT
DEVTYP T2, ;GET JOB USING IT
JRST OPNER2 ;GIVE UP IF NOT IMPLEMENTED
LDB T2,[POINTR (T2,TY.JOB)] ;GET USER JOB
OPNER1: JUMPE T2,OPNER2 ;GIVE UP IF NOT ON RECORD
MOVEI T1,[ASCIZ / in use by job /]
PUSHJ P,.TSTRG## ;TYPE PREFIX
HRRZ T1,T2 ;GET JOB NUMBER
PUSHJ P,.TDECW## ;TYPE JOB NUMBER
OPNER2: PJRST .TCRLF ;END LINE AND RETURN
;ERROR: DATA FILE LOOKUP ERROR
E.DFL:: MOVE T1,AGLOOK ;POINT TO LOOKUP BLOCK
MOVE T2,AGLENL ;GET LENGTH
MOVEI T3,FSTR ;POINT TO TEMP ERROR AREA
TDZA T4,T4 ;FLAG WILD INPUT AND SKIP INTO E.LKEN
;E.LKEN -- OUTPUT LOOKUP/ENTER ERROR FOR SCAN-BLOCK
;CALL: MOVEI T1,EXTENDED LOOKUP BLOCK
; MOVEI T2,LENGTH OF LOOKUP BLOCK
; MOVEI T3,SCAN BLOCK (INC. SFDS)
; PUSHJ P,E.LKEN
E.LKEN::SETOM T4 ;SECONDARY FLAG
HRLZ T3,T3 ;POINT TO SCAN BLOCK
HRRI T3,FSTR ;POINT TO ERROR BLOCK
BLT T3,ENDERR ;COPY TO TEMP AREA
CAIG T2,.RBDEV ;SEE IF STR IS INCLUDED
JRST EDFL1 ;NO--USE ARGUMENT
SKIPE T3,.RBDEV(T1) ;SEE IF BETTER STR SPECIFIED
MOVEM T3,FSTR ;YES--UPDATE DIAGNOSTIC
EDFL1: SKIPE T3,.RBNAM(T1) ;GET REAL NAME
MOVEM T3,FNAM ;UPDATE DIAGNOSTIC
HLLZ T3,.RBEXT(T1) ;GET REAL EXTENSION
MOVEM T3,FEXT ;USE IT IN MESSAGE
MOVE T3,.RBPPN(T1) ;GET BETTER PPN
TLNE T3,-1 ;SEE IF BETTER UFD SPECIFIED
MOVEM T3,UFDPPN ;YES--UPDATE DIAGNOSTIC
TLNE T3,-1 ;SEE IF SFD
SETOM UFDPPN+1 ;NO--CLEAR WILD CARDS
MOVE T3,.RBPRV(T1) ;GET PROTECTION
HRRZ T2,.RBEXT(T1) ;GET CODE
MOVX T1,FX.PRT ;SEE IF
TDNE T1,MOD ;/OKPROTECTION
CAIE T2,ERPRT% ;AND PROTECTION ERROR
SKIPA ;NO
JRST [SOS NOFILF ;DON'T COUNT FILE FOUND [304]
AOS NOFILP ;COUNT PROTECTION ERROR [304]
POPJ P,] ;RETURN [304]
MOVX T1,FX.NOM ;SEE IF [155]
TDNE T1,MOD ; /OKNONE [155]
JUMPE T2,CPOPJ ;YES--IF NOT FOUND, SUPPRESS ERROR [155]
CAIE T2,ERSNF% ;SEE IF NO .SFD [155]
CAIN T2,ERIPP% ;SEE IF NO .UFD
JUMPE T4,ENDFL2 ;YES--IF WILD IN, THEN SPECIAL HANDLING
SKIPE SRCH ;IF MULT STRS [154]
JUMPE T2,[SOS NOFILF ; AND MISSING FILE [154]
POPJ P,] ; SUPPRESS MESSAGE AND CATCH LATER [154]
E$$LKE: MOVSI T1,'LKE'
PUSH P,T3 ;[314] [331] Save Protection.
PUSH P,T2 ;[331] Save the Error code.
MOVEI T2,WLDWRN
SKIPE T4 ;IF INPUT, JUST WARN
MOVEI T2,WLDERR
PUSHJ P,(T2) ;ISSUE PREFIX
JRST [POP P,T1 ;IF NOT /VERB:FIRST
POP P,T3 ;RESTORE PROTECTION [314]
PJRST .TCRLF##] ; SKIP REST
POP P,T1 ;RESTORE ERROR CODE
POP P,T3 ;RESTORE PROTECTION [314]
PUSHJ P,.LKERR ;OUTPUT LOOKUP ERROR
PJRST .TFILE ;OUTPUT FILE NAME AND RETURN
ENDFL2: SKIPN SRCH ;SEE IF MULTIPLE STRS
JRST E$$NXU ;NO--ISSUE MESSAGE
SOS NOUFDF ;YES--BACK OFF COUNTER
SOS NOFIL ; .. [154]
SOS NOFILF ; .. [154]
POPJ P, ;AND RETURN
E$$NXU: MOVE T1,['NXU',,[ASCIZ /Non-existent/]]
PUSHJ P,WLDWRN ;ISSUE WARNING
PJRST .TCRLF## ;SKIP REST IF NOT /VERB:FIRST
PJRST UFDERR ;OUTPUT UFD NAME AND RETURN
;ERROR: I/O ERROR WHILE READING DATA FILE
E.DFE: PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,SAVEP1 ;GET BACK LOCAL P1
PUSHJ P,DODCHN ;DO DATA CHANNEL UUO
GETSTS DC,T1 ;GET STATUS BITS
PUSHJ P,STSERR ;OUTPUT STATUS MESSAGE
PUSHJ P,DODCHN ;DO DATA CHANNEL UUO
SETSTS DC,(T1) ;CLEAR ERROR BITS
PJRST .TFILE ;OUTPUT FILE NAME
;LKERR -- OUTPUT LOOKUP ERROR MESSAGE
;CALL: MOVEI T2,ERROR CODE
; MOVEI T3,PROTECTION IF ERROR 2
; PUSHJ P,LKERR
; ERROR RETURN IF UFD BAD
;USES T1, T2, T3
LKERR: HRRZ T2,T2 ;GET ERROR CODE
CAIN T2,ERIPP% ;SEE IF UFD ERROR
POPJ P, ;YES--ERROR RETURN
AOS (P) ;NO--ADVANCE RETURN
E$$LKP: MOVSI T1,'LKP'
PUSH P,T2 ;SAVE ERROR
PUSH P,T3 ;SAVE PROTECTION
PUSHJ P,WLDWRN ;LIST FLAG
JRST [POP P,T3 ;IF NOT /VERB:FIRST
POP P,T1 ; SKIP REST OF
POPJ P,] ; MESSAGE
POP P,T3 ;RESTORE PROTECTION
POP P,T1 ;RESTORE ERROR CODE
;SUBROUTINE ENTRY TO TYPEOUT A LOOKUP ERROR CODE
;CALL IS SAME AS LKERR EXCEPT ERROR IN T1 (LH=0)
;AND ALWAYS RETURNS CPOPJ
;WILL GIVE HUMAN MESSAGE FOR COMMON ERRORS
.LKERR::HRLZ T2,T1 ;PRESERVE ERROR CODE
MOVSI T1,-LKETBL ;GET LENGTH OF ERROR TABLE [163]
LKERRL: HRR T2,LKETB(T1) ;INCLUDE JUNK [163]
CAME T2,LKETB(T1) ;SEE IF MATCH [163]
AOBJN T1,LKERRL ;NO--LOOP ON [163]
JUMPL T1,LKERR1 ;MATCH--GO HANDLE IT [163]
MOVEI T1,[ASCIZ \Lookup/enter failure \]
PUSHJ P,.TSTRG## ;NO--PRINT OCTAL CODE
HLRZ T1,T2 ;GET ERROR CODE
PJRST .TOCTW## ; AND RETURN
LKERR1: HLRZ T2,T2 ;GET ERROR CODE BACK [163]
HRRZ T1,LKETB(T1) ;GET ASCIZ TEXT [163]
CAIE T2,ERPRT%
PJRST .TSTRG## ;ISSUE MESSAGE AND RETURN
PUSHJ P,.TSTRG## ;ISSUE PROTECTION MESSAGE
LSH T3,-<ALIGN.(RB.PRV)> ;POSITION PROTECTION CODE
MOVEI T1," "
SKIPE T3
PUSHJ P,.TCHAR##
SKIPE T1,T3
PUSHJ P,.TOCTW
MOVEI T1,[ASCIZ / failure/]
PJRST .TSTRG## ;AND RETURN
;LOOKUP/RENAME/ENTER ERROR MESSAGES
LKETB: ERFNF%,,[ASCIZ /Non-existent/]
ERIPP%,,[ASCIZ /Non-existent UFD/]
ERPRT%,,[ASCIZ /Protection/]
ERFBM%,,[ASCIZ /File being modified/]
ERAEF%,,[ASCIZ /Already existing/]
ERTRN%,,[ASCIZ /RIB or directory read error/]
ERNRM%,,[ASCIZ /No room/]
ERWLK%,,[ASCIZ /Write locked/]
ERCSD%,,[ASCIZ /Can't supersede directory/]
ERSNF%,,[ASCIZ /Non-existent SFD/]
ERSLE%,,[ASCIZ /Search list empty/]
ERLVL%,,[ASCIZ /SFD too deep/]
ERNCE%,,[ASCIZ /No create/]
LKETBL==.-LKETB
;STSERR -- ISSUE I/O STATUS ERROR MESSAGE
;CALL: GETSTS T1
; PUSHJ P,STSERR
;UPDATES T1 TO CLEAR ERROR BITS
STSERR: PUSH P,T1 ;SAVE STATUS
PUSH P,T2 ;SAVE ACS
PUSH P,T3 ; ..
E$$IOE: MOVE T1,['IOE',,[ASCIZ /Error /]]
PUSHJ P,WLDWRN ;ISSUE WARNING
JRST [POP P,T3 ;IF NOT
POP P,T2 ; /VERB:FIRST
POP P,T1 ; SKIP REST
POPJ P,] ; OF MESSAGE
MOVE T1,-2(P) ;GET STATUS
PUSHJ P,.TOCTW ;LIST STATUS
POP P,T3 ;RESTORE ACS
POP P,T2 ; ..
MOVEI T1,[ASCIZ / while reading/]
PUSHJ P,.TSTRG## ;AND REST OF MESSAGE
POP P,T1 ;RESTORE STATUS
TRZ T1,IO.ERR ;CLEAR ERROR BITS
POPJ P, ;RETURN
;MFDERR -- ISSUE MESSAGE THAT ERROR IS IN MFD
;CALL: PUSHJ P,MFDERR
;USES T1
MFDERR: MOVEI T1,[ASCIZ / MFD/]
PUSHJ P,STRERR ;OUTPUT STRUCTURE NAME
PJRST .TCRLF ;END LINE AND RETURN
;.TFILB -- OUTPUT SPECIFIC SCAN STYLE BLOCK
;.TFILE--OUTPUT UFD OR FILE NAME
;CALL: MOVEI T1,SCAN BLOCK (.TFILB ONLY)
; PUSHJ P,.TFILE/.TFILB
;USES T1
.TFILB::HRLZ T1,T1 ;POINT TO SPEC
HRRI T1,FSTR ;POINT TO TEMP AREA
BLT T1,ENDERR ;COPY
.TFILE::HLRZ T1,FEXT ;SEE WHAT KIND OF FILE
CAIE T1,'UFD' ;SEE IF DIRECTORY
JRST DATERR ;NO--OUTPUT NORMAL FILE NAME
SKIPN T2,FNAM ;GET NAME
MOVE T2,UFDPPN ;ELSE GET DIRECTORY
MOVE T1,UFDPPN ;GET DIRECTORY
PUSH P,UFDPPN ;[346]SAVE UFDPPN
CAMN T1,MFDPPN ;SEE IF MFD
MOVEM T2,UFDPPN ;YES--USE FILE NAME
SETZB T2,UFDPPN+2 ;CLEAR SFD
SETZM UFDPPN+3 ; ..
PUSHJ P,UFDER2 ;[346]YES--OUTPUT DIRECTORY
POP P,UFDPPN ;[346]RESTORE UFDPPN
POPJ P, ;[346]END OF ROUTINE .TFILB
;UFDERR -- ISSUE MESSAGE THAT ERROR IS IN UFD
;CALL: PUSHJ P,UFDERR
;USES T1
UFDERR: MOVE T2,FLDTA ;GET DECTAPE FLAG
UFDER2: MOVEI T1," " ;SPACE OVER
PUSHJ P,.TCHAR ; ..
PUSHJ P,TYPSTR ;OUTPUT STRUCTURE
UFDER3: SKIPN T2 ;SEE IF NOT DECTAPE
PUSHJ P,UFDLSN ;OUTPUT DIRECTORY
MOVEI T1,[ASCIZ /.UFD/]
IFN FT$SFD,<
SKIPE UFDPPN+2 ;SEE IF SFD INCLUDED
MOVEI T1,[ASCIZ /.SFD/]
>
SKIPE T2 ;SEE IF DECTAPE
MOVEI T1,[ASCIZ / directory/]
PUSHJ P,.TSTRG## ;SEND EXTENSION
PJRST .TCRLF ;END LINE AND RETURN
;DATERR -- ISSUE MESSAGE THAT ERROR IS IN A FILE
;CALL: PUSHJ P,DATERR
;USES T1
DATERR: MOVEI T1,[ASCIZ / file /]
PUSH P,T2 ;SAVE AC
IFN FT$SFD,<
HLRZ T2,FEXT ;CHECK EXTENSION FOR SFD
CAIN T2,'SFD' ; ..
MOVEI T1,[ASCIZ / directory /]
>
PUSHJ P,.TSTRG## ;ISSUE PREFIX
PUSHJ P,FILOUT ;OUTPUT FILE NAME AND EXTENSION
POP P,T2 ;RESTORE AC
PJRST .TCRLF ;AND END LINE AND RETURN
;DODCHN -- ROUTINE TO INCLUDE THE DATA CHANNEL IN A UUO AND EXECUTE IT
;CALL: PUSHJ P,DODCHN
; UUO TO EXECUTE
; NON-SKIP POINT
; SKIP POINT
;USES NO ACS
DODCHN: PUSH P,T1 ;PRESERVE T1
MOVE T1,-1(P) ;GET UUO
MOVE T1,(T1) ;GET UUO
AOS -1(P) ;ADVANCE RETURN
IOR T1,AGDCHN ;INCLUDE DATA CHANNEL
EXCH T1,(P) ;RESTORE T1 SAVE UUO
XCT (P) ;DO THE UUO
JRST .+2 ;NON-SKIP
AOS -1(P) ;SKIP
POP P,(P) ;DISCARD UUO
POPJ P, ;RETURN
;FILOUT -- OUTPUT NAME OF FILE AND EXTENSION
;CALL: PUSHJ P,FILOUT
;USES T1, T2
FILOUT: PUSHJ P,TYPSTR ;OUTPUT DEVICE
HLRZ T2,FEXT ;CHECK EXTENSION [153]
TRC T2,'UFD' ;SEE IF .UFD [153]
JUMPE T2,UFDER3 ;YES--USE UFD FORMAT [153]
MOVE T1,FNAM ;GET FILE NAME
PUSHJ P,.TSIXN## ;LIST IT
HLLZ T2,FEXT ;GET FILE EXTENSION
MOVX T1,FX.NUL ;SEE IF USER SPECIFIED NO EXT
TDNE T1,MOD ; SEE IF HE GAVE .
JUMPE T2,FILOU1 ;NO--SEE IF HE LEFT AS NULL
MOVEI T1,"." ;AND SEPARATOR
PUSHJ P,.TCHAR ;YES--TYPE SEPARATOR
MOVE T1,T2 ;GET NAME
PUSHJ P,.TSIXN ;LIST EXTENSION
FILOU1: PJRST UFDLSN ;OUTPUT DIRECTORY AND RETURN
;DIRERR -- ISSUE DIRECTORY ERROR MESSAGE
;CALL: PUSHJ P,DIRERR
;USES T1
DIRERR: MOVEI T1,[ASCIZ /irectory /]
PUSHJ P,STRER1 ;OUTPUT DEVICE
;FALL INTO UFDLSN
;UFDLSN -- ISSUE NAME OF DIRECTORY
;CALL: PUSHJ P,UFDLSN
;USES T1
UFDLSN: PUSH P,T3 ;SAVE SOME ACS
PUSH P,T2 ; ..
SKIPE T1,FRCPPN ;SEE IF FORCING PPN [154]
JRST [MOVEM T1,UFDPPN ;SET AS UFD [315]
SETOM UFDPPN+1 ; NOT WILD [315]
JRST .+1] ;AND PROCEED [315]
SETCM T2,UFDPPN+1 ;GET DIRECTORY MASK [154]
MOVE T1,UFDPPN ;GET DIRECTORY [154]
CAMN T1,MFDPPN ;IF MFD [154]
JUMPE T2,[HLRZ T1,FEXT ;YES--GET THE EXTENSION [337]
CAIE T1,'UFD';SEE IF .UFD [337]
JRST .+1 ;NO--SKIP THIS [337]
MOVE T1,FNAM ;YES--GET NAME [154]
MOVEM T1,UFDPPN ;STORE AS DIRECTORY [154]
MOVE T2,FNAM+1 ;GET NAME MASK [154]
MOVEM T2,UFDPPN+1 ;STORE AS DIRECTORY MASK [154]
JRST .+1] ;THEN PROCEED [154]
MOVEI T1,UFDPPN ;GET UFD NUMBER
IFN FT$SFD,<
TLO T1,2 ;INDICATE DOUBLE WORD PATH
>
PUSHJ P,.TDIRB## ;AND LIST IT
POP P,T2 ;RESTORE THOSE ACS
POP P,T3 ; ..
POPJ P, ;AND RETURN
;STRERR -- OUTPUT MESSAGE AND STRUCTURE NAME
;CALL: MOVEI T1,MESSAGE
; PUSHJ P,STRERR
;USES T1
STRERR: PUSHJ P,.TSTRG## ;OUTPUT MESSAGE
MOVEI T1,[ASCIZ / on /]
STRER1: PUSHJ P,.TSTRG## ;OUTPUT IDENTIFICATION
TYPSTR: SKIPN T1,FSTR ;GET DEVICE NAME
POPJ P, ;RETURN IF NULL
TYPST1: PUSH P,T2 ;SAVE AC
PUSHJ P,.TSIXN ;OUTPUT IT
POP P,T2 ;RESTORE AC
PJRST .TCOLN## ; ..
;WLDWRN -- ISSUE WARNING PREFIX
;WLDERR -- ISSUE ERROR PREFIX
;CALL: MOVSI T1,ERROR CODE IN SIXBIT
; HRRI T1,0 OR ADDRESS OF ASCIZ MESSAGE
; PUSHJ P,WLDWRN/WLDERR
;NON-SKIPS IF REST OF LINE TO BE DISCARDED
;USES T1-T3
WLDWRN: TDZA T2,T2 ;GO FOR WARNING
WLDERR: MOVEI T2,"?"-"%" ;GO FOR ERROR
ADDI T2,"%" ;CONVERT TO RIGHT TEXT
HRLZS T2 ;POSITION ERROR INDICATOR
HRR T2,T1 ;MOVE TEXT POINTER
HLRZS T1 ;POSITION ERROR CODE
HRLI T1,'WLD' ;INDICATE FROM WILD
HRRZ T3,(P) ;GET ADDRESS+1 OF CALL
SUBI T3,2 ;BACKUP TO E$$ POINT
PUSH P,T4 ;PRESERVE T4
PUSHJ P,.ERMSA## ;ISSUE ERROR PREFIX
POP P,T4 ;RESTORE T4
TXNE T1,JWW.FL ;SEE IF /MESSAGE:FIRST
AOS (P) ;YES--INDICATE TO DO REST OF LINE
POPJ P, ;RETURN
SUBTTL STRUCTURE SUBROUTINES
;.INSTR -- ROUTINE TO INITIALIZE STRUCTURE SEARCH LOOP
;.INIST -- SAME AS .INSTR BUT ALSO CAUSES FRCPPN TO BE SET.
;CALL: MOVE T1,DEVICE
; MOVE T2,1B0 IF /PHYSICAL
; PUSHJ P,.INSTR
;NON-SKIP IF NOT A DISK
;SKIP WITH CODES PRESET FOR .NXSTR
; AND T1=0 IF NO SCANNING, =1B0 IF SCANNING
ENTRY .INIST,.INSTR
.INIST::SETZM SUBSTR ;INDICATE .INIST CALL [321]
SKIPA ; [321]
.INSTR::SETOM SUBSTR ;INDICATE .INSTR CALL
PUSHJ P,.SAVE1## ;SAVE P1
MOVSI T3,'SYS' ;SEE IF
DEVCHR T3,UU.PHY ; PHYSICAL
TRNN T3,-1 ; POSSIBLE
TXZ T2,UU.PHS ;NO--CLEAR ARGUMENT
LSH T2,-^D35 ;POSITION TO BIT 35
MOVEM T2,PHYS ;STORE FOR UUO
SETOM SY2RCH ;ASSUME AT LEAST 5.02
MOVEM T1,FSTR ;SAVE DEVICE
SETZM SYSRCH ;CLEAR
SETZM STRMSK ; FLAGS
SETZM STRMTH ; FOR .NXSTR
SETZM SRCH ;CLEAR SEARCH MODE
MOVE T2,T1 ;COPY ARGUMENT DEVICE
PUSHJ P,DOPHYS ;GET
DEVCHR T2, ; ITS CHARACTERISTICS
MOVS T1,FSTR ;GET NAME AGAIN
CAIN T1,'NUL' ;SEE IF NUL:
TLO T2,-1-<(DV.TTA)> ;YES--FAKE DEVCHR FOR OLD MONITORS
TLC T2,-1-<(DV.TTA)> ;SEE IF NUL:
TLCE T2,-1-<(DV.TTA)> ; ..
TXNN T2,DV.DSK ;OR NOT DISK
POPJ P, ;RIGHT--ERROR
;FALL INTO INSTR
;FALL HERE FROM ABOVE
;INSTR -- INTERNAL ROUTINE TO INITIALIZE .NXSTR
INSTR: SETZM FRCPPN ;INDICATE NOT OVERRIDING PPN [154]
IFN FT$SFD,<
MOVE T3,FSTR ;GET STRUCTURE
MOVEI T4,0 ;CLEAR ANSWER
MOVE T2,[3,,T3] ;SETUP CODE
PUSHJ P,DOPHYS ;ASK MONITOR FOR
PATH. T2, ; SYS IDENT.
JRST INSTR3 ;NOT IMPLEMENTED--TRY OLD WAY
MOVE T1,P1 ;SAVE DEVICE PPN
HLRZ T2,T3 ;GET GENERIC STR NAME
CAIN T2,'SYS' ;[334] IF ANY SYS
SETOM SYSRCH ;[334] THEN SET SEARCHING 'SYS' FLAG.
CAIE T2,'SYS' ;LOOK FOR SYS:
TXNE T4,PT.IPP ;NO--SEE IF IGNORE DIRECTORY ARGS
JRST .+2 ;YES--CLOBBER ARGUMENT
JRST INSTR2 ;NO--PROCEED
CAIN T2,'SYS' ;IF SYS,
HRLI T3,'DSK' ;SWITCH TO DSK TO GET RIGHT SUBSET
MOVEM T3,FSTR ; LIKE "SYSA:", ETC.
SKIPN SUBSTR ;IF INTERNAL CALL,
PUSHJ P,SETPPN ; SET REQUESTED PPN
;HERE TO SEE IF SPECIAL SEARCH LIST NEEDED
INSTR2: LDB T1,[POINTR (T4,PT.SLT)] ;GET S/L CODE
JUMPE T1,INSTR3 ;PROCEED IF NOTHING SPECIAL
SETZM SY2RCH ;EXPLICIT INFO, SO CLEAR FLAGS
SETZM SYSRCH ; ..
CAIE T1,.PTSLA ;SEE IF ALL S/L
CAIN T1,.PTSLS ;OR SYS S/L
SETOM SYSRCH ;YES--FLAG FOR ALL OR SYS
CAIN T1,.PTSLS ;SEE IF SYS S/L
SETOM SY2RCH ;YES--FLAG FOR SYS
JRST INSTR7 ;AND SKIP AD HOC KLUDGERY
>
INSTR3: MOVE T2,FSTR ;GET DEVICE NAME
MOVE T3,[1,,T2] ;SET FOR DSKCHR
PUSHJ P,DOPHYS ;DO PHYS I/O CALL
DSKCHR T3, ;SEE IF SYS OR GENERIC
JRST INSTR5 ;FAILED--MUST BE SYS:
LDB T1,[POINTR (T3,DC.TYP)] ;GET NAME CLASS
JUMPE T1,INSTR7 ;JUMP IF DSK:
CAIN T1,.DCTAB ;IF STR ABBR. (SE:)
JRST INSTM1 ; GO SET MASK
CAIN T1,.DCTCN ;IF CONTROLLER CLASS (DP:)
JRST INSTM4 ; GO SET DSKCHR MASK
CAIN T1,.DCTCC ;IF CONTROLLER (DPA:)
JRST INSTM5 ; GO SET IT
JRST INSTRX ;NOTHING SPECIAL--USE USER'S DEVICE
;HERE WHEN STR ABBREVIATION FOUND (LIKE SE: FOR SEFI: AND SEMA:)
INSTM1: MOVE T3,FSTR ;GET ABBREVIATION
DEVNAM T3, ;CONVERT TO PHYSICAL IF WE CAN
MOVE T3,FSTR ;IF NOT DO THE BEST WE CAN
PUSHJ P,.MKMSK## ;GET MASK OF SIZE
JRST INSTM8 ;AND GO STORE
;HERE WHEN CONTROLLER CLASS (DP:)
INSTM4: MOVX T1,DC.CNT ;SET MASK FOR TYPE OF CONTROLLER
JRST INSTM8 ;AND GO STORE
;HERE WHEN CONTROLLER (DPA:)
INSTM5: MOVX T1,<DC.CNT!DC.CNN> ;SET MASK FOR TYPE AND NUMBER OF CONTROLLER
;HERE WITH T1=MASK, T3=MATCH
INSTM8: MOVEM T1,STRMSK ;STORE MASK
MOVEM T3,STRMTH ;STORE MATCH
JRST INSTR6 ;AND FLAG FOR SYSSTR TYPE SEARCHING
;HERE WHEN SYS SEARCH LIST IS SELECTED
INSTR5: SKIPN SYSRCH ;SEE IF ALREADY SETUP
PUSHJ P,SETSYS ;SETUP DIRECTORY FOR SYS:
INSTR6: SETOM SYSRCH ;FLAG FOR SYSTEM SEARCH LIST (F/S LIST)
;HERE WHEN ANY SEARCH LIST IS SELECTED
INSTR7: SETOM SRCH ;FLAG TO USE A SEARCH LIST
INSTRX: SETZM LASSTR ;CLEAR STRUCTURE TO START
SKIPE T1,SRCH ;SEE IF SEARCHING
MOVX T1,UU.PHS ;YES--RETURN /PHYSICAL
JRST CPOPJ1 ;AND SKIP RETURN
;.NXSTR -- ROUTINE TO GET NEXT STRUCTURE
;CALL: PUSHJ P,.NXSTR
;NEVER SKIPS. RETURNS NAME IN T1, 0 IF DONE.
;RESULT SHOULD ALWAYS BE USED PHYSICAL ONLY
ENTRY .NXSTR
.NXSTR::SKIPN SRCH ;HERE FOR NEXT--SEE IF SEARCHING
JRST CPOPJZ ;NO--GO TO NEXT REQUEST
NXSTR2: MOVE T1,LASSTR ;GET F/S NAME FOR LIST
SKIPE SYSRCH ;NEED A NEW F/S
JRST NXSTR3 ;FROM SYSTEM F/S LIST
SKIPN T1 ;SEE IF FIRST PASS
SETOM T1 ;YES--BLANKETY-BLANK UUO
MOVE T2,[1,,T1] ;SETUP POINTER
JOBSTR T2, ;FROM JOB'S SEARCH LIST
HALT CPOPJZ
JRST NXSTR5 ;GOT IT
NXSTR3: SKIPE SY2RCH ;NEEDS SYS: S.L.
SKIPE STRMSK ;IF MASK, NEEDS ALL STR LIST
JRST .+2 ;YES--USE IT
JRST NXSTR4 ;GO USE REAL SYS: SEARCH LIST
SYSSTR T1, ;CAN'T--USE ALL STRS IN SYSTEM
HALT CPOPJZ
JRST NXSTR5 ;GOT IT--GO PROCESS
NXSTR4: SKIPN T1 ;SEE IF AT START
SETOM T1 ;YES--FOOLISH UUO
MOVEM T1,GOBST+2 ;STORE STR IN GOBSTR'S ARG LIST
SETZM GOBST ;SPECIFY JOB 0
MOVX T1,%LDSYS ;GET LOCATION OF SYS:
GETTAB T1, ;FROM MONITOR
MOVE T1,[1,,1] ;(LEV. C)
MOVEM T1,GOBST+1 ;STORE IN ARGUMENT
MOVEI T1,GOBST ;SETUP SHORT BLOCK
GOBSTR T1, ;ASK MONITOR
HALT CPOPJZ ;GIVE UP IF ERROR
MOVE T1,GOBST+2 ;GET ANSWER
;HERE WITH RESULT FROM S/L IN T1
NXSTR5: CAMN T1,[-1] ;LOOK FOR END
JRST CPOPJZ ;YES--DONE
JUMPE T1,CPOPJZ ;IF ZERO, ALL DONE
MOVEM T1,FSTR
MOVEM T1,LASSTR ;SAVE FOR SEARCH
MOVEM T1,.WLDBF ;DO A DSKCHR [303]
MOVE T3,[.DCSAJ+1,,.WLDBF]
PUSHJ P,DOPHYS ; TO HANDLE [303]
DSKCHR T3, ; SINGLE ACCESS [303]
HALT CPOPJZ ; .. [303]
TXNE T3,DC.SAF ;SEE IF SINGLE ACCESS [303]
JRST [PJOB T2, ;YES--GET OUR JOB [303]
XOR T2,.WLDBF+.DCSAJ ;COMPARE TO S.A. USER [303]
TRNE T2,-1 ;SEE IF MATCH [303]
JRST NXSTR2 ;NO--IGNORE STRUCTURE [303]
JRST .+1] ;YES--OK TO TRY IT [303]
SKIPN T2,STRMSK ;SEE IF MASKING RESULTS
JRST NXSTRX ;NO--PROCEED WITH RESULTS
SKIPL T2 ;SKIP IF NAME MASKING
SKIPA T1,T3 ;POSITION DSKCHR FOR MATCH
MOVE T1,FSTR ;YES--GET BACK NAME [303]
XOR T1,STRMTH ;SEE IF MATCHES
TDNE T1,STRMSK ;WHERE IMPORTANT
JRST NXSTR2 ;NO--GO GET NEXT STR
;HERE TO RETURN VALUE TO THE CALLER
NXSTRX: SKIPA T1,FSTR ;RETURN RESULT
CPOPJZ: MOVEI T1,0 ;RETURN ZERO
POPJ P, ;RETURN
SUBTTL USEFUL SUBROUTINES
;SETSYS -- SETUP DIRECTORY FOR SYS:
;CALL: PUSHJ P,SETSYS
;USES T1, T2
SETSYS: MOVX T1,%LDSYS ;GET LOCATION OF SYS:
GETTAB T1, ;FROM MONITOR
MOVE T1,[1,,1] ;(LEV C)
SETPPN: CAMN T1,MFDPPN ;IF MFD:, [153]
JRST [MOVE T2,UFDPPN ;GET DIRECTORY [153]
CAMN T2,MFDPPN ;UNLESS MFD, [153]
POPJ P, ;(YES--RETURN) [153]
MOVEM T2,FNAM ; STORE AS NAME [153]
MOVE T2,UFDPPN+1 ;GET DIRECTORY MASK [153]
MOVEM T2,FNAM+1 ;STORE AS NAME MASK [153]
JRST .+1] ;PROCEED [153]
MOVEM T1,FRCPPN ;OVERRIDE DIRECTORY [154]
MOVE T2,MFDPPN ;GET MFD
CAMN T2,UFDPPN ;SEE IF SAME [154]
JRST SETPP1 ;YES--GO DIDDLE NAME
MOVEM T1,UFDPPN ;AND OVERSTORE REQUEST [154]
SETOM UFDPPN+1 ;AND NO WILD DIRECTORY [154]
IFN FT$SFD,<
SETZM UFDPPN+2 ;CLEAR SUB DIRECTORY [154]
SETZM UFDPPN+3 ; AND MASK [154]
>
POPJ P, ;RETURN
SETPP1: MOVEM T1,FNAM ;STORE OVER NAME [154]
SETOM FNAM+1 ;CLEAR WILD CARD [154]
POPJ P, ;RETURN
;DOPHYS -- PERFORM A LOGICAL OR PHYSICAL CALLI AS NEEDED
;CALL: PUSHJ P,DOPHYS
; CALLI TO BE EXECUTED
; CPOPJ RETURN POINT
; SKIP RETURN POINT
;USES T1
DOPHYS: MOVE T1,(P) ;FETCH CALLI
MOVE T1,(T1) ; ..
AOS (P) ;ADVANCE RETURN POINT
SKIPE PHYS ;SEE IF PHYS I/O REQUESTED
TRO T1,UU.PHY ;YES--TURN ON PHYSICAL BIT
XCT T1 ;DO THE CALLI
POPJ P, ;OK RETURN
CPOPJ1: AOS (P) ;SKIP
CPOPJ: POPJ P, ;RETURN
;SETOPN -- SETUP OPEN BLOCK WORD 1 AND 2
;CALL: PUSHJ P,SETOPN
;RETURNS WITH T1, T2 SETUP, T3=0
;USES NO ACS
SETOPN: SETZB T1,T3 ;OPEN MFD
SKIPN PHYS ;SEE IF PHYS I/O REQUESTED
SKIPE SRCH ;OR IF USING A SEARCH LIST
TLO T1,(UU.PHS) ;YES--SET FOR PHYS OPEN
SKIPN T2,LASSTR ;GET STRUCTURE OR [310]
MOVE T2,FSTR ;GET ARGUMENT DEVICE
POPJ P, ;RETURN
XLIST ;LITERALS
LIT
LIST
RELOC
.WILDZ::! ;START OF LOW CORE AREA
FWAZER:! ;START OF TEMPORARIES (CLEARED EACH REQUEST)
;THIS PARALLELS INPUT PARAMETER AREA
FSTR: BLOCK 1 ;CURRENT STRUCTURE
FNAM: BLOCK 2 ;CURRENT FILE NAME
FEXT: BLOCK 1 ;CURRENT FILE EXTENSION
MOD: BLOCK 2 ;CURRENT SWITCHES
UFDPPN: BLOCK 2*.FXLND+2 ;CURRENT DIRECTORY
ENDERR==.-1
FLDTA: BLOCK 1 ;FLAG THAT DISK DEVICE
NOTDSK: BLOCK 1 ;FLAG THAT NOT A DTA/DISK DEVICE
SUBSTR: BLOCK 1 ;FLAG CALL TO SUBROUTINE .NXSTR
LASSTR: BLOCK 1 ;LAST STR FROM SEARCH UUOS
LASERR: BLOCK 1 ;LAST ERROR OF DIRECTORY NATURE
NOSTRS: BLOCK 1 ;NUMBER OF STRS IN SEARCH LIST
NOFILF: BLOCK 1 ;NUMBER OF FILES FOUND
NOFILP: BLOCK 1 ;NUMBER OF FILES WITH UNREPORTED PROTECTION ERRORS
NODIRP: BLOCK 1 ;NUMBER OF DIRECTORIES WITH UNREPORTED PROTECTION ERRORS
NOFILR: BLOCK 1 ;NUMBER OF FILES REJECTED
NOFIL: BLOCK 1 ;NUMBER OF FILES LOOKED AT
NOUFDF: BLOCK 1 ;NUMBER OF UFDS FOUND
NSUFD: BLOCK 1 ;NUMBER OF EXISTENT UFDS FOUND
DIRFLG: BLOCK 1 ;-1 IF THIS IS A DIRECTORY
.FRCPP::! ; [320]
FRCPPN: BLOCK 1 ;PPN TO OVERRIDE WITH
FNDSFD: BLOCK .FXLND+1 ;+N IF SFD FIRST PASS, -1 IF SECOND [316]
.WLDFL::BLOCK 1 ;FILE WILD FLAG (-1=WILD FILE, +1=WILD STR ONLY,
; 0=NEITHER, -2 IF WILD FILE AND WILD STR)
STRMSK: BLOCK 1 ;MASK FOR MATCHING STRS
; BY NAME IF LT 0, BY DSKCHR IF GT 0
STRMTH: BLOCK 1 ;MATCH FOR ABOVE
UFDEF: BLOCK 1 ;FLAG THAT UFD ERROR WAS REPORTED
PHYS: BLOCK 1 ;FLAG TO FORCE PHYSICAL I/O
SRCH: BLOCK 1 ;FLAG FOR SEARCH LIST IN USE
SYSRCH: BLOCK 1 ;FLAG FOR SYSTEM SEARCH LIST IN USE
SY2RCH: BLOCK 1 ;FLAG FOR REAL SYS: SEARCH LIST
.WIFIR::BLOCK 1 ;FIRST P1 IN LINKED SET
.WILAS::BLOCK 1 ;LAST P1 IN LINKED SET
FLCRDT: BLOCK 1 ;FILE'S CREATION DATE-TIME [300]
FLACDT: BLOCK 1 ;FILE'S ACCESS DATE [300]
GOBST: BLOCK 5 ;GOBSTR PARAMETER AREA
IFN FT$SFD,<
DIRB: BLOCK 1 ;BLOCK FOR DIRECTORY FOR SFD LOOKUPS
DIRBS: BLOCK 1 ; (SCANNING SWITCH)
DIRBU: BLOCK .FXLND ; (ACTUAL DIRECTORY LIST)
DIRBE: BLOCK 1 ;0 TO FORCE END
>
DEPTH: BLOCK 1 ;INDEX OF DIRECTORY DEPTH (0=MFD)
BUFCNT: BLOCK .FXLND+1 ;COUNT DOWN OF FILES IN BLOCK
BUFPOS: BLOCK .FXLND+1 ;INDEX IN BLOCK
DIRSTI: BLOCK .FXLND+1 ;USETI IN DIRECTORY
.WLDBF::BLOCK 200 ;BUFFER FOR READING DIRECTORIES
DVCH: BLOCK 1 ;LAST DEVICE CHARACTERISTICS
LWAZER==.-1 ;END OF CLEARED AREA
MFDPPN: BLOCK 1 ;DIRECTORY FOR MFD
MYPPN: BLOCK 1 ;PPN OF THIS JOB
IFN FT$SFD,<
PTHARG: BLOCK 1 ;ARGUMENT/FLAG FOR PATH UUO
PTHSCN: BLOCK 1 ;SCAN SWITCH FOR PATH UUO
PTHDIR: BLOCK .FXLND ;ACTUAL PATH
PTHEND: BLOCK 1 ;0 TO FORCE END
PTHLEN==.-PTHARG
>
AGLENL: BLOCK 1 ;LENGTH OF LOOKUP BLOCK
AGLENP: BLOCK 1 ;LENGTH OF PARAMETER AREAS FROM SCANER
AGLIMS: BLOCK 1 ;LOCATION OF LAST AREA FROM SCANER
AGLOOK: BLOCK 1 ;LOCATION OF LOOKUP BLOCK
AGOPEN: BLOCK 1 ;LOCATION OF OPEN BLOCK
AGPNTR: BLOCK 1 ;LOCATION OF INDEX TO SCANER AREAS
AGDCHN: BLOCK 1 ;DATA CHANNEL
AGFLAG: BLOCK 1 ;USER'S FLAGS
AGEODN: BLOCK 1 ;ROUTINE TO NOTIFY AT END OF DIRECTORY
;STORAGE FOR SCWLD
SCISP: BLOCK 1 ;INPUT SPEC LOCATION
SCIOPN: BLOCK 1 ;INPUT OPEN LOCATION
SCILKP: BLOCK 1 ;INPUT LOOKUP LOCATION
SCOSP: BLOCK 1 ;OUTPUT SPEC LOCATION
SCOOPN: BLOCK 1 ;OUTPUT OPEN LOCATION
SCOLKP: BLOCK 1 ;OUTPUT LOOKUP LOCATION
SCODFE: BLOCK 1 ;ADDRESS OF DEFAULT EXTENSION
SCOLLK: BLOCK 1 ;OUTPUT LOOKUP LENGTH
SCCHR: BLOCK 1 ;DEV CHR
SCTYP: BLOCK 1 ;DEV TYP
SCNBT: BLOCK 1 ;TEMP FOR FNDNBT
SCNWD: BLOCK 1 ;TEMP FOR FNDNBT
IFN FT$SFD,<
SCSFD: BLOCK 1 ;ARG/FLAG
SCSFDS: BLOCK 1 ;SCAN
SCSFDD: BLOCK .FXLND ;ACTUAL PATH
SCSFDE: BLOCK 1 ;0 TO FORCE END
>
SAVEP1: BLOCK 1 ;STORAGE FOR USER'S P1
B.DC:: BLOCK 3 ;DATA
FDBLK: BLOCK 6 ;[344] UFD/SFD EXTENDED LOOKUP BLOCK
.WILDL==:.-.WILDZ ;LENGTH OF LOW CORE AREA
END