; ; ; BLDHDR ; ; BLDHDR - INITALIZING A NEW DATABASE FILE ROOT BLOCK ; ; ROUTINE NAME: BLDHDR ; ; PURPOSE: BLDHDR is called before OPENBF to initalize a new ; root block when the file being opened may be a new ; one. BLDHDR must be called before using MODE=4 to ; OPENBF, and probably should be called before using ; MODE=3 to OPENBF. ; ; CALLABLE: From FORTRAN only: ; CALL BLDHDR(ROOT,NRLEVS,LEVTAB[,DATYPE]) ; ; PARAMETERS: ; ROOT = The in core database bufer for the file. ; NRLEVS = The number of levels in the database file struc- ; ture ; LEVTAB = A table describing every level of the new files ; tree structure. LEVTAB must be dimentioned to 3 ; by NRLEVS words. The meanings of the three words ; for each level are: ; LEVTAB(1,I) = The total number of bytes in a key at ; level I. The total size must take into account ; the number of bytes in the scan area of a key, in ; the data section, plus four bytes in all levels ; accept the bottom level. ; LEVTAB(2,I) = The number of bytes in the scan section ; of a key at level I. ; LEVTAB(3,I) = The type of data stored in the data sec- ; tion, where 1 means integers, 2 means reals, 4 me- ; ans ASCII. The data types can be ORed together ; for combinations. ; DATYPE = A one word data type for identifying the type of ; structure. ; ; ROUTINES USED: None. ; ; EXAMPLE: CALL BLDHDR(ROOT,3,LEVTAB,'TR') ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: BLDHDR ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ; REGESTERS USED ROOT=R4 CUR=R3 TEM=R2 LEVS=R1 NRL=R0 ; PARAMETERS RT=2 NRLEVS=4 LEVTAB=6 DATYPE=10 .MCALL SUPER SUPER PROCEDURE BLDHDR ;(ROOT,NRLEVS,LEVTAB[,DATYPE]) ; LET ROOT := RT(R5) ;GET THE ROOT BLOCK ADDRESS LET NRL := @NRLEVS(R5) ;GET THE NUMBER OF LEVELS LET LEVS := LEVTAB(R5) ;GET THE ADDRESS OF THE LEVEL DISCRIPTOR TABLE LET CUR := ROOT ; ;INITALIZE ROOT BLOCK FIRST TO ZERO ; LET TEM := #256. THRU TEM LET (CUR)+ := #0 END ; ;INITALIZE ALL SPECIAL SECTIONS OF HEADER ; LET RT.SIZE(ROOT) := #1 ;SIZE OF FILE IS 1 BLOCK FOR STARTERS LET RT.LEV(ROOT) := #1 ;CURRENT LEVEL IS 1 LET RT.BUF(ROOT) := ROOT + #DB.SIZE ;CURRENT I/O BLOCK ;INITALIZE THE LAST LEGAL KEY ;ADDRESS FOR THE FIRST LEVEL LET RT.LLA(ROOT) := RT.BUF(ROOT) + LV.1ST+LV.LLK+LV.SIZE(ROOT) ;INITALIZE THE STACK POINTER LET RT.PCL(ROOT) := ROOT + #LV.1ST+LV.SIZE LET RT.NLV(ROOT) := NRL ;STORE THE NUMBER OF LEVELS LET RT.VERSION(ROOT) := #3 ;STRUCTURE VERSION 3 LET DB.BLT(ROOT) := #"RT ;ROOT BLOCK TYPE IF (R5) GE #DATYPE/2 ;IS THERE A DATA TYPE? LET RT.DTY(ROOT) := @DATYPE(R5) ;THEN STORE IT. END ; ; NOTE: THIS SECTION DEPENDS ON THE ORDER OF THE ; LEVEL TABLE OFFSETS. THIS SHOULD CAUSE NO ; PROBLEMS, SINCE YOU WILL HAVE TO MODIFY THIS ; ROUTINE TO INITALIZE ANY NEW FIELDS THAT ; YOU ADD ANYWAY. ; ; ;INITALIZE FAKE ROOT BLOCK LEVEL ZERO ; LET CUR := ROOT + #LV.1ST+2 LET -(CUR) := #10 ;SIZE OF KEY ELEMENT TST -(CUR) ;SIZE OF ALPHA SECTION TST -(CUR) ;LAST LEGAL KEY IN ROOT IS FIRST ONE LET -(CUR) := #1 ;BLOCK NUMBER OF ROOT IS ONE LET -(CUR) := ROOT ;POINTER TO CURRENT BLOCK IN CORE LET -(CUR) := #FL.MOD!FL.ACT ;SET ROOT BLOCK TO BE WRITTEN OUT ; ;INITALIZE ALL OTHER LEVEL TABLES ; THRU NRL LET -(CUR) := (LEVS)+ ;KEY SIZE LET -(CUR) := (LEVS)+ ;SCAN SIZE TST -(CUR) ;SKIP THE LLK FOR NOW (B$ALOCATE WILL ;CALCULATE THIS FOR ME LATER) TST -(CUR) ;ZERO BLOCK NUMBER FOR NOW TST -(CUR) ;ZERO POINTER ALSO LET -(CUR) := (LEVS)+ ;DATA TYPE GOES IN FLAG WORD END ENDPROCEDURE BLDHDR .END