; ; ; GETKEY ; ; GETKEY- RETURNS THE SCAN AND DATA SECTIONS OF A KEY ; ; ROUTINE NAME: GETKEY ; ; PURPOSE: GETKEY returns the scan and/or the data section of ; the currently active key. ; ; CALLABLE: From FORTRAN or MACRO ; ; PARAMETERS: From FORTRAN: ; CALL GETKEY(ROOT[,NULL][,KEY][,VAL][,ERR]) ; or ; ERR=GETKEY(ROOT[,NULL][,KEY][,VAL]) ; ; ROOT The database root block and buffers. ; NULL A null parameter necesary to make GETKEY calls ; compatable with FNDKEY. ; KEY A buffer to return the scan section of the key in. ; VAL A buffer to return the data section of the key. ; ERR The error return parameter. Possible error values ; are: ; ERR= +n means successfull return. ; ERR= 0 means you have no key open to get. ; ERR= -100 means you sent me a bad ROOT buffer. ; ; To call from MACRO, use the entrypoint BGETKEY and ; follow the example given for the FNDKEY MACRO ; call. ; ; ROUTINES USED: NONE ; ; EXAMPLE: ; CALL GETKEY(ROOT,,KEY,VALS) ; IF (GETKEY(ROOT,,KEY,VALS) .LE. 0) GOTO 999 ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: GETKEY ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;PARAMETER ASSIGNMENTS ROOTV=2 NULL=4 KEY=6 VAL=10 ERR=12 .MCALL SUPER SUPER ;REGESTER ASSIGNMENTS ROOT=R4 BUF=R3 LEVEL=R2 TEM=R1 TEM2=R0 PROCEDURE GETKEY LET ROOT := ROOTV(R5) ;GET POINTER TO ROOT BLOCK IF DB.BLT(ROOT) NE #"RT ;IS THIS A ROOT BLOCK? FORET #-100.,ERR ;NO!!!!! RETURN END LET LEVEL := RT.PCL(ROOT) ;GET STACK POINTER IF #FL.ACT OFF.IN LV.FLG(LEVEL) ;IS THIS LEVEL ACTIVE YET? FORET #0,ERR ;THEN I CAN'T WORK RETURN END B$GETKEY:: ;MACRO ENTRYPOINT IF (R5) GE #KEY/2 ;IS THERE A KEY ARGUMENT? LET TEM := KEY(R5) ;YES, GET THE ADDRESS IF TEM NE #-1 ;IS IT A NULL ARGUMENT? LET TEM2 := LV.SCN(LEVEL) ;NO, INITALIZE THE LENGTH OF A KEY IF RESULT IS GT ;DOES THIS KEY HAVE A SCAN SECTION? LET BUF := LV.PCE(LEVEL) ;YES, GET POINTER TO KEY THRU TEM2 ;LOOP FOR ALL BYTES LET (TEM)+ :B= (BUF)+ ;TRANSFER ONE AT A TIME END END END IF (R5) GE #VAL/2 ;IS THERE A VAL PARAMETER? LET TEM := VAL(R5) ;YES, GET THE ADDRESS IF TEM NE #-1 ;IS IT A NULL PARAMETER ;GET THE LENGTH OF THE DATA SECTION LET TEM2 := LV.LEN(LEVEL) - LV.SCN(LEVEL) IF RT.LEV(ROOT) LT RT.NLV(ROOT) ;IF THIS IS NOT THE BOTTOM LEVEL, LET TEM2 := . - #4 ;THEN COUNT THE POINTER AND AGE END IF TEM2 GT #0 ;DOES THIS KEY HAVE A DATA SECTION? ;YES, GET THE POINTER TO THE FIRST ;DATA BYTE LET BUF := LV.PCE(LEVEL) + LV.SCN(LEVEL) THRU TEM2 ;LOOP FOR ALL BYTES LET (TEM)+ :B= (BUF)+ ;TRANSFER EACH ONE AT A TIME END END END END END FORET RT.LEV(ROOT),ERR ;RETURN THE CURRENT LEVEL FOR SUCCESS ENDPROCEDURE GETKEY .END