; ; ; KEYAGE ; ; KEYAGE - RETURNS THE AGE OF A KEY ; ; ROUTINE NAME: KEYAGE ; ; PURPOSE: THIS routine calculates and returns the age of the ; currently active key. ; ; CALLABLE: From FORTRAN only: ; CALL KEYAGE(ROOT,AGE[,ERR]) ; ; PARAMETERS: ; ROOT The database root block and I/O buffers. ; AGE Return parameter for the age of the key. ; ERR Error return parameter, where: ; ERR=0 Means failure (bad root block or no key cur- ; rently active). ; ERR=-1 Means successful return ; ; ROUTINES USED: None. ; ; EXAMPLE: ; CALL KEYAGE(ROOT,AGE,ERR) ; ERR=KEYAGE(ROOT,KEY) ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: KEYAGE ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 LEVEL=R2 TEM=R0 TEM1=R1 ; PARAMETERS: RT=2 AGE=4 ERR=6 .MCALL SUPER SUPER PROCEDURE KEYAGE ; (ROOT,AGE[,ERR]) LET ROOT := RT(R5) ;GET THE ROOT BLOCK ADDRESS ;ERROR IF THIS IS NOT A BIODATABASE HEADER IF DB.BLT(ROOT) EQ #"RT ;IS IT?? ;THE LEAVES OF THE TREE DO NOT HAVE AGES IF RT.LEV(ROOT) NE RT.NLV(ROOT) ;SO RETURN ERROR LET LEVEL := RT.PCL(ROOT) ;GET THE LEVEL SP ;ERROR IF THIS LEVEL IS NOT ACTIVE IF #FL.ACT SET.IN LV.FLG(LEVEL) ;GET THE ADDRESS OF THE KEY LET TEM := LV.PCE(LEVEL) ;ERROR IF THIS LEVEL HAS NO KEYS IF RESULT IS EQ THEN GOTO ERROR ;ERROR IF THE CURRENT KEY IS DELETED IF (TEM) NE #0 ;SKIP TO END OF DATA SECTION LET TEM := . + LV.LEN(LEVEL) - #4 ;CALCULATE THE AGE FROM THE FILE AGE LET TEM1 := RT.AGE(ROOT) - @TEM ;RETURN SUCCESSFULLY LET @AGE(R5) := TEM1 FORET #-1,ERR RETURN END END END END ; HERE FOR FAILURE RETURN ERROR: LET @AGE(R5) := #0 FORET #0,ERR ENDPROCEDURE KEYAGE .END