; ; ; BACKUP ; ; BACKUP- BACKS UP TO PREVIOUS LEVEL OF STRUCTURE ; ; ROUTINE NAME: BACKUP ; ; PURPOSE: To back up to the previous level of the tree ; structure of a database file. ; ; CALLABLE: From FORTRAN only: ; CALL BACKUP(ROOT[,ERR]) ; or ; ERR=BACKUP(ROOT) ; ; PARAMETERS: ROOT The database root block and I/O buffers. ; ERR The error return status, where: ; ERR= 0 means you can't backup that far. ; ERR= -1 means successful return. ; ERR=-100 means bad root block. ; ; ROUTINES USED: None. ; ; EXAMPLE: ; CALL BACKUP(ROOT) ; IF (BACKUP(ROOT) .EQ. 0) GOTO 999 ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO 11 with SUPERMAC ; ; OBJECT MODULE NAME: BACKUP ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 BUF=R3 LEVEL=R2 .MCALL SUPER SUPER PROCEDURE BACKUP ;(ROOT[,ERR]) ;PARAMETER ASSIGNMENTS RT=2 ERR=4 LET ROOT := RT(R5) ;GET ROOT BLOCK ADDRESS IF DB.BLT(ROOT) NE #"RT ;IS THIS A ROOT BLOCK??? FORET #ER.NRB,ERR ;NO! RETURN ERROR RETURN END IF RT.LEV(ROOT) EQ #1 ;AM I ALRADY AT THE TOP? FORET #0,ERR ;YES, YOU CANNOT BACKUP THAT FAR RETURN END LET LEVEL := RT.PCL(ROOT) ;GET THE LEVEL STACK POINTER ;DE-ACTIVATE THE CURRENT LEVEL ;BEFORE YOU LEAVE IT LET LV.FLG(LEVEL) := . OFF.BY #FL.ACT LET RT.LEV(ROOT) := . - #1 ;DECRIMENT THE STACK DEPTH COUNTER LET RT.PCL(ROOT) := . - #LV.SIZE ;DECRIMENT STE LEVEL STACK POINTER LET RT.BUF(ROOT) := . - #DB.SIZE ;DECRIMENT THE I/O BUFFER POINTER ;CALCULATE THE LAST LEGAL KEY ;ADDRESS FOR THIS LEVEL LET RT.LLA(ROOT) := RT.BUF(ROOT) + LV.LLK-LV.SIZE(LEVEL) FORET #-1,ERR ;RETURN SUCCESS ENDPROCEDURE BACKUP .END