*DECK DBSLNXKI
USETEXT DBTEXT
PROC NXTKI; 
*CALL DEBUGVARS 
XREF PROC IERR$;
# 
# 
PROC NXTKIWD; 
START("NXTKIWD")             #INCREMENT TO NEXT -OCCURS- POINTER WORD#
 CONTROL IFNQ CB5$CDCS,"NO";
SETO("P<ITMBA>",P<ITMBA>,P<ITMBA>+1)
SETO("IOCCWA",IOCCWA,IOCCWA+1)
IF P<ITMBA> GQ LOC(ITMA)+ITMASIZE 
  THENB("NEXT WORD NOT IN CORE")
  SETO("P<ITMBA>",P<ITMBA>,LOC(ITMA)+ITMFIXSIZE)
  DA$GTSB(ITMBA,ITMASIZE-ITMFIXSIZE,IOCCWA);
  IF DASTATE EQ 1 
    THENB("ITEM OCC READ ERROR")
    IERR$(L9,ABORT);
  ENDIF 
  SETI("IOCCRRFLG",IOCCRRFLG,1)  #INDICATE -OCCURS- PACKET READ#
ENDIF 
 CONTROL FI;
FINIS("NXTKIWD")
# 
# 
START("NXTKI")
 CONTROL IFNQ CB5$CDCS,"NO";
#THIS PROCEDURE PERFORMS THE FOLLOWING FUNCTIONS :- 
  B. ACCESSES THE NEXT ATOM OF THE KEY/INDEX DATA AND 
     UNPACKS IT.
# 
IF KEYINDEXBASE EQ 0
  THENB("NO PROCESSING REQUIRED") 
  QUIT
ENDIF 
SETO("P<ITMBA>",P<ITMBA>,KEYINDEXBASE)
IF IOCCRRFLG EQ 2 
  THENB("OCCURS PACKET NOT IN CORE")
  SETO("P<ITMBA>",P<ITMBA>,LOC(ITMA)+ITMASIZE)  #SET UP TO USE -NXTKIWD-
                                                 ROUTINE# 
  SETO("IOCCWA",IOCCWA,IOCCWA-1)
  NXTKIWD;                   #READ -OCCURS- PACKET INTO CORE# 
ENDIF 
 CONTROL IFEQ CB5$CDCS,"CDCS1"; 
IF KEYINDEXR EQ 0 
  THENB("ACCESS LEFT ATOM") 
 CONTROL FI;
  
NXTKIL: 
 CONTROL IFEQ CB5$CDCS,"CDCS1"; 
  SETI("KEYINDEXR",KEYINDEXR,1)  #ACCESS RIGHT ATOM NEXT TIME#
 CONTROL FI;
  IF SBITMOCCLNXT[1] THEN IKINXT=1; ELSE IKINXT=0;
  IV$($SET$,"IKINXT",IKINXT)
  IF IKIQUAL EQ 0 
    THENB("CURRENT ATOM NOT QUAL")
    SETI("IKITYPE",IKITYPE,SBITMOCCLTYP[1]) 
    ELSEB("CURRENT ATOM IS QUAL") 
    IF IKINXT NQ 0
      THENB("MORE ATOMS REMAIN")
      IF SBITMOCCLQAL[1] THEN IKIQUAL=1; ELSE IKIQUAL=0;
      IV$($SET$,"IKIQUAL",IKIQUAL)
   CONTROL IFEQ CB5$CDCS,"CDCS1"; 
      GOTO NXTKIR;  #READ RIGHT ATOM# 
      ELSEB("ALL ATOMS PROCESSED")
      SETI("IKITYPE",IKITYPE,$KIEND)
    ENDIF 
  ENDIF 
  
  ELSEB("ACCESS RIGHT ATOM")
NXTKIR: 
  SETI("KEYINDEXR",KEYINDEXR,0)  #ACCESS LEFT ATOM NEXT TIME# 
  IF SBITMOCCRNXT[1] THEN IKINXT=1; ELSE IKINXT=0;
  IV$($SET$,"IKINXT",IKINXT)
  IF IKIQUAL EQ 0 
    THENB("CURRENT ATOM NOT QUAL")
    SETI("IKITYPE",IKITYPE,SBITMOCCRTYP[1]) 
    ELSEB("CURRENT ATOM IS QUAL") 
    IF IKINXT NQ 0
      THENB("MORE ATOMS REMAIN")
      IF SBITMOCCRQAL[1] THEN IKIQUAL=1; ELSE IKIQUAL=0;
      IV$($SET$,"IKIQUAL",IKIQUAL)
   CONTROL FI;
      NXTKIWD;               #INCREMENT TO NEXT -OCCURS- WORD#
      GOTO NXTKIL;  #READ LEFT ATOM#
      ELSEB("ALL ATOMS PROCESSED")
      SETI("IKITYPE",IKITYPE,$KIEND)
    ENDIF 
  ENDIF 
 CONTROL IFEQ CB5$CDCS,"CDCS1"; 
ENDIF 
 CONTROL FI;
  IF (IKITYPE EQ $AKEY) OR (IKITYPE EQ $DKEY) 
    THENB ("ATOM IS KEY") 
   CONTROL IFEQ CB5$CDCS,"CDCS1"; 
    IF KEYINDEXR EQ 1 
      THENB("IN LEFT HALF") 
   CONTROL FI;
      SETO("IKWA",IKWA,SBITMOCCLDNA[1])  #WA OF KEY#
      IF SBITMOCCLQAL[1] THEN IKIQUAL=1; ELSE IKIQUAL=0;
      IV$($SET$,"IKIQUAL",IKIQUAL)
     CONTROL IFEQ CB5$CDCS,"CDCS1"; 
      ELSEB("IN RIGHT HALF")
      SETO("IKWA",IKWA,SBITMOCCRDNA[1])  #WA OF KEY#
      IF SBITMOCCRQAL[1] THEN IKIQUAL=1; ELSE IKIQUAL=0;
      IV$($SET$,"IKIQUAL",IKIQUAL)
     CONTROL FI;
      IF IKINXT NQ 0
        THENB("ANOTHER WORD FOLLOWS") 
        NXTKIWD;             #INCREMENT TO NEXT -OCCURS- POINTER WORD#
      ENDIF 
   CONTROL IFEQ CB5$CDCS,"CDCS1"; 
    ENDIF 
   CONTROL FI;
    ELSEB ("ATOM IS INDEX") 
    SETO("IKWA",IKWA,0) 
  ENDIF 
  SETO("KEYINDEXBASE",KEYINDEXBASE,P<ITMBA>)
 CONTROL FI;
FINIS("NXTKI")
TERM
