*DECK DBKEYDNAT 
USETEXT DBTEXT
USETEXT DNTEXT
PROC KEY$D; 
*CALL DEBUGVARS 
*CALL GETSET
*CALL TABLNAMES 
*CALL DNATVALS
*CALL AUXT1 
*CALL AUXTVALS
XREF BEGIN
PROC ADD$URWA;
PROC NXTKI; 
FUNC ADD$AUXT;
END 
  
START("KEY$D")
CONTROL IFNQ CB5$CDCS,"NO"; 
#THIS PROCEDURE PERFORMS THE FOLLOWING FUNCTIONS :- 
  A. CHECKS THAT THE KEY/INDEX FLAG (IKINXT)
    IS NON ZERO. IF NOT, THE PROCEDURE EXITS IMMEDIATELY AS 
    THERE ARE NO KEYS.
  B. CHECKS THE KEY/INDEX TYPE (IKITYPE) AND IF THE 
    TYPE IS SET FOR INDX, EXITS.
  C. SETS THE KEYED FLAG IN THE CURRENT DNAT (DN$KEYED) 
    AND HANGS A KEYNAME AUXTABLE ENTRY ONTO THE CURRENT DNAT. 
    (NOTE: THE DNAT PTR OF THE CURRENT KEY ITEM IS NOT YET
    AVAILABLE IN THE CORRESPONDANCE TABLE AS IT IS A FORWARD
    REFEENCE. THEREFORE THE DDL WORD ADDRESS IS STORED IN THE 
    AUXTABLE - IT IS CONVERTED TO A DNAT PTR IN THE CLOSEDOWN PROC. 
  D. THE DNAT$PTR VALUE IS ADDED TO THE UNRESOLVED WORD ADDRESS 
    ARRAY FOR THE CLOSEDOWN TRANSLATION.
  E. IF MORE ATOMS REMAIN (IKINXT NQ 0) THEN THE LOOP 
    FROM B. ABOVE IS REPEATED.
NOTE : ALL KEY ATOMS PRECEDE ALL INDEX ATOMS. 
# 
ITEM HIERCOUNT I=0;  #HIEARACHY (SEQUENCE) OF KEYS# 
SETI("HIERCOUNT",HIERCOUNT,1) #RESET# 
KEY$DNXT:  #LOOP FOR NEXT KEY#
IF IKINXT EQ 0
  OR
  IKITYPE EQ $INDX
  OR
  IKITYPE EQ $KIEND 
  THENB ("NO KEYS TO BE PROCESSED") 
  QUIT
ENDIF 
$S(DN$KEYED,DNAT$,DNAT$PTR,1); #INDICATE ITEM IS KEYED# 
AUXT$PTR=ADD$AUXT(DNAT$PTR); #GET PTR TO NEW AUXENT#
$S(AX$TTYPE,AUX$,AUXT$PTR,KEYNAME); #TYPE IS KEY NAME#
$S(AX$HIERCNT,AUX$,AUXT$PTR,HIERCOUNT); #SET HIERARCHY COUNT# 
$S(AX$KEYNAM,AUX$,AUXT$PTR,IKWA); #SAVE WORD ADDRESS OF KEY#
IF IKITYPE EQ $AKEY 
  THENB ("ASCENDING KEY") 
  $S(AX$ORDER,AUX$,AUXT$PTR,1);  #SET ASCENDING#
ENDIF 
ADD$URWA;  #ADD TO UNRESOLVED WORD ADDRESS LIST#
IF IKINXT NQ 0
  THENB ("MORE ATOMS TO BE PROCESSED")
  NXTKI;  #UNPACK NEXT ATOM#
  SETI("HIERCOUNT",HIERCOUNT,HIERCOUNT+1) 
  GOTO KEY$DNXT;  #LOOP FOR NEXT KEY# 
ENDIF 
SETO("KEYINDEXBASE",KEYINDEXBASE,0) 
                   #SET TO CAUSE INDEX PROCESSOR TO EXIT DIRECTLY#
CONTROL FI; 
FINIS("KEY$D")
TERM
