; ; ; PUSHLV ; ; PUSHLV- PUSHES TO NEXT LEVEL OF TREE STRUCTURE ; ; ROUTINE NAME: PUSHLV ; ; PURPOSE: To push down to the next level of the tree struc- ; ture in a database file. ; ; CALLABLE: From FORTRAN only: ; CALL PUSHLV(ROOT[,ERR]) ; or ; ERR=PUSHLV(ROOT) ; ; PARAMETERS: ; ROOT The buffer containing the root block ant the I/O ; buffers. You must have a key active at the cur- ; rent level to push down to the next. ; ERR The error return parameter, where: ; ERR= -1 (FORTRAN .TRUE.) means success. ; ERR= 0 (.FALSE.) you can't push from here. ; ERR= -100 Means bad root block. ; ; ROUTINES USED: None. ; ; EXAMPLE: ; CALL PUSHLV(ROOT) ; IF (.NOT. PUSHLV(ROOT)) GOTO 999 ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: PUSHLV ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 LEVEL=R2 ; PARAMETERS RT=2 ERR=4 .MCALL SUPER SUPER PROCEDURE PUSHLV; (ROOT[,ERR]) LET ROOT := RT(R5) ;GET POINTER TO ROOT BLOCK IF DB.BLT(ROOT) NE #"RT ;IS THIS A ROOT BLOCK?? FORET #ER.NRB,ERR ;THAT'S NOT A ROOT BLOCK RETURN END LET LEVEL := RT.PCL(ROOT) ;GET LEVEL STACK POINTER ;CHECK FOR CURRENT LEVEL ;NOT ACTIVE, OR CAN'T PUSH ;THAT FAR DOWN IF #FL.ACT OFF.IN LV.FLG(LEVEL) OR RT.LEV(ROOT) EQ RT.NLV(ROOT) FORET #0,ERR ;CAN'T DO IT RETURN END LET RT.LEV(ROOT) := . + #1 ;INCRIMENT THE STACK DEPTH COUNTER LET RT.PCL(ROOT) := . + #LV.SIZE ;INCRIMENT THE STACK POINTER LET RT.BUF(ROOT) := . + #DB.SIZE ;INCRIMENT 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 PUSHLV .END