; ; ; B$DELETEDATA ; ; B$DELETEDATA - INTERNAL ROUTINE TO DELETE OFSPRING ; ; ROUTINE NAME: B$DELETEDATA ; ; PURPOSE: To delete all the ofspring of the currently active ; key. ; ; CALLABLE: From MACRO only ; ; PARAMETERS: ; R5 Must point to a zero word. ; R4 Pointer to database root block and I/O buffers. ; R3 Scratch used as buffer address. ; R2 Stack pointer to level table. ; R1 Used as scratch ; R0 Used as scratch. ; ; ROUTINES USED: B$ACTIVATE B$DEALOCATE B$READKEY ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO1 with SUPERMAC ; ; OBJECT MODULE NAME: B$DELE ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 BUF=R3 LEVEL=R2 TEM=R1 TEM2=R0 .MCALL SUPER SUPER PROCEDURE B$DELETEDATA ;THIS PROCEDURE DOES A TREE ;SEARCH OF THE OFSPRING TO ;DELETE THEM ALL PROPERLY ; IF RT.LEV(ROOT) EQ RT.NLV(ROOT) ;IF THIS IS THE BOTTOM LEVEL OF ;STRUCTURE, YOUR JOB IS EASY RETURN ;THERE ARE NO OFSPRING END PUSH RT.LEV(ROOT) ;REMEMBER THE CURRENT LEVEL DEPTH LOOP: LET RT.LEV(ROOT) := . +1 ;PERFORM YOUR OWN PUSHLV LET LEVEL := . + #LV.SIZE ;INC LEVEL SP LET RT.PCL(ROOT) := LEVEL ;STORE LEVEL SP IN ROOT LET RT.BUF(ROOT) := . + #DB.SIZE ;INCRIMENT BUFFER POINTER ;CALCULATE LAST LEGAL KEY ADDRESS LET RT.LLA(ROOT) := RT.BUF(ROOT) + LV.LLK(LEVEL) ;IF THIS IS NOT THE BOTTOM LEVEL OF ;THE STRUCTURE, I MUST FIND THE NEXT ;KEY ACCROSS AND DELETE ITS OFSPRING IF RT.LEV(ROOT) LT RT.NLV(ROOT) FIND: SCALL B$READKEY ;FIND THE NEXT KEY ;IF THERE S STILL A KEY ACCROSS HERE, ;I MUST BRANCH BACK TO THE SECTION OF ;CODE THAT PUSHES TO IT'S OFSPRING IF R0 GT #0 THEN GOTO LOOP ;IF NOT, I CAN DEALOCATE ALL THE BLOCKS ;THAT ORIGINALLY CONTAINED KEYS AT THIS ;LEVEL END SCALL B$ACTIVATE ;READ IN THE FIRST SIBLING BLOCK ON.NOERROR ;IF THERE ARE NO BLOCKS, THE JOB IS EASY REPEAT ;WHEN THERE ARE, I MUST DEALOCATE THEM ALL ;DEALOCATE RETURNS CS WHEN THE LAST ;BLOCK IS GONE SCALL B$DEALOCATE UNTIL RESULT IS CS END ;NOW THAT ALL KEYS ARE DEALOCATED ;AT THIS LEVEL, I CAN BACKUP TO ;THE PREVIOUS LEVEL AND LOOK FOR ;MORE STUFF TO DELETE ;DE-ACTIVATE THIS LEVEL LET LV.FLG(LEVEL) := . OFF.BY #FL.ACT LET RT.LEV(ROOT) := . -1 ;BACKUP TO PREV. LEVEL LET LEVEL := LEVEL - #LV.SIZE ;AND PREV. LEV SP LET RT.PCL(ROOT) := LEVEL ;STORE THATT IN ROOT LET RT.BUF(ROOT) := . - #DB.SIZE ;AND PREV. BUFFER ;CALCULATE THE LAST LEGAL KEY ADDRS LET RT.LLA(ROOT) := RT.BUF(ROOT) + LV.LLK(LEVEL) ;QUIT WHEN YOU CLIMB BACK UP TO ;THE KEY YOU STARTED WITH IF RT.LEV(ROOT) GT (SP) THEN GOTO FIND TST (SP)+ ;CLEAN UP STACK ENDPROCEDURE B$DELETEDATA .END