; ; ; CLOSBF ; ; CLOSBF - CLOSES A DATABASE FILE ; ; ROUTINE NAME: CLOSBF ; ; PURPOSE: To update the disk image of a database file, close ; it, and return the LUN to a state that allows ; re-using it from FORTRAN. ; ; CALLABLE: From FORTRAN only: ; CALL CLOSBF(ROOT[,ERR]) ; ; PARAMETERS: ; ROOT The database root block and I/O buffers. ; ERR The error return parameter, where: ; ERR=-100 Means corrupt root block. ; ERR= +1 Signifies successfull return. ; ; ROUTINES USED: B$IOERROR, WRITEVB macro. ; ; EXAMPLE: ; CALL CLOSBF(ROOT) ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: CLOSBF ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGNMENTS ROOT=R4 TEM=R1 BUF=R3 LEVEL=R2 .MCALL CLOSE$,SUPER SUPER PROCEDURE CLOSBF ;(ROOT[,ERR]) RT=2 ERR=4 LET ROOT := RT(R5) ;GET THE ROOT BLOCK POINTER IF DB.BLT(ROOT) NE #"RT ;IS THIS A LEGAL ROOT BLOCK? FORET #ER.NRB,ERR ;NO!!! CAN'T CLOSE IT. RETURN END ;THE FOLLOWING BLOCK OF CODE RESETS MANY OF ;THE VALUES IN THE ROOT BLOCK SO THAT THEY WILL ;BE READY WHEN THE FILE IS NEXT OPENED LET RT.LEV(ROOT) := #1 ;INITALIZE THE CURRENT STACK DEPTH LET BUF := ROOT + #DB.SIZE ;POINT TO THE FIRST BUFFER LET RT.BUF(ROOT) := BUF ;PUT THAT IN THE ROOT BLOCK LET LEVEL := ROOT + #LV.1ST+LV.SIZE ;INITALIZE THE LEVEL SP LET RT.LLA(ROOT) := BUF + LV.LLK(LEVEL) ;;INITALIZE THE LAST LEGAL KEY ADDRESS LET RT.PCL(ROOT) := LEVEL ;INITALIE THE ROOT COPY OF THE SP LET RT.FLG(ROOT) := . OFF.BY #FL.WRT ;DISALLOW WRITE ACCESS LET TEM := RT.NLV(ROOT) ;GET THE NUMBER OF LEVELS THRU TEM ;LOOP FOR ALL OF THEM IF #FL.MOD SET.IN LV.FLG(LEVEL) ;IS THIS BLOCK MARKED FOR WRITEING? WRITEVB LV.PCB(LEVEL),BUF ;WELL THEN, WRITE IT END ;CLEAR ALL THE FLAG BITS THAT SHOULD BE LET LV.FLG(LEVEL) := . OFF.BY #FL.ACT!FL.MOD LET LV.PCB(LEVEL) := #0 ;SET THE CURRENT BLOCK TO ZERO LET LEVEL := LEVEL + #LV.SIZE ;SKIP TO THE NEXT STACK LEVEL LET BUF := BUF + #DB.SIZE ;AND THE NEXT BUFFER END ;NOW THAT ALL OTHER BITS ARE ;INITALIZED IN THE ROOT BLOCK, IF #FL.MOD SET.IN RT.FLG(ROOT) ;WE CAN CHECK THE ROOT ITSELF ;IT MUST BE WRITTEN OUT, SO CLEAR ;ONE LAST BIT BEFORE YOU GO LET RT.FLG(ROOT) := . OFF.BY #FL.MOD WRITEVB #1,ROOT END CLOSE$ RT.FDB(ROOT) ;FINALLY, YOU CAN CLOSE THE FILE LET R0 := RT.FDB(ROOT) - #14 ;GET TO THE FORTRAN PART OF THE FDB THRU R1 := #66 ;ZERO 66 WORDS OF FDB TO RECYCLE IT LET (R0)+ := #0 ;ZAP!!!! END ENDPROCEDURE CLOSBF .END