; ; File: CMMAINT.a ; ; Written by: Bill Bruffey ; ; Copyright: © 1984-1991 by Apple Computer, Inc., all rights reserved. ; ; Change History (most recent first): ; ; <2> 9/10/91 JSM Add a header. ; <1.3> 3/2/89 DNF removed references to forROM; HFS now builds identically for ram ; or rom ; <1.2> 11/21/88 CCH Replaced references to forRAM with “NOT forROM.” ; <1.1> 11/10/88 CCH Fixed Header. ; <1.0> 11/9/88 CCH Adding to EASE. ; <•1.1> 9/23/88 CCH Got rid of inc.sum.d and empty nFiles ; <1.0> 2/11/88 BBM Adding file for the first time into EASE… ; 10/27/86 BB Vectored LocCRec routine. ; 9/25/86 BB Updated to use new MPW equate files. ; 10/16/85 BB Modified all routines to use new new MOVEQ error code equates. ; 9/9/85 BB Added UpdCName and modified BuildKey to use it. ; 8/29/85 BB Blockmove arg fix. ; 7/29/85 BB Modified CMKeyCmp to use RelString. ; 7/24/85 BB Modified BuildKey to truncate CNames to max length ; 7/10/85 BB Added CMFlush routine. ; 6/22/85 PWD Changed to force keys in root's parent to full length for easy ; replacement. ; 6/13/85 BB Cleaned it up some. ; 3/15/85 BB Modified to use A6 stack. ; 3/7/85 BB Modified to support the existence of a root directory record. ; 2/13/85 BB Added CM key compare routine. ; 1/2/85 BB Re-worked adding LocCRec. ; 12/17/84 BB Added LocCNode. ; 12/13/84 BB Birth. ; ;_________________________________________________________________________________ ; ; External ; Routines: BuildKey - Constructs a catalog key record (ckr) given the ; parent directory ID and CName. ; CMFlush - Flushes the catalog for a specified volume. ; CMKeyCmp - Compares two catalog keys. ; LocCNode - Locates the catalog record for an existing directory ; or file CNode. ; LocCRec - Locates a catalog record in the catalog BTree file. ; UpdCName - Updates a CName. ; ; Function: These routines provide low level utility functions used to ; maintain the file catalog. ; ;_________________________________________________________________________________ BLANKS ON STRING ASIS PRINT OFF LOAD 'StandardEqu.d' PRINT ON PRINT NOGEN CMMaint PROC EXPORT EXPORT BuildKey,CMFlush,CMKeyCmp,LocCNode,LocCRec,UpdCName EXPORT vLocCRec ;<27Oct86> IMPORT BTFlush,BTSearch,BTUpdate,MarkVCB,FlushMDB ;_________________________________________________________________________________ ; ; Routine: BuildKey ; ; Function: Constructs a catalog key record (ckr) given the parent ; directory ID and CName. ; ; Input: D0.L - parent directory id ; A0.L - addr(CName) ; A1.L - addr(ckr buffer) ; ; Output: A1.L - addr(ckr buffer) containing key record ;_________________________________________________________________________________ BuildKey MOVEM.L D0/A0-A1,-(SP) ; save regs MOVE.B #6,ckrKeyLen(A1) ; initial key length CLR.B ckrResrv1(A1) ; clear unused byte MOVE.L D0,ckrParID(A1) ; parent ID CLR.B ckrCName(A1) ; assume null CName MOVE.L A0,D0 ; CName given? BEQ.S BKExit ; no, all done -> MOVE.L A1,-(SP) ; save ptr to ckr <09Sep85> LEA ckrCName(A1),A1 ; dest = CName in ckr buffer <09Sep85> BSR UpdCName ; move in the CName <09Sep85> MOVE.B (A1),D0 ; get CName length <09Sep85> MOVEA.L (SP)+,A1 ; restore ptr to ckr <09Sep85> ADD.B D0,ckrKeyLen(A1) ; add CName length to key length <09Sep85> BKExit MOVEM.L (SP)+,D0/A0-A1 ; restore regs RTS ; exit BuildKey ;_________________________________________________________________________________ ; ; Routine: CMFlush (CM Flush) ; ; Function: Flushes the catalog for a specified volume. ; ; Input: A2.L - VCB pointer ; ; Output: D0.W - result code ; 0 = ok ; other = error ;_________________________________________________________________________________ CMFlush MOVE.L (SP)+,-(A6) ; save return address on A6 stack MOVEM.L D1/A1,-(A6) ; save registers MOVE.W VCBCTRef(A2),D1 ; D1 = refnum of catalog file MOVE.W D1,D0 ; flush the catalog BTree JSR BTFlush ; BNE.S CFExit1 ; error -> MOVEA.L FCBSPtr,A1 ; FCB dirty? BTST #FCBModBit,FCBMdRByt(A1,D1.W) ; BEQ.S CFExit ; no, all done -> JSR MarkVCB ; mark the VCB dirty JSR FlushMDB ; flush the MDB BNE.S CFExit1 ; error -> CFExit CLR.W D0 ; result ='ok' CFExit1 MOVEM.L (A6)+,D1/A1 ; restore registers MOVE.L (A6)+,-(SP) ; put return address back on stack TST.W D0 ; set condition codes RTS ; exit CMFlush ;_________________________________________________________________________________ ; ; Routine: CMKeyCmp (CM Key Compare) ; ; Function: Compares two catalog keys (a search key and a trial key). ; ; Input: A0.L - search key pointer ; A1.L - trial key pointer ; ; Output: D0.W - result code ; +n search key > trial key ; 0 search key = trial key ; -n search key < trial key ; ; Called By: SearchNode (in BTMaint2) ;_________________________________________________________________________________ CMKeyCmp MOVEM.L D1-D2/A0-A3,-(SP) ; save registers MOVEA.L A0,A2 ; A2 = ptr(search key) MOVEA.L A1,A3 ; A3 = ptr(trial key) ; ; compare DirID's first ; MOVE.L ckrParID(A2),D0 ; compare parID's CMP.L ckrParID(A3),D0 ; BHI.S KCIsGT ; search ParID > trial parID -> BLO.S KCIsLT ; search ParID < trial parID -> ; ; ParID's are equal, compare the CNames ; KCCmpName LEA ckrCName(A2),A0 ; ptr(CName string) for search key LEA ckrCName(A3),A1 ; ptr(CName string) for trial key MOVEQ #0,D0 ; D0(high order word) = length(search key) MOVE.B (A0)+,D0 ; SWAP D0 ; D0(low order word) = length(trial key) MOVE.B (A1)+,D0 ; _RelString ; compare the CNames BEQ.S KCIsEQ ; search CName = trail CName -> BGT.S KCIsGT ; search CName > trail CName -> KCIsLT MOVEQ #-1,D0 ; result = "less than" BRA.S KCExit KCIsEQ MOVEQ #0,D0 ; result = "equal" BRA.S KCExit KCIsGT MOVEQ #1,D0 ; result = "greater than" KCExit MOVEM.L (SP)+,D1-D2/A0-A3 ; restore registers TST.W D0 ; set up condition codes RTS ; exit CMKeyCmp ;_________________________________________________________________________________ ; ; Routine: LocCNode (Locate CNode) ; ; Function: Locates the catalog record for an existing directory or file ; CNode and returns pointers to the key and data records. ; ; ; Input: A2.L - VCB pointer ; A4.L - ptr(CM vars) ; D0.L - DirID or parent DirID ; A0.L - CName pointer ; D2.L - catalog hint (node address) ; ; Output: D0.W - result code ; 0 = ok ; CMnotfound = CNode not found ; -n = IO error ; A0.L - pointer to catalog key record (ckr) ; A1.L - pointer to catalog data record (cdr) ; D1.W - size of catalog data record ; D2.L - catalog hint ; A2.L - VCB pointer ; A4.L - ptr(CM vars, contains key record) ;_________________________________________________________________________________ LocCNode MOVE.L (SP)+,-(A6) ; save return address on A6 stack ; ; locate catalog record using given CNode specification ; JSR LocCRec ; locate the record BNE.S LCExit ; didn't find it -> CMPI.B #cdrThdRec,cdrType(A1) ; thread record ? BNE.S LCExit ; no, all done -> ; ; thread record found, locate corresponding directory record ; LEA thdCName(A1),A0 ; addr(directory CName) MOVE.L thdParID(A1),D0 ; parent directory ID BSR LocCRec ; locate directory record ; ; clean up and exit ; LCExit MOVE.L (A6)+,-(SP) ; put return address back on stack TST.W D0 ; set condition codes RTS ; exit LocCNode ;_________________________________________________________________________________ ; ; Routine: LocCRec (Locate Catalog Record) ; ; Function: Locates an catalog record in the catalog BTree file and returns ; a pointers to the key and data records. If DirID is specified, ; the corresponding thread record is located. If ParID/CName is ; specified, the corresponding directory or file record is located. ; ; Input: A2.L - VCB pointer ; A4.L - ptr(CM vars) ; D0.L - DirID or parent DirID ; A0.L - CName pointer ; D2.L - catalog hint ; ; Output: D0.W - result code ; 0 = ok ; CMnotfound = CNode not found ; -n = IO error ; A0.L - pointer to catalog key record (ckr) ; A1.L - pointer to catalog data record (cdr) ; D1.W - size of catalog data record ; D2.L - catalog hint ; A2.L - VCB pointer ; A4.L - ptr(CM vars, contains key record) ;_________________________________________________________________________________ LocCRec MOVE.L jLocCRec,-(SP) ; jump table entry for vLocCRec <27Oct86> RTS ; go there <27Oct86> vLocCRec ; 'vectored' LocCRec routine <27Oct86> MOVE.L (SP)+,-(A6) ; save return address on A6 stack ; ; build key record ; LEA ckrOff(A4),A1 ; addr(key record buffer) JSR BuildKey ; build key record ; ; locate catalog record in BTree ; MOVE.L A0,D0 ; CName given? BNE.S @1 ; yes, use hint -> CLR.L D2 ; no, dont't use hint @1 LEA ckrOff(A4),A0 ; addr(key record) MOVE.W vcbCtRef(A2),D0 ; catalog file refnum JSR BTSearch ; locate record in BTree BEQ.S LRExit ; found it -> CMP.W #BTnotfound,D0 ; record not found? BNE.S LRExit ; no, some other error -> MOVEQ #CMnotfound,D0 ; set CM result code <16Oct85> ; BRA.S LRExit ; exit -> <25Sep86> ; ; found the record, set return stuff and exit ; LRExit MOVE.L (A6)+,-(SP) ; put return address back on stack TST.W D0 ; set condition codes RTS ; exit LocCRec ;_________________________________________________________________________________ ; ; Routine: UpdCName ; ; Function: Updates a CName. ; ; Input: A0.L - pointer to source CName ; A1.L - pointer to destination CName ; ; Output: none ;_________________________________________________________________________________ UpdCName MOVEM.L D0-D1/A0-A1,-(SP) ; save regs <09Sep85> MOVEQ #0,D0 ; D0 = source CName length <09Sep85> MOVE.B (A0)+,D0 ; <09Sep85> MOVEQ #CMMaxCName,D1 ; D1 = max CName length <09Sep85> CMP.W D1,D0 ; CName length > max? <09Sep85> BLE.S @1 ; no -> <09Sep85> MOVE.W D1,D0 ; yes, truncate to max <09Sep85> @1 MOVE.B D0,(A1)+ ; set length byte <09Sep85> _BlockMove ; copy CName to dest <09Sep85> MOVEM.L (SP)+,D0-D1/A0-A1 ; restore regs <09Sep85> RTS ; exit UpdCName <09Sep85> END