TITLE .WILD -- SUBROUTINE TO PERFORM WILDCARD LOOKUP %7A(327) SUBTTL P.CONKLIN/PFC/JNG/MD/RKH/LCR 07-JUN-76 ;***COPYRIGHT 1970, 1971, 1972, 1973, 1974, 1975, 1976 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.*** CUSTVR==1 ;CUSTOMER VERSION DECVER==7 ;DEC VERSION DECMVR==1 ;DEC MINOR VERSION DECEVR==327 ;DEC EDIT VERSION ;SUBROUTINE TO SCAN DIRECTORIES AND RETURN LOOKUP BLOCKS FOR THE ;VARIOUS NAMES WHICH MATCH WILD-CARDS. SEARCH C,SCNMAC SALL ;ASSEMBLY INSTRUCTIONS: ; IF1,< ..==%%C+%%SCNM IFNDEF ..,< PRINTX ? .COMPILE WILD USING C.MAC AND SCNMAC.MAC AS UNIVERSALS PASS2 END> PURGE ..> ; ;THEN LOAD THE .REL FILE WITH ANY PROGRAM NEEDING IT. ;;;;;;;;;;;;;;; W A R N I N G ;;;;;;;;;;;;;;;; ;;;; UPDATE WILDDM IF LOW-SEG CHANGES ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; XP %%WILD,B2+B11+B17+DECEVR ; 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 ;**;[324], COMMNENT TO EXPLAIN BLOCK+0 , MD , 15-JAN-76 ; 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, 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. ;%2(76) -- 5/72 WITH DIRECT %2. ;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. ; ;*******CUSTOMER REVISION HISTORY ;1 FIX BUG AT E$$LKE. THINGS POPPED OFF STACK IN WRONG ORDER ; 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 ;**;[324], FLAGS DEFINITION, MD, 15-JAN-76 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] ;**;[325] Restructure @LOOK1A RKH 27-Jan-75 LOOK1A: ADD P1,AGLENP ;[325] ADVANCE TO NEXT ONE 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, ;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 ;**;[324],STR1+2 , MD , 15-JAN-76 JUMPN T1,STR7 ;[324] IF NOT DONE, GO PROCESS THIS STR MOVX T1,DIRSYS ;[324] IF CALLER WANTS TO SEARCH [1,4] AFTER [1,4] ;** [327] ADD @ STR1+3 07-JUN-76 LCR. MOVSI T4,'NEW' ;[327] IS THIS CAME T4,.FXDEV(P1) ;[327] DEVICE 'NEW:' IF IS WE'RE 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! PUSHJ P,SETSYS ;[324] SET FRCPPN TO SYSTEM SYS [1,4] 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 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 TLNN T1,-1 ;SEE IF LH=0 JRST WILDN ;YES--CAN'T HAPPEN UNLESS MONITOR ERROR 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 ;**;[323] Replace @ WILDSN+3 JNG 15-Oct-75 CAIN T4,.FXLND ;NO--SEE IF LIMIT OF DIRECTORY [154] JRST WILDSG ;YES--GO WITH MATCH [154] SKIPN T4 ;IF AT TOP LEVEL, [323] SKIPN FRCPPN ; AND PPN FORCED, [154] SKIPA ; (NOT TRUE) [323] JRST WILDNW ; TREAT AS NO WILD-CARDS [154] ;** EDIT 326 INSERT @WILDSN+8 18-MAY-76 LCR SKIPE .FXDIR(T3) ;[326] IS THERE A DIRECTORY? JRST WILDD ;[326] YES.- CONTINUE... SKIPE FRCPPN ;[326] IS THIS A FORCED PPN? JRST WILDSG ;[326] YES GO WITH MATCH. SETCM T2,.FXDIM(T3) ;GET MASK JUMPE T2,WILDNW ;IF NO WILD CARD, GO DOWN ONE LEVEL ;** EDIT 326 DELETED THE NEXT TWO LINES 18-MAY-76 LCR. ;** EDIT 326 SKIPE .FXDIR(T3) ;OF RESQUESTED DIRS ;** EDIT 326 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 SKIPE DIRSTI ;SEE IF FIRST TIME HERE JRST WILDE ;NO--GO HANDLE AS EOF MOVEI T1,^D100 ;SET FOR DECTAPE POSITION MOVEM T1,DIRSTI ;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: MOVEI T3,0 ;CLEAR E+2 LOOKUP WC,T1 ;LOOKUP DIRECTORY JRST E.UFL ;ERROR--GO GIVE MESSAGE 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 ;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, IFE FT$COR, ;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,<-> ;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, ;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: 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' ;**BLS,12/1/76,PUSH ON PDL IN CORRECT ORDER PUSH P,T3 ;SAVE PROTECTION [314] PUSH P,T2 ;SAVE 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,- ;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 CAMN T1,MFDPPN ;SEE IF MFD MOVEM T2,UFDPPN ;YES--USE FILE NAME SETZB T2,UFDPPN+2 ;CLEAR SFD SETZM UFDPPN+3 ; .. JRST UFDER2 ;YES--OUTPUT DIRECTORY ;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] IFN FT$SFD,< SETZM UFDPPN+2 ; NO SFDS [315] SETZM UFDPPN+3 ; [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,[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 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 TXNN T4,PT.IPP ;SEE IF IGNORE PPN SETOM SYSRCH ;NO--SET SYS FLAG ;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, ;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 .WILDL==:.-.WILDZ ;LENGTH OF LOW CORE AREA END