; ; ; MODKEY ; ; MODKEY - MODIFIES THE CURRENTLY ACTIVE KEY ; ; ROUTINE NAME: MODKEY ; ; PURPOSE: MODKEY allows you to modify the currently active ; key in place without having to delete it and ; re-write it. ; ; CALLABLE: From FORTRAN only: ; CALL MODKEY(ROOT[,KEY][,VAL][,NUL][ERR]) ; or ; ERR=MODKEY(ROOT[,KEY][,VAL]) ; ; PARAMETERS: ; ROOT The database root block and I/O buffers ; KEY The pattern for replacing the scan section of the ; current key. If this pattern is prematurely ter- ; minated with a NUL, then the rest of the current ; key is left unchanged. If this pattern contains ; backslashes (\), then just the characters corres- ; ponding to the backslashes in the current key are ; left unchanged, and all other characters are re- ; placed. ; VAL The new data section of the key. If this parame- ; ter is present, all of the bytes are assumed to be ; present and are replaced in the key. If this par- ; ameter is missing or null, the data section fo the ; current key is left unchanged. ; NUL An ignored parameter included to make MODKEY calls ; compatable with WRTELE and WRTKEY calls. ; ERR Error return parameter. Possible error values ; are: ; ERR=-100 Bad root block. ; ERR= -99 Write permission denied. ; ERR= 0 You don't have a key active. ; ERR= +n Successfull return. ; ; ROUTINES USED: None. ; ; EXAMPLE: ; CALL MODKEY(ROOT,'\\\\\2\\',,,ERR) ; ERR=MODKEY(ROOT,,NEWDAT) ; IF(MODKEY(ROOT,PATT,NEWDAT) .LE. 0) GOTO 999 ; ; AUTHOR: Mike Higgins ; ; SOURCE LANGUAGE: MACRO11 with SUPERMAC ; ; OBJECT MODULE NAME: MODKEY ; ; LIBRARY: [60,100]DATABASE ; ; MAINTENANCE: See Mike Higgins ; ; ;REGESTER ASSIGMENTS ROOT=R4 BUF=R3 LEVEL=R2 TEM=R1 TEM2=R0 ; PARAMETERS RT=2 KEY=4 VAL=6 NULL=10 ERR=12 .MCALL SUPER SUPER PROCEDURE MODKEY ;(ROOT[,KEY][,VAL][,NULL][,ERR]) LET ROOT := RT(R5) ;GET POINTER TO ROOT BLOCK IF DB.BLT(ROOT) NE #"RT ;IS THIS REALLY A ROOT BLOCK?? FORET #ER.NRB,ERR ;NO, RETURN AN ERROR RETURN END IF #FL.WRT OFF.IN RT.FLG(ROOT) ;DO YOU HAVE WRITE PERMISSION? FORET #-99.,ERR ;NO, RETURN AN ERROR RETURN END LET LEVEL := RT.PCL(ROOT) ;GET THE LEVEL TABLE SP IF #FL.ACT OFF.IN LV.FLG(LEVEL) ;DO YOU HAVE A KEY ACTIVE NOW? FORET #0,ERR ;NO, RETURN AN ERROR RETURN END IF (R5) GE #KEY/2 ;IS THERE A KEY PARAMETER? LET TEM := KEY(R5) ;YES, GET IT'S ADDRESS IF TEM NE #-1 ;IS THIS A NULL PARAMETER? ;NO, GET THE ADDRESS OF THE KEY LET BUF := LV.PCE(LEVEL) ;GET THE LENGTH OF A KEY LET TEM2 := LV.SCN(LEVEL) IF RESULT IS GT ;DOES THIS KEY HAVE A SCAN SECTION?? THRU TEM2 ;YES, LOOP FOR ALL BYTES ;CHECK FOR PREMATURE TERMINATION IFB (TEM) EQ #0 THEN GOTO DONE ;CHECK FOR WILD CHARD CHARACTER IFB (TEM) EQ #'\ ;SKIP THIS CHARACTER TSTB (BUF)+ TSTB (TEM)+ ELSE ;MODIFY ALL OTHER CHARACTERS LET (BUF)+ :B= (TEM)+ END END END END DONE: ;DONE WITH SCAN SECTION IF (R5) GE #VAL/2 ;IS THERE A DATA PARAMETER? LET TEM := VAL(R5) ;YES, GET IT'S ADDRESS IF TEM NE #-1 ;IS IT A NUL ARGUMENT? ;NO, CALULATE THE ADDRESS OF ;THE DATA SECTION OF THE KEY LET BUF := LV.PCE(LEVEL) + LV.SCN(LEVEL) ;AND CALULATE THE SIZE OF THE ;DATA SECTION IN THE KEY LET TEM2 := LV.LEN(LEVEL) - LV.SCN(LEVEL) ;THE DATA SECTION IS SMALLER ON ;ALL LEVELS ACCEPT THE BOTTOM IF RT.LEV(ROOT) LT RT.NLV(ROOT) LET TEM2 := . - #4 ;THIS ISNT BOTTOM END IF TEM2 GT #0 ;IS THERE A DATA SECTION? THRU TEM2 ;YES LOOP FOR ALL BYTES ;XFER THEM LET (BUF)+ :B= (TEM)+ END END END END END ;THIS BLOCK HAS BEEN MODIFIED, SO MARK IT LET LV.FLG(LEVEL) := . SET.BY #FL.MOD FORET RT.LEV(ROOT),ERR ;RETURN SUCCESS ENDPROCEDURE MODKEY .END