*DECK,MIPDMIP 
*CALL COMUSETXT 
PROC MIP$MIP; 
      BEGIN 
                                                                         EXECDMP
     XREF BEGIN                                                          EXECDMP
          FUNC  CEEK$MP;
          PROC PUT$MP;
          PROC MWSA$MP; 
          PROC MOVC$AA ; #SHOULD BE MOVC$AA #                            EXECDMP
          PROC CPCH$AA ; #SHOULD BE CPCH$AA #                            EXECDMP
          PROC MOVW$AA ; #SHOULD BE MOVW$AA #                            EXECDMP
          PROC CURR$AA ; #SHOULD BE CURR$AA #                            EXECDMP
          PROC GOFI$AA ; #SHOULD BE GOFI$AA #                            EXECDMP
          PROC SKPF$AA ; #SHOULD BE SKPF$AA #                            EXECDMP
          PROC STMD$AA ; #SHOULD BE STMD$AA #                            EXECDMP
          PROC FILP$AA ;                                                 AFB0517
          PROC WKKY$IS; #SHOULD BE WKKY$IS #                             EXECDMP
          PROC EZKY$IS ; #SHOULD BE EZKY$IS #                            EXECDMP
          PROC GOKY$IS ; #SHOULD BE GOKY$IS #                            EXECDMP
          PROC ALTR$AA ;                                                 EXECDMP
          PROC TRN1$IS;                                                  AFB0603
          PROC TRN2$IS;      #TRANSLATE SYMBOLIC KEY#                    AFB0214
          PROC LOCR$AA ; #SHOULD BE LOCR$AA#                             EXECDMP
          PROC SEBL$AA ; #SHOULD BE SEBL$AA#                             EXECDMP
          PROC STPF$AA ;                                                 GETNR
          PROC MSGF$AA; 
          PROC IMPR$AA; 
          PROC MSGZ$AA;      #ERROR MESSAGES#                            VBG0127
          LABEL EXIT$AA;     #ERROR EXIT#                                VBG0127
          END                                                            EXECDMP
                                                                         EXECDMP
CONTROL WEAK CEEK$MP; 
CONTROL WEAK PUT$MP;
  
     XDEF BEGIN                                                          EXECDMP
                                                                         EXECDMP
*CALL AAMMIPBLX                                                          EXECDMP
                                                                         EXECDMP
          FUNC EOKS$MP; 
          FUNC SPAR$MP;                                                  GBK0204
          PROC DNLV$MP ;                                                 EXECDMP
          PROC RPOS$MP ;                                                 EXECDMP
          PROC GOKY$MP ;                                                 EXECDMP
          PROC UPLV$MP ;                                                 EXECDMP
          PROC GET$MP ;                                                  EXECDMP
          PROC RWIN$MP ;                                                 EXECDMP
          PROC GETN$MP ;                                                 EXECDMP
          PROC  KPTQ$MP;
          PROC  KPTR$MP;
          PROC  MSKP$MP;
          PROC  SCSB$MP;
          PROC  STAT$MP;
          PROC  SVK2$MP;
          PROC  SVK3$MP;
          FUNC PKCT$MP; 
          PROC LEVL$MP ;                                                 EXECDMP
          PROC KRAK$MP ;                                                 EXECDMP
          PROC PKA$MP ; 
          END                                                            EXECDMP
          DEF SAVEKEY2 #SVK2$MP#; 
          DEF SAVEKEY3 #SVK3$MP#; 
          DEF PKCOUNT #PKCT$MP#;
          DEF VARIANCE(L) #B<L,1>MPWRD3[0]#;
          ITEM I , J , K , X , Y ; #SCRATCH VARIABLES#                   EXECDMP
CONTROL EJECT ; 
FUNC EOKS$MP; 
 #                                                                       CY211
* *   EOKS$MP - IS THIS AN EOK POSITION          PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC EOKS$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO RETURN A VALUE IN X6, AS A SYMPL FUNCTION, THAT IS 0 IF WE      CY211
*     ARE NOT AT EOK POSITION IN A MIP FILE (END OF LAST PRIMARY         CY211
*     KEY VALUE FOR THE CURRENT ALTERNATE KEY VALUE) OR 1 IF WE ARE.     CY211
*                                                                        CY211
*     ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     WE MUST BE POSITIONED ON THE CURRENT RECORD OF THE MIP FILE,       CY211
*     WHICH IS IN A LEVEL-2 OR LEVEL-3 SUBFILE.                          CY211
*                                                                        CY211
*     P<PTRE$AA> POINTS TO THE PTREE FOR THAT SUBFILE.                   CY211
*     RECPTR CONTAINS A COPY OF THE RECORD POINTER FOR THAT RECORD.      CY211
*     RECLWA IS THE LWA+1 OF THE RECORD.                                 CY211
*                                                                        CY211
*     IF WE ARE INSIDE A SUB-BLOCK WITHIN THAT RECORD,                   CY211
*       OMEGA IS THE FWA OF THE SUBBLOCK.                                CY211
*       QQ IS THE FWA OF THE CURRENT MINOR RECORD WITHIN THE SUBBLOCK.   CY211
*       KEYLNGW IS THE NUMBER OF WORDS NEEDED TO CONTAIN A PRIMARY       CY211
*         KEY OF THE CORRESPONDING DATA FILE, WHICH IS ALSO THE LENGTH   CY211
*         OF A MINOR RECORD IN THE SUBBLOCK.                             CY211
*                                                                        CY211
*     QLR ALIAS PTLREC[0] IS A FLAG IN THE PTREE THAT IS 1 IF WE ARE     CY211
*       CURRENTLY POSITIONED ON THE LAST RECORD OF THE CURRENT           CY211
*       SUBFILE, OTHERWISE 0.                                            CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     THE FUNCTION IS 1 IF WE ARE CURRENTLY ON THE LAST RECORD OF        CY211
*     A LEVEL-3 SUBFILE, OR THE LAST MINOR RECORD OF A SUBBLOCK,         CY211
*     OR ON A LEVEL-2 RECORD THAT HAS NO SUBFILE OR SUBBLOCK             CY211
*     DEPENDING ON IT.                                                   CY211
*                                                                        CY211
*     OTHERWISE 0.                                                       CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     NONE THAT ARE NOT MENTIONED ABOVE.                                 CY211
*                                                                        CY211
 #                                                                       CY211
      BEGIN 
      EOKS$MP = 1;
      IF CURLEV EQ 2
      THEN
          BEGIN 
          IF OMEGA EQ 0 
          THEN
              BEGIN 
              IF SUBFLAG EQ 0 
              THEN
                  BEGIN 
                  RETURN ;   # =1 # 
                  END 
              END 
          ELSE
              BEGIN 
              IF QQ+KEYLNGW GQ RECLWA-2 
              THEN
                  BEGIN 
                  RETURN ;   # =1 # 
                  END 
              END 
          END 
      ELSE
          BEGIN 
          IF QLR NQ 0 
          THEN
              BEGIN 
              RETURN ;  # =1 #
              END 
          END 
      EOKS$MP = 0;
      END 
CONTROL EJECT;
     FUNC SIKH$MP ; BEGIN                                                AFB0214
 #                                                                       CY211
* *   SIKH$MP - ARE WE ALREADY SEEKING ON THIS ALT KEY VALUE   PAGE  1   AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC SIKH$MP                                                            CY211
*                                                                        CY211
* DC  FOR FUNCTION, ETC., SEE THE COMMENTS TO CEEK$MP, IN                CY211
*     CAPSULE SEEK$MP. SIKH$MP IS LITTLE MORE THAN A CALL TO CEEK$MP     CY211
*     IF THIS IS A SEEK OR FOLLOWS A SEEK. IF THE JOB IS NOT DOING       CY211
*     ANY SEEKS, IT CAN GET AWAY WITHOUT LOADING THE CAPSULE THAT        CY211
*     CONTAINS THE BULK OF THE CODE.                                     CY211
*                                                                        CY211
 #                                                                       CY211
          IF FTNDX[0] EQ 0 AND
           ( FTCOP[0] EQ OP"SEK" OR 
           ( FAALTPOS[0] EQ 0 AND PREVOP EQ OP"SEK" ) ) 
            THEN SIKH$MP = CEEK$MP ;                                     AFB0214
            ELSE SIKH$MP = 1 ;                                           AFB0214
          END                                                            AFB0214
                                                                         EXECDMP
CONTROL EJECT;
     FUNC SUBRECCT ; BEGIN                                               EXECDMP
 #                                                                       EXECDMP
* *   SUBRECCT - HOW MANY RECORDS IN THE DEPENDENT SUBFILE   PAGE 1      EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC SUBRECCT                                                           EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO RETURN IN X6, AS A SYMPL FUNCTION, A COUNT OF THE NUMBER OF     EXECDMP
*     RECORDS IN THE SUBFILE THAT DEPENDS FROM THE CURRENT RECORD.       EXECDMP
*     THE SUBFILE MAY OR MAY NOT BE IN THE FORM OF A SUBBLOCK.           EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     RECLWA IS THE LWA+1 OF THE CURRENT RECORD, WHICH MUST BE KNOWN     EXECDMP
*     TO CONTAIN A SUB-FILE HEADER.                                      EXECDMP
*                                                                        EXECDMP
*     P<SFH$MP> = RECLWA-3                                               CY211
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     THE FUNCTION SUBRECCT IS THE COUNT OF RECORDS IN THE SUBFILE.      EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          IF SFHSB[0] EQ 0                                               EXECDMP
            THEN SUBRECCT = SFHRC[0] ;                                   EXECDMP
            ELSE SUBRECCT = B<9,13>W[OMEGAVAL] ;                         EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
FUNC PKCT$MP; 
          BEGIN 
 #                                                                       EXECDMP
* *   PKCT$MP- HOW MANY PRIME KEYS FOR THIS ALT KEY VALUE      PAGE  1   AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC PKCT$MP                                                            CY211
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO RETURN IN X6, AS A SYMPL FUNCTION, THE NUMBER OF PRIMARY KEYS   EXECDMP
*     THAT ARE RECORDED FOR THE CURRENT ALTERNATE KEY.                   EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THE CURRENT RECORD IS A LEVEL-2 RECORD IN A MIP FILE, CONSISTING   EXECDMP
*     OF AN ALTERNATE KEY (WHICH IS THE KEY OF THE RECORD) PLUS THE      EXECDMP
*     FIRST OR ONLY PRIMARY KEY FOUND WITH THAT ALT KEY.                 EXECDMP
*                                                                        EXECDMP
*     THE CURRENT RECORD IS IN CORE, RECLWA GIVES ITS LWA+1 .            EXECDMP
*                                                                        EXECDMP
*     THE RECORD POINTER FOR THIS RECORD IS IN BITS 0-29 OF VARIABLE     EXECDMP
*     RECPTR. IT WILL HAVE BEEN COPIED THERE BY ROUTINE RPGT$AA WHEN     EXECDMP
*     THE RECORD WAS LOCATED.                                            EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     IF THE SUBFILE FLAG IN THE RECORD POINTER IS 0, THE FUNCTION       EXECDMP
*     VALUE IS 1. OTHERWISE, IT IS 1 PLUS THE NUMBER OF RECORDS IN       EXECDMP
*     THE DEPENDENT SUBFILE.                                             EXECDMP
*                                                                        EXECDMP
*     IF THE SUBFILE FLAG IS 1, P<SFH$MP> = RECLWA-3, AND THE            CY211
*     VARIOUS FIELDS OF THE SUBFILE HEADER AT THE END OF THE             EXECDMP
*     RECORD CAN BE ADDRESSED BY NAME.                                   EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     SUBRECCT - TO RETURN THE NUMBER OF RECORDS IN THE DEPENDENT        EXECDMP
*       SUBFILE.                                                         EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          IF SUBFLAG EQ 0                                                EXECDMP
            THEN PKCOUNT = 1 ;                                           EXECDMP
            ELSE BEGIN                                                   EXECDMP
              P<SFH$MP> = RECLWA - 3;                                    EXECDMP
              PKCOUNT = 1 + SUBRECCT ;                                   EXECDMP
            END                                                          EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     FUNC SPAR$MP B ;                                                    GAG1103
 #                                                                       GBK0204
* *   SPAR$MP - DETERMINE IF ALTERNATE KEY IS SPARSE         PAGE 1      GBK0204
* *   G.B.KINGSLAND                                                      GBK0204
* 1CD SPAR$MP                                                            GBK0204
*                                                                        GBK0204
* DC  FUNCTION                                                           GBK0204
*                                                                        GBK0204
*     TO RETURN IN X6, AS A SYMPL FUNCTION, THE BOOLEAN VALUE TRUE IF    GBK0204
*     THE ALTERNATE KEY IS SPARSE, FALSE IF NOT SPARSE.                  GBK0204
*                                                                        GBK0204
* DC  ENTRY CONDITIONS                                                   GBK0204
*                                                                        GBK0204
*     MRQFWA - FWA OF RECORD                                             GAG1103
*     FSSCCLG (IN MIP FSTT) = 1 IF A SPARSE CONTROL CHARACTER            GAG1103
*       POSITION WAS SPECIFIED FOR THIS FILE.                            GAG1103
*     FSSCCWD AND FSSCCPO = WORD AND CHARACTER POSITION OF               GAG1103
*       THAT CHARACTER IN THE RECORD.                                    GAG1103
*     MPWRD1 - THE SECOND WORD OF THE CURRENT KEYDEF, CONTAINING         GAG1103
*       A BIT FOR EACH POSSIBLE KEY VALUE IN THAT POSITION.              GAG1103
*                                                                        GBK0204
* DC  EXIT CONDITIONS                                                    GBK0204
*                                                                        GBK0204
*     SPAR$MP = TRUE IF ALTERNATE KEY IS SPARSE.                         GBK0204
*                                                                        GBK0204
* DC  ERROR CONDITIONS                                                   GBK0204
*                                                                        GBK0204
*     NONE                                                               GBK0204
*                                                                        GBK0204
* DC  CALLED ROUTINES                                                    GBK0204
*                                                                        GBK0204
*     NONE                                                               GAG1103
*                                                                        GBK0204
* DC  NON-LOCAL VARIABLES                                                GBK0204
*                                                                        GBK0204
*     NONE                                                               GAG1103
*                                                                        GBK0204
 #                                                                       GBK0204
          BEGIN                                                          GBK0204
          SPAR$MP = FALSE;                                               GBK0204
          IF FSSCCLG                                                     GBK0204
             THEN BEGIN  #SPARSE CONTROL CHARACTER PRESENT#              GBK0204
                  I = C<FSSCCPO>W[MRQFWA+FSSCCWD] ;                      GAG1103
                  IF I NQ 0 AND I LS 48                                  GAG1103
                      THEN SPAR$MP = B<I>MPWRD1 NQ 0 ;                   GAG1103
                  END                                                    GBK0204
          END #SPAR$MP#                                                  GBK0204
CONTROL EJECT;                                                           JJJ0209
     PROC DNLV$MP ( TYPE ) ; BEGIN ITEM TYPE ;                           AM2A089
 #                                                                       EXECDMP
* *   DNLV$MP - GO DOWN FROM A LEVEL 2 RECORD           PAGE 1           EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC DNLV$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO MOVE FROM A RECORD IN LEVEL 2 OF A MIP FILE TO THE FIRST        EXECDMP
*     RECORD OF ITS DAUGHTER SUB-FILE, AT LEVEL 3. A CALL OF LEVL$MP(3)  EXECDMP
*     COULD ALWAYS BE USED IF THE DAUGHTER SUB-FILE WERE ALWAYS A        EXECDMP
*     FULL-FLEDGED ONE IN ITS OWN BLOCKS. BUT IF THE DAUGHTER IS A       EXECDMP
*     SUB-BLOCK, EMBEDDED IN THE CURRENT RECORD, LEVL$MP IS NOT ABLE     EXECDMP
*     TO HANDLE IT, SIMPLE THOUGH IT IS.                                 EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        AM2A089
*     THERE IS ONE FORMAL PARAMETER. IF IT IS NONZERO, DNLV$MP MAKES     AM2A089
*       SURE THAT THE FIRST RECORD IS CURRENT AND IN CORE. IF THE        AM2A089
*       PARAMETER IS 0, DNLV$MP JUST MAKES THE SUBFILE CURRENT, WITHOUT  AM2A089
*       READING ANY OF IT INTO CORE.                                     AM2A089
*                                                                        EXECDMP
*     RECLWA IS THE LWA+1 OF THE CURRENT RECORD, WHICH IS IN A           EXECDMP
*       LEVEL-2 SUB-FILE OF A MIP FILE. THE SUB-FILE FLAG IN THE         EXECDMP
*       RECORD POINTER FOR THIS RECORD HAS ALREADY BEEN FOUND TO BE 1.   EXECDMP
*                                                                        EXECDMP
*     P<MPAT$AA> POINTS TO THE MIP PART OF THE CURRENT FIAT.             EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     AKS IS A CODE TELLING WHETHER THE DAUGHTER SUB-FILE IS I-S         EXECDMP
*       OR FIFO.                                                         EXECDMP
*                                                                        EXECDMP
*     IF OMEGA = 0, THEN WE HAVE CALLED LEVL$MP(3), AND IF TYPE NQ 0,    AM2A089
*       WE ARE NOW POSITIONED ON THE FIRST RECORD OF THE LEVEL-3 SUBFILE AM2A089
*                                                                        EXECDMP
*     IF OMEGA IS NOT 0, THEN --                                         EXECDMP
*                                                                        EXECDMP
*       OMEGA IS THE ADDRESS OF THE HEADER WORD OF THE SUBBLOCK.         EXECDMP
*                                                                        EXECDMP
*       QQ IS THE FWA OF THE FIRST RECORD IN THE SUBBLOCK.               EXECDMP
*                                                                        EXECDMP
*       RECLWA IS STILL THE LWA+1 OF THE PARENT RECORD.                  EXECDMP
*       RECLWA-2 IS THE ADDRESS OF THE SINGLE RECORD POINTER IN          EXECDMP
*         THE SUBBLOCK.                                                  EXECDMP
*       RECLWA-2 IS ALSO THE LWA+1 OF THE LAST RECORD IN THE             EXECDMP
*         SUBBLOCK.                                                      EXECDMP
*                                                                        EXECDMP
*       KEYLNGW IS IN ANY CASE THE LENGTH OF A RECORD IN THE             EXECDMP
*         LEVEL-3 SUBFILE, BECAUSE IT IS THE NUMBER OF WORDS NEEDED      EXECDMP
*         TO CONTAIN A PRIMARY KEY OF THE DATA FILE.                     EXECDMP
*                                                                        EXECDMP
*       P<FINF$AA> AND INDXLNG HAVE BEEN SET JUST AS THEY WOULD HAVE     EXECDMP
*         BEEN BY LEVL$MP(3). INDXLNG SEEMS A LITTLE SUPERFLUOUS,        EXECDMP
*         BUT WHEN A SUBBLOCK EXPANDS IT TURNS INTO A SUBFILE OF         EXECDMP
*         REAL BLOCKS, AND PERHAPS THAT MIGHT HAPPEN IN A WAY THAT       EXECDMP
*         DIDNT SET INDXLNG.                                             EXECDMP
*                                                                        CY211
*     TOMPLEFF AND TOMPES HAVE BOTH BEEN SET TO 0, INDICATING            CY211
*     THAT IN ANY RECORD OF THIS SUBFILE, THE KEY BEGINS AT              CY211
*     THE FIRST CHARACTER OF THE FIRST WORD.                             CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     LEVL$MP - TO DESCEND A LEVEL IF THE DAUGHTER IS NOT                EXECDMP
*       A SUBBLOCK.                                                      EXECDMP
*     GOFI$AA - TO POSITION AT THE FIRST RECORD OF THE DAUGHTER,         EXECDMP
*       IF NOT A SUBBLOCK.                                               EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          OMEGA = 0 ;                                                    EXECDMP
          P<SFH$MP> = RECLWA - 3 ;                                       EXECDMP
          AKS = SFHFO[0] ;                                               EXECDMP
          IF SFHSB[0] EQ 0                                               EXECDMP
            THEN BEGIN                                                   EXECDMP
              LEVL$MP ( 3 ) ;                                            EXECDMP
              IF TYPE NQ 0 THEN GOSTARTFILE ;                            AM2A089
            END                                                          EXECDMP
            ELSE BEGIN                                                   EXECDMP
              OMEGA = OMEGAVAL ;                                         EXECDMP
              QQ = OMEGA + 1 ;                                           EXECDMP
              P<FINF$AA> = MPATFIN[2] ;                                  EXECDMP
              INDXLNG = WLG(KLENG+4) ;                                   EXECDMP
              TOMPES = 0 ;
              TOMPLEFF = 0 ;
            END                                                          EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC GET$MP ; BEGIN                                                 EXECDMP
 #                                                                       EXECDMP
* *   GET$MP - LOCATE A RECORD BY ALTERNATE KEY               PAGE 1     EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC GET$MP                                                             EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     GIVEN AN ALTERNATE KEY, WHICH THE USER HAS SUPPLIED AS PART OF A   EXECDMP
*     GET OR START OPERATION, TO DO ALL THE WORK OF THE GET, OR          EXECDMP
*     EVERYTHING BUT THE RECORD TRANSFER IF THE OP IS A START.           EXECDMP
*                                                                        CY211
*     ALSO THE SPECIAL ((INDEX-ONLY)) GET -- SEE MWSA$MP                 CY211
*     FOR MORE DETAILS.                                                  CY211
*                                                                        EXECDMP
* DC  ENTRY, EXIT, AND ERROR CONDITIONS                                  EXECDMP
*                                                                        EXECDMP
*     THESE ARE THE SAME AS FOR ROUTINE  GET$IS , EXCEPT THAT OF COURSE  EXECDMP
*     THE CASE WHERE THE SUPPLIED KEY IS A PRIMARY KEY IS EXCLUDED.      EXECDMP
*                                                                        EXECDMP
*     ALSO, FTRC[0] IS SET BY GET$MP TO THE NUMBER OF PRIMARY KEYS       CY211
*     THAT CORRESPOND TO THE ALTERNATE KEY ON WHICH WE POSITION.         EXECDMP
*                                                                        CY211
*                                                                        CY211
*     BUT IF FTNDX[0] = 1 ON ENTRY, THIS IS AN ((INDEX-ONLY))            CY211
*     ACTION TO DEAL EXCLUSIVELY WITH KEY VALUES IN THE MIP FILE,        CY211
*     NOT WITH REAL RECORDS IN THE DATA FILE.                            CY211
*                                                                        CY211
*     ON ((INDEX-ONLY)) GET ---                                          CY211
*                                                                        CY211
*     A LIST OF PRIMARY KEY VALUES HAS BEEN SENT TO THE AREA TO          CY211
*     WHICH FTWSA[0] POINTS, PROVIDED THERE WAS A MATCH.                 CY211
*                                                                        CY211
*     FTKNE[0] = 0 FOR MATCH, OR 1 FOR NO MATCH, AND BESIDES THERE       CY211
*       IS A NON-FATAL ERROR IF NO MATCH.                                CY211
*     IF THE WHOLE LIST OF PRIMARY KEY VALUES FOR THIS ALTERNATE         CY211
*       KEY VALUE WAS COPIED, THEN                                       CY211
*       FTRL[0] = FTPTL[0] = NUMBER OF PRIMARY KEY VALUES.               CY211
*       FTRC[0] = NUMBER OF PRIMARY KEY VALUES FOR THE NEXT ALT          CY211
*         KEY VALUE.                                                     CY211
*       FTFP[0] = FAFP[0] = 10B ALIAS EOK.                               CY211
*     IF THE FTWSA[0] SPACE, LENGTH GIVEN BY FTMRL[0], IS TOO            CY211
*       SHORT, THE ACTION ENDS WITH                                      CY211
*       FTRL[0] = FTPTL[0] = NUMBER OF P.K.VALUES DELIVERED.             CY211
*       FTRC[0] = TOTAL NUMBER OF P.K.V. FOR THIS ALT K.V.               CY211
*       FTFP[0] = FAFP[0] = 0.                                           CY211
*       A GETNEXT WILL CONTINUE SMOOTHLY.                                CY211
*                                                                        CY211
*     FOR AN INDEX-ONLY START                                            CY211
*       IF NO MATCH, NON-FATAL ERROR.                                    CY211
*       OTHERWISE, IF FTREL[0]=REL"GE", FTKNE[0] IS 0 IF WE ARE ON A     CY211
*       RECORD WITH A MATCHING KEY, ELSE FTKNE[0] IS 1 AND WE ARE        CY211
*       ON THE RECORD WITH THE LOWEST HIGHER KEY. FTRC[0] IS THE COUNT   CY211
*       OF PRIMARY KEY VALUES THAT GO WITH THE ALTERNATE KEY VALUE       CY211
*       WE ARE POSITIONED AT. FTRL[0] = 0. XFER IS 0 -- SO SET BACK      CY211
*       IN SUBROUTINE GET$IS. THE ALTERNATE KEY VALUE IS STORED IN       CY211
*       THE FIAT WHERE FAPKY2ADR[0] POINTS, AND THE FIRST OR ONLY        CY211
*       CORRESPONDING PRIMARY KEY VALUE IS STORED IN THE FIAT WHERE      CY211
*       FAPKY3ADR[0] POINTS.                                             CY211
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     KPTR$MP - TO SET KEYFWA, KEYOFF, QREL, AND MAJKEY, AND CALL        CY211
*       POSONKD TO POSITION ON THE RIGHT ALTERNATE KEY DEFINITION.       CY211
*     SIKH$IS - TO TAKE ADVANTAGE, IF THE PRECEDING OPERATION WAS A      EXECDMP
*       SEEK WITH THE SAME KEY.                                          EXECDMP
*     MOVW$AA - TO COPY THE SEEK KEYS FROM THE SEEK-KEY AREAS OF THE     EXECDMP
*       FIAT TO THE POSITION-KEY AREA OF THE FIAT, IF THIS GET FOLLOWS   EXECDMP
*       A SERIES OF SEEKS THAT HAVE ALREADY BROUGHT US RIGHT TO THE      EXECDMP
*       WANTED RECORD.                                                   EXECDMP
*     LEVL$MP - TO DROP TO THE LEVEL 2 SUBFILE FOR THE GIVEN KEY         CY211
*       DEFINITION.                                                      EXECDMP
*     EZKY$IS - THEN TO FIND THEN GIVEN ALTERNATE KEY IN THAT            EXECDMP
*       LEVEL 2 SUBFILE.                                                 EXECDMP
*     SVK2$MP ALIAS SAVEKEY2 - TO SAVE THE ALTERNATE KEY VALUE AT WHICH  CY211
*       WE ACTUALLY POSITIONED, UNLESS SEEKS HAD ALREADY ARRIVED AT OUR  CY211
*       DESTINATION (THEN MOVW$AA WOULD BE USED).                        EXECDMP
*     SVK3$MP ALIAS SAVEKEY3 - DITTO FOR PRIMARY KEY.                    CY211
*     PKCT$MP - A FUNCTION GIVING THE NUMBER OF PRIMARY KEYS THAT        CY211
*       CORRESPOND TO THE ALTERNATE KEY AT WHICH WE ARE POSITIONED.      EXECDMP
*     GET3 - AFTER FINDING THE EQUIVALENT PRIMARY KEY, TO POSITION       EXECDMP
*       THE DATA FILE AT THE RECORD IT LOCATES.                          EXECDMP
*     STAT$MP - TO SET FTFP[0] AND FAFP[0] .                             CY211
*     FILP$AA ALIAS FILPOS - TO SET  FTFP[0] AND FAFP[0].                CY211
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     I AND J ARE USED AS SCRATCH.                                       CY211
*                                                                        EXECDMP
*     QMF AND QNE ARE SET AS RESULT INDICATORS.                          EXECDMP
*                                                                        EXECDMP
*     OMEGA IS USED IN CONNECTION WITH POSSIBLE LEVEL-3 SUBFILES.        EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
          KPTR$MP ;                                                      AFB0214
          FAPOSKEY1 = SIGMA;                                             AFB0531
          FTRL[0] = 0 ;                                                  AFB0811
          IF SIKH$MP EQ 0                                                AFB0214
            THEN BEGIN                                                   EXECDMP
              IF SEEKSTAGE NQ 0                                          EXECDMP
                THEN BEGIN                                               EXECDMP
                  I = FAPKY2ADR[0] ;                                     AFB0517
                  J = FASKY2ADR[0] ;                                     AFB0517
                  MOVW$AA ( J , J-I , I ) ;                              AFB0517
                    #COPY SEEK KEYS INTO POSITION KEYS#                  AFB0517
                  MPEOK[0] = MPSOK[0] ; 
                  MPOMEGA[0] = 0 ;
                  GOTO MIPGETA ;                                         EXECDMP
                END                                                      EXECDMP
            END                                                          AFB0214
            ELSE BEGIN                                                   AFB0214
              LEVL$MP ( 2 ) ;                                            AFB0214
            END                                                          AFB0214
          EZKY$IS ( 0 ) ;                                                AFB0214
          FTKNE[0] = QNE ;                                               AFB0318
          IF QEI EQ 0                                                    EXECDMP
            THEN BEGIN                                                   EXECDMP
              SAVEKEY2 ;                                                 EXECDMP
              FTRC[0] = PKCOUNT ;                                        EXECDMP
              OMEGA = 0 ;                                                EXECDMP
              SAVEKEY3 ;                                                 EXECDMP
              IF QMF EQ 0                                                EXECDMP
                THEN BEGIN                                               EXECDMP
                  FILPOS (EOK);                                          JJJ0625
     MIPGETX:                                                            AFB1005
                  MSGZ$AA (EC506) ;        #ALT KEY NOT FOUND#           CIM0317
                  GOTO EXIT$AA;                                          VBG0127
                END                                                      EXECDMP
     MIPGETA: IF FTCOP[0] EQ OP"GET"                                     EXECDMP
              THEN                                                       AFB0603
                BEGIN                                                    AFB0603
                IF FTNDX EQ 0                                            AFB0603
                THEN                                                     AFB0603
                  BEGIN                                                  AFB0603
                  GET3;                                                  AFB0603
                  END                                                    AFB0603
                ELSE                                                     AFB0603
                  BEGIN                                                  AFB0603
                  MWSA$MP;   #MOVE INFO TO WSA#                          REORG1 
                  FTRL = FTPTL;                                          AFB0603
                  RETURN;                                                AFB0603
                                                                         AFB0603
                  END                                                    AFB0603
                END                                                      AFB0603
              ELSE
                  BEGIN 
                  STAT$MP (0);
                  END 
            END                                                          EXECDMP
          ELSE                                                           JJJ0413
            BEGIN                                                        JJJ0413
            FILPOS (EOI);                                                JJJ0413
            GOTO MIPGETX ;                                               AFB1005
            END                                                          JJJ0413
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC GETN$MP ; BEGIN                                                EXECDMP
 #                                                                       EXECDMP
* *   GETN$MP - DO A GETNEXT BY ALTERNATE KEY               PAGE 1       EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC GETN$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO DO NEARLY ALL THE WORK OF A GETNEXT, WHEN THE MOST RECENT       EXECDMP
*     GET, SKIP, GETNEXT, OR REWIND ON THIS FILE WAS BY ALTERNATE KEY    EXECDMP
*                                                                        EXECDMP
* DC  ENTRY, EXIT, AND ERROR CONDITIONS                                  EXECDMP
*                                                                        EXECDMP
*     THE SAME AS FOR ROUTINE GETN$IS, EXCLUDING OF COURSE ANY CASE      EXECDMP
*     IN WHICH THE GIVEN KEY IS PRIMARY.                                 EXECDMP
*                                                                        EXECDMP
*     ALSO, GETN$MP WILL SET FTRC[0] TO THE NUMBER OF PRIMARY KEYS       EXECDMP
*     THAT GO WITH AN ALTERNATE KEY, IF IT MOVES ONTO THAT ALTERNATE     EXECDMP
*     KEY FROM THE PRECEDING ALTERNATE KEY (OR FROM THE REWIND           EXECDMP
*     POSITION.)                                                         EXECDMP
*                                                                        CY211
*     FOR AN ((INDEX-ONLY)) OPERATION, HOWEVER, THINGS ARE SPECIAL.      CY211
*     ON ENTRY --                                                        CY211
*                                                                        CY211
*     IF FTKA[0]=0, IT IS AS IF EOI WERE SPECIFIED AS KEY.               CY211
*     OTHERWISE, FTKA[0], FTKP[0] AND MAJKEY DEFINE A KEY VALUE.         CY211
*     EITHER WAY, EOI OR THE RECORD WITH THAT KEY VALUE IS TO            CY211
*     TERMINATE THE GETNEXT (UNLESS IT TERMINATES EARLIER BECAUSE        CY211
*     THE AREA FTWSA[0] POINTS TO IS EXHAUSTED.)                         CY211
*                                                                        CY211
*     IF FTREL[0] IS REL"GT", THE GETNEXT WILL STOP BEFORE THE           CY211
*     FIRST RECORD WHOSE KEY IS GREATER THAN THE GIVEN ONE.              CY211
*     IF FTREL[0] IS REL"EQ" OR REL"GE", IT WILL STOP BEFORE THE         CY211
*     RECORD WITH EQUAL KEY VALUE, OR THE NEXT HIGHER ONE IF NO          CY211
*     EQUAL.                                                             CY211
*                                                                        CY211
*     FTFP[0] MAY HAVE THE VALUE 10B = EOK, OR NOT. IF IT HAS THAT       CY211
*     VALUE, FTRL[0] WILL BE AUTOMATICALLY ZEROED, SO THAT ON RETURN     CY211
*     FTRL[0] AND FTPTL[0] WILL BE EQUAL. IF NOT, FTRL[0] WILL ON        CY211
*     RETURN, HAVE BEEN INCREASED BY THE VALUE NOW FOUND IN FTPTL[0].    CY211
*                                                                        CY211
*     ON EXIT --                                                         CY211
*                                                                        CY211
*     FTFP[0] AND FAFP[0] = EOI (100B) IF WE HAVE REACHED EOI.           CY211
*     OTHERWISE, THEY MAY CONTAIN EOK (10B) OR 0.                        CY211
*     IF EOK, THE TERMINAL KEY HAS BEEN REACHED. FTKNE[0] = 0 IF         CY211
*     STOPPED BEFORE A MATCHING KEY, OR 1 IF THERE WAS NO MATCHING       CY211
*     KEY.                                                               CY211
*     ALSO IF EOK, FTRC[0] CONTAINS THE NUMBER OF PRIMARY KEY            CY211
*     VALUES THAT CORRESPOND TO THE ALTERNATE KEY VALUE BEFORE           CY211
*     WHICH WE STOPPED, AND THAT ALTERNATE KEY VALUE, OR AT LEAST THE    CY211
*     FIRST FTKL[0] CHARACTERS OF IT, HAVE BEEN COPIED TO WHERE          CY211
*     FTKA[0] AND FTKP[0] POINT.                                         CY211
*                                                                        CY211
*     FTPTL[0] CONTAINS THE NUMBER OF PRIMARY KEY VALUES THAT HAVE       CY211
*     BEEN RETURNED ON THIS TRIP THROUGH GETN$MP, AND FTRL[0]            CY211
*     CONTAINS, AS EXPLAINED ABOVE, EITHER THE SAME AS FTPTL[0],         CY211
*     OR THE PREVIOUS FTRL[0] PLUS FTPTL[0].                             CY211
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     KPTQ$MP - TO SET UP KEY POINTERS BEFORE CALLING MWSA$MP.           CY211
*     KRAK$MP - TO CALL STMD$AA IF NECESSARY, AND TO SET PKL, PKT,       EXECDMP
*       AKW, AKP, AKL, AKT AND AKS.                                      EXECDMP
*     RPOS$MP - TO POSITION AT THE POINT FROM WHICH WE MUST STEP         EXECDMP
*       FORWARD ONE. (IT MAY BE SPECIFIED JUST BY THE MIP PTREE, BUT     EXECDMP
*       IF THE FILE HAS BEEN ALTERED IN THE MEANTIME, IT IS NECESSARY    EXECDMP
*       TO RESTORE THE POSITION BY KEY(S).)                              EXECDMP
*     SVK3$MP ALIAS SAVEKEY3 - TO SAVE IN THE FIAT THE NEW PRIMARY       CY211
*       KEY VALUE.                                                       CY211
*     PKCT$MP - A FUNCTION THAT IS THE NUMBER OF PRIMARY KEYS FOR        CY211
*       THE CURRENT ALTERNATE KEY VALUE.                                 CY211
*     GET3 - TO SWITCH TO THE DATA FILE, AND LOCATE THE WANTED RECORD    EXECDMP
*       IN IT BY PRIMARY KEY.                                            EXECDMP
*     MWSA$MP - TO DO MOST OF THE WORK, IF THIS IS AN ((INDEX-ONLY))     CY211
*       OPERATION.                                                       CY211
*     MOVC$AA - TO RETURN THE CURRENT ALTERNATE KEY VALUE.               CY211
*     TRN1$IS - TO DECOLLATE THE ALTERNATE KEY VALUE.                    CY211
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     OMEGA IS USED IN CONNECTION WITH POSSIBLE LEVEL-3 SUBFILES.        EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          KRAK$MP ( 0 ) ;                                                AFB0318
          RPOS$MP ;                                                      AFB0318
          IF QEI EQ 0                                                    EXECDMP
            THEN BEGIN                                                   EXECDMP
              SAVEKEY3 ;                                                 EXECDMP
              IF FTNDX[0] EQ 0                                           AFB0318
                THEN BEGIN                                               AFB0318
                  GET3 ;                                                 AFB0318
                END                                                      AFB0318
                ELSE BEGIN                                               AFB0318
                  IF FTFP[0] EQ EOK THEN FTRL[0] = 0 ;                   AFB0811
                  KPTQ$MP;
                  MWSA$MP;   #MOVE INFO TO WSA#                          REORG1 
                  FTKNE[0] = QNE ;                                       AFB0318
                  FTRL[0] = FTRL[0] + FTPTL[0] ;                         AFB0318
                  IF FTFP[0] EQ EOK                                      AFB0811
                    THEN BEGIN                                           AFB0811
                      FTRC[0] = PKCT$MP;                                 CY211
                      MOVC$AA(FAPKY2ADR[0],0,FTKA[0],FTKP[0],FTKL[0]);   AFB0811
                      IF AKT EQ KT"SYMBOLIC"                             AFB0811
                        THEN BEGIN                                       AFB0811
                        TRN1$IS(FTKA[0],FTKP[0],FTKL[0],LOC(FSCODITAB)); AFB0811
                        END                                              AFB0811
                    END                                                  AFB0811
                END                                                      AFB0318
            END                                                          EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC GET3 ; BEGIN                                                   EXECDMP
 #                                                                       EXECDMP
* *   GET3 - PREPARE TO LOCATE DATA RECORD BY PRIMARY KEY    PAGE 1      DABBLE 
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC GET3                                                               EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     AFTER WE HAVE CONVERTED AN ALTERNATE KEY TO A PRIMARY KEY,         EXECDMP
*     AS PART OF A GET OR GETNEXT, TO SWITCH FROM THE MIP FILE TO        EXECDMP
*     THE DATA FILE, AND RETURN THE PRIMARY KEY VALUE WHERE              DABBLE 
*     FTPKA POINTS.                                                      DABBLE 
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THE PRIMARY POSITION-KEY AREA IN THE FIAT, TO WHICH FAPKY3ADR[0]   EXECDMP
*     POINTS, CONTAINS THE PRIMARY KEY VALUE. THIS MUST BE A VALUE THAT  EXECDMP
*     ACTUALLY OCCURS IN THE DATA FILE, OR ELSE WE SHALL HAVE A FATAL    EXECDMP
*     ERROR.                                                             EXECDMP
*                                                                        DABBLE 
*     PKA IN THE FIT, IF NOT 0, POINTS TO WHERE THE PRIMARY KEY          DABBLE 
*     IS TO BE RETURNED.                                                 DABBLE 
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     WE ARE POINTED AT THE DATA FILE, AND KEYFWA POINTS TO THE          DABBLE 
*     PRIMARY KEY VALUE.                                                 DABBLE 
*     IF PKA IS NOT 0, THIS VALUE HAS BEEN COPIED TO WHERE PKA POINTS.   DABBLE 
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               DABBLE 
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     STAT$MP - TO SET FTFP[0] AND FAFP[0].                              CY211
*     STMD$AA - TO SWITCH FROM MIP MODE TO DATA FILE MODE, AND MAKE      EXECDMP
*       VARIOUS POINTERS CONCERN THE MIP FILE.                           EXECDMP
*     PKA$MP - TO STORE THE PRIMARY KEY VALUE WHERE PKA POINTS. 
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     KEYFWA IS SET TO POINT TO THE PRIMARY KEY VALUE.                   EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          STAT$MP (1);
          STMD$AA ( 0 ) ;                                                EXECDMP
          QEI = 0 ;                                                      AFB0801
          KEYFWA = FAPKY3ADR[0] ;                                        EXECDMP
          PKA$MP ;
          END 
CONTROL EJECT;
      PROC PKA$MP ; 
          BEGIN 
 #
* *   PKA$MP - RETURN PRIMARY KEY VALUE TO CALLER 
* *   A.F.R.BROWN 
* 1DC PKA$MP
* 
* DC  FUNCTION
* 
*     TO RETURN THE PRIMARY KEY VALUE WHERE FTPKA POINTS. 
* 
* DC  ENTRY CONDITIONS
* 
*     PKA IN THE FIT, IF NOT 0, POINTS TO WHERE THE PRIMARY KEY IS TO 
*     BE RETURNED, LEFT JUSTIFIED.
* 
*     KEYFWA POINTS TO THE PRIMARY KEY VALUE, LEFT-JUSTIFIED, COLLATED
*     IF OF SYMBOLIC TYPE.
* 
* DC  EXIT CONDITIONS 
* 
*     IF PKA IS NOT 0, THE PRIMARY KEY VALUE HAS BEEN RETURNED. 
* 
* DC  ERROR CONDITIONS
* 
*     NONE. 
* 
* DC  CALLED ROUTINES 
* 
*     MOVC$AA - TO COPY THE PRIMARY KEY VALUE.
*     TRN1$IS - TO DECOLLATE IT IF SYMBOLIC.
* 
* DC  NON-LOCAL VARIABLES 
* 
*     ONLY KEYFWA, NOTED ABOVE. 
* 
 #
          IF FTPKA[0] NQ 0                                               DABBLE 
          THEN                                                           DABBLE 
              BEGIN                                                      DABBLE 
              MOVC$AA ( KEYFWA,0,FTPKA[0],0,FSKEYSIZE[0] ) ;             DABBLE 
              IF FSKEYTYPE[0] EQ KT"SYMBOLIC"                            DABBLE 
              THEN                                                       DABBLE 
                  BEGIN                                                  DABBLE 
                  TRN1$IS(FTPKA[0],0,FSKEYSIZE[0],LOC(FSCODITAB[0]));    DABBLE 
                  END                                                    DABBLE 
              END                                                        DABBLE 
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC GOKY$MP ( N ) ; BEGIN ITEM N ;                                 EXECDMP
 #                                                                       EXECDMP
* *   GOKY$MP - LOCATE A KEY IN A LEVEL-3 SUBFILE               PAGE 1   EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC GOKY$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SEEK, IN A LEVEL-3 SUBFILE, THE RECORD THAT MATCHES             EXECDMP
*     OR IS NEXT ABOVE A GIVEN KEY, WHICH WILL BE A PRIMARY KEY OF       EXECDMP
*     THE CORRESPONDING DATA FILE. WHY NOT USE GOKY$IS ----              EXECDMP
*     1. THE SUBFILE MAY BE A SUBBLOCK                                   EXECDMP
*     2. THE SUBFILE MAY BE FIFO, NOT I-S                                EXECDMP
*     IF NEITHER OF THOSE, THEN GOKY$MP CALLS WKKY$IS TO DO THE WORK.    EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THERE IS ONE PARAMETER, PASSED IN THE NORMAL SYMPL WAY.            EXECDMP
*     IT IS 1 WHEN WE ARE PLANNING TO ADD A RECORD TO THE SUBFILE,       EXECDMP
*     AND 0 OTHERWISE.                                                   EXECDMP
*                                                                        EXECDMP
*     WHEN THIS PARAMETER IS 1, AND THE SUBFILE IS FIFO, WE DO NOT MATCH EXECDMP
*     ON THE KEY BUT JUST POSITION AT EOI. THIS IS BECAUSE PUTS GO AT    EXECDMP
*     THE END OF A FIFO FILE, AND WE NEED NOT CHECK FOR DUPLICATES       EXECDMP
*     BECAUSE FIFO AND REPEATING GROUPS ARE NOT ALLOWED FOR THE SAME     EXECDMP
*     ALTERNATE KEY DEFINITION. TWO OCCURRENCES OF ONE PRIMARY KEY WITH  EXECDMP
*     THE SAME ALTERNATE KEY MUST INDICATE, IN A DATA FILE WHERE NO      EXECDMP
*     TWO RECORDS ARE ALLOWED TO HAVE THE SAME PRIMARY KEY, TWO          EXECDMP
*     OCCURRENCES OF THE SAME ALTERNATE KEY VALUE IN THE SAME ORIGINAL   EXECDMP
*     RECORD, WHICH IMPLIES A REPEATING GROUP -- BUT THIS IS FORBIDDEN.  EXECDMP
*                                                                        EXECDMP
*     THE SAME PARAMETER, IF PASSED ALONG TO WKKY$IS AND THENCE TO       EXECDMP
*     EZKY$IS AND GOKY$IS, CAUSES US TO BE POSITIONED ON THE FIRST       EXECDMP
*     OF TWO BLOCKS RATHER THAN THE SECOND, WHEN DOING A PUT OF A        EXECDMP
*     RECORD WHOSE KEYWISE POSITION IS BETWEEN THE LAST RECORD OF THE    EXECDMP
*     FIRST BLOCK AND THE FIRST RECORD OF THE SECOND.                    EXECDMP
*                                                                        EXECDMP
*     AKS TELLS WHETHER THE CURRENT SUBFILE IS I-S OR FIFO.              CY211
*                                                                        EXECDMP
*     OMEGA IS 0 IF THE CURRENT SUBFILE IS NOT A SUBBLOCK, BUT A         EXECDMP
*       THING WITH ITS OWN BLOCKS.                                       EXECDMP
*                                                                        EXECDMP
*     OTHERWISE --                                                       EXECDMP
*                                                                        EXECDMP
*       OMEGA IS THE FWA OF THE SUBBLOCK, AND THE ADDRESS OF ITS         EXECDMP
*         HEADER WORD.                                                   EXECDMP
*       OMEGA+1 IS THE FWA OF THE FIRST RECORD IN THE SUBBLOCK.          EXECDMP
*       RECLWA IS THE LWA+1 OF THE PARENT RECORD AT LEVEL 2.             EXECDMP
*       RECLWA-2 IS THE LWA+1 OF THE LAST RECORD IN THE SUBBLOCK.        EXECDMP
*       KEYLNGW IS THE LENGTH IN WORDS OF A RECORD IN THE SUBBLOCK.      EXECDMP
*       PKL IS THE LENGTH OF ITS KEY IN CHARACTERS.                      EXECDMP
*       PKT IS THE TYPE OF ITS KEY.                                      EXECDMP
*                                                                        EXECDMP
*     KEYFWA IS THE FWA OF THE SAMPLE KEY WE ARE TO SEARCH ON, AND       EXECDMP
*       IT STARTS ON THE FIRST CHARACTER.                                EXECDMP
*                                                                        EXECDMP
*     WE ARE LOOKING FOR SIMPLE EQUALITY OF KEYS.                        EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     QMF = 0 IF NO MATCHING RECORD, OTHERWISE NON-ZERO.                 EXECDMP
*                                                                        EXECDMP
*     OMEGA IS UNCHANGED. IF IT WAS 0 ON ENTRY, THE POSITION IN          EXECDMP
*       THE LEVEL-3 SUBFILE IS INDICATED IN THE NORMAL WAY, THROUGH      EXECDMP
*       THE PTREE, RECFWA, AND RECLWA. IF THE SUBFILE IS FIFO AND THE    EXECDMP
*       INCOMING PARAMETER WAS NON-ZERO, THE POSITION WILL BE AT EOI.    EXECDMP
*                                                                        EXECDMP
*     IF OMEGA WAS NON-ZERO ON ENTRY,                                    EXECDMP
*         IF QMF IS NOT 0, QQ IS THE FWA OF THE MATCHING RECORD.         EXECDMP
*         IF QMF = 0, FOR NO MATCH                                       EXECDMP
*           IF THE SUBBLOCK IS FIFO, QQ IS THE LWA+1 OF THE LAST RECORD. EXECDMP
*           IF THE SUBBLOCK IS I-S, QQ IS THE FWA OF THE NEXT HIGHER     EXECDMP
*             RECORD, OR THE LWA+1 OF THE LAST RECORD IF THE KEY IS      EXECDMP
*             HIGHER THAN ANY IN THE SUBFILE.                            EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     WKKY$IS - TO SEARCH BY KEY IN AN I-S SUBFILE, NOT A SUBBLOCK.      EXECDMP
*     SCSB$MP - TO SEACH BY KEY IN AN I-S SUBBLOCK.                      CY211
*     GOFI$AA - TO GO TO THE FIRST RECORD OR THE EOI OF A FIFO           EXECDMP
*       SUBFILE, NOT A SUBBLOCK.                                         EXECDMP
*     CPCH$AA - TO COMPARE THE KEY OF EACH RECORD IN A FIFO SUBFILE.     EXECDMP
*     SKPF$AA - TO STEP AHEAD IN A FIFO SUBFILE, NOT A SUBBLOCK.         EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     COND IS SET BY CPCH$AA TO INDICATE RESULT.                         EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          IF AKS EQ FO"IS"                                               EXECDMP
            THEN BEGIN                                                   EXECDMP
              IF OMEGA EQ 0                                              EXECDMP
                THEN WKKY$IS ( N ) ;                                     EXECDMP
                ELSE  SCSB$MP;
            END                                                          EXECDMP
            ELSE BEGIN                                                   EXECDMP
              QMF = 0 ;                                                  AFB0120
              IF OMEGA EQ 0                                              EXECDMP
                THEN BEGIN                                               EXECDMP
                  IF N EQ 0                                              EXECDMP
                    THEN BEGIN                                           EXECDMP
                      GOSTARTFILE ;                                      EXECDMP
                      ASLONGAS QEI EQ 0 #WHILE NOT AT END OF SUBFILE# 
                        DO BEGIN                                         EXECDMP
                          CPCH$AA (RECFWA,0,KEYFWA,0,PKL,PKT) ;          EXECDMP
                          IF COND EQ 0                                   EXECDMP
                            THEN BEGIN                                   EXECDMP
                              QMF = 1 ;                                  EXECDMP
                              RETURN ;                                   EXECDMP
                            END                                          EXECDMP
                          SKPF$AA ;                                      EXECDMP
                        END                                              EXECDMP
                    END                                                  EXECDMP
                    ELSE GOENDFILE ; #PUT AT END#                        EXECDMP
                END                                                      EXECDMP
                ELSE BEGIN                                               EXECDMP
                  IF N EQ 0                                              EXECDMP
                    THEN BEGIN                                           EXECDMP
                      FOR J = OMEGA+1 STEP KEYLNGW UNTIL RECLWA-3        EXECDMP
                        DO BEGIN                                         EXECDMP
                          QQ = J;   #SET QQ FIRST#                       EXECDMP
                          CPCH$AA ( QQ,0,KEYFWA,0,PKL,PKT ) ;            EXECDMP
                          IF COND EQ 0                                   EXECDMP
                            THEN BEGIN                                   EXECDMP
                              QMF = 1 ;                                  EXECDMP
                              RETURN ;                                   EXECDMP
                            END                                          EXECDMP
                        END                                              EXECDMP
                      QQ = RECLWA - 2;                                   AFB0207
                    END                                                  EXECDMP
                    ELSE QQ = RECLWA-2 ; #PUT AT END#                    EXECDMP
                END                                                      EXECDMP
            END                                                          EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;
PROC KPTQ$MP; 
          BEGIN 
 #                                                                       CY211
* *   KPTQ$MP - SET KEY POINTERS FOR MIP         PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC KPTQ$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO SET KEYOFF, KEYFWA AND MAJKEY TO DEFINE AN ALTERNATE KEY        CY211
*     VALUE THAT HAS TO BE LOOKED UP IN A MIP FILE, AFTER MAKING         CY211
*     A COLLATED COPY OF IT IF NECESSARY.                                CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     FTKA[0] AND FTKP[0] GIVE THE ADDRESS AND CHARACTER POSITION        CY211
*       OF THE START OF THE KEY VALUE.                                   CY211
*     AKL IS THE LENGTH IN CHARACTERS OF THE CURRENT SPECIES OF          CY211
*       ALTERNATE KEY.                                                   CY211
*     AKT CONTAINS THE TYPE OF THE CURRENT ALTERNATE KEY.                CY211
*     MKEYLNG = WHATEVER WAS IN FTMKL[0] WHEN CRM WAS CALLED.            CY211
*       USUALLY 0, OTHERWISE IT SHOULD BE SOMETHING LESS THAN            CY211
*       AKL, DEFINING A ((MAJOR KEY LENGTH)) FOR A SYMBOLIC              CY211
*       KEY.                                                             CY211
*                                                                        CY211
* DC  EXIT CONDITIONS.                                                   CY211
*                                                                        CY211
*     KEYFWA = FTKA[0].                                                  CY211
*     KEYOFF = FTKP[0]. HOWEVER, IF THE CURRENT KEY TYPE IS SIGNED,      CY211
*       KEYOFF = 0 AND FTKP[0] IS DISREGARDED.                           CY211
*     ALSO, IF AKT = KT"SYMBOLIC", KEYFWA POINTS TO A COLLATED COPY      CY211
*       OF THE KEY, AND KEYOFF = 0.                                      CY211
*     MAJKEY = MKEYLNG IF THE LATTER WAS NOT 0, OTHERWISE = AKL.         CY211
*       IN ANY CASE, IT IS THE EFFECTIVE KEY LENGTH FOR THE COMING       CY211
*       SEARCH.                                                          CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               JJJ1129
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     TRN2$IS - TO DO THE COLLATING.                                     CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     ONLY THOSE INVOLVED IN ENTRY AND EXIT CONDITIONS.                  CY211
*                                                                        CY211
 #                                                                       CY211
          IF MKEYLNG NQ 0                                                AFB0214
            THEN MAJKEY = MKEYLNG ;                                      AFB0214
            ELSE MAJKEY = AKL ;                                          AFB0318
          KEYFWA = FTKA[0] ;                                             AFB0318
          KEYOFF = FTKP[0] ;                                             AFB0318
          IF AKT EQ KT"SYMBOLIC"                                         AFB0214
            THEN BEGIN                                                   AFB0214
              TRN2$IS ;                                                  AFB0214
              KEYFWA = LOC(TRKY$IS) ;                                    AFB0214
              KEYOFF = 0 ;                                               AFB0214
            END                                                          AFB0214
            ELSE BEGIN                                                   AFB0214
                  IF AKT EQ KT"SIGNED"                                   AFB0721
                    THEN BEGIN                                           AFB0721
                      KEYOFF = 0 ;                                       AFB0721
                      MAJKEY = 10 ;                                      AFB0721
                    END                                                  AFB0721
            END                                                          AFB0214
          END                                                            AFB0214
CONTROL EJECT;
     PROC KPTR$MP ; BEGIN                                                AFB0214
 #                                                                       CY211
* *   KPTR$MP - CALL POSONKD AND SET ALT KEY POINTERS     PAGE  1        AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC KPTR$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     CHIEFLY TO CALL POSONKD AND KPTQ$MP. SEE THE ((FUNCTIONS))         CY211
*     OF THOSE SUBROUTINES. POSONKD IS CALLED SO AS TO SET UP            CY211
*     A KEYDEF WORD IN SIGMA. THE PROGRAM THAT CALLED KPTR$MP            CY211
*     MAY AFTERWARDS COPY THIS INTO FAPOSKEY1[0] OR FASEEKEY1[0]         CY211
*     IN THE FIAT.                                                       CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     P<FIT$AA> POINTS TO THE CURRENT FIT.                               CY211
*     P<FIAT$AA> POINTS TO ITS FIAT, AND P<MPAT$AA> TO THE MIP PART      CY211
*       OF THE FIAT.                                                     CY211
*     FTKL[0], FTRKW[0] AND FTRKP[0] IN THE FIT SPECIFY AN ALTERNATE     CY211
*       KEY SPECIES THAT MUST ALREADY EXIST IN THE MIP FILE.             CY211
*     FTKA[0] AND FTKP[0] ARE THE FWA AND STARTING CHARACTER POSITION OF CY211
*       A GIVEN VALUE OF THAT ALTERNATE KEY.                             CY211
*     FTCOP[0] CONTAINS A CODE FOR WHAT KIND OF OPERATION THIS IS.       CY211
*     IF THIS IS A ((START)), THEN FTREL[0] IS REL"EQ", REL"GE",         CY211
*       OR REL"GT", INDICATING WHAT RELATION TO THE GIVEN KEY            CY211
*       VALUE IS SOUGHT. OTHERWISE, EQUALITY IS ALWAYS SOUGHT.           CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     A KEYDEF WORD HAS BEEN SET UP IN VARIABLE SIGMA.                   CY211
*                                                                        CY211
*     QREL HAS BEEN SET = FTREL[0] FOR A START, OTHERWISE                CY211
*       TO REL"EQ".                                                      CY211
*                                                                        CY211
*     IN ADDITION, SEE THE ((EXIT CONDITIONS)) OF POSONKD                CY211
*       AND KPTQ$MP.                                                     CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     POSONKD - TO SET UP A KEYDEF WORD, AND POSITION US AT              CY211
*       THAT KEYDEF IN THE MIP FILE.                                     CY211
*                                                                        CY211
*     KPTQ$MP - TO SET UP KEY POINTERS.                                  CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES.                                               CY211
*                                                                        CY211
*     ONLY SIGMA, EXPLAINED ABOVE.                                       CY211
*                                                                        CY211
 #                                                                       CY211
          POSONKD ( LOC(SIGMA) ) ;                                       AFB0214
          IF FTCOP NQ OP"STR" OR FTREL EQ REL"ZR" OR FTREL EQ REL"EQ"    AM2A094
          THEN                                                           JJJ1129
              BEGIN                                                      JJJ1129
              QREL = REL"EQ";                                            JJJ1129
              END                                                        JJJ1129
          ELSE                                                           JJJ1129
              BEGIN                                                      JJJ1129
              IF FTREL EQ REL"GE" OR FTREL EQ REL"GT"                    JJJ1129
              THEN                                                       JJJ1129
                  BEGIN                                                  JJJ1129
                  QREL = FTREL;                                          JJJ1129
                  END                                                    JJJ1129
              ELSE                                                       JJJ1129
                  BEGIN                                                  JJJ1129
                  MSGZ$AA(EC551); #ILLEGAL REL VALUE#                    JJJ1129
                  GOTO EXIT$AA;                                          JJJ1129
                  END                                                    JJJ1129
              END                                                        JJJ1129
          KPTQ$MP;
          END                                                            AFB0318
CONTROL EJECT;                                                           JJJ0209
     PROC KRAK$MP ( N ) ; BEGIN ITEM N ;                                 EXECDMP
 #                                                                       EXECDMP
* *   KRAK$MP - CRACK AN ALTERNATE KEY DEFINITION             PAGE 1     EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC KRAK$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO CRACK THE ALTERNATE KEY DEFINITION THAT IS NOW IN THE MPAKD[0]  EXECDMP
*     WORD OF THE FIAT, STORING ITS PARTS IN SEPARATE VARIABLES. ALSO    EXECDMP
*     TO SET PKL AND PKT TO THE PRIMARY KEY LENGTH AND TYPE.             EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THERE IS ONE PARAMETER, PASSED IN THE USUAL SYMPL WAY. THIS IS     EXECDMP
*     EQUAL TO, GREATER THAN, OR LESS THAN 0.                            EXECDMP
*                                                                        EXECDMP
*     IF THE PARAMETER IS NOT LESS THAN 0, KRAK$MP IS TO ENSURE THAT     EXECDMP
*     WE ARE LOOKING AT THE MIP FILE, RATHER THAN THE DATA FILE.         EXECDMP
*                                                                        EXECDMP
*     IF THE PARAMETER IS NOT 0, ALL THE FIELDS OF THE ALTERNATE KEY     EXECDMP
*     DEFINITION ARE CRACKED. BUT IF IT IS 0, WE ARE IN A READ-ONLY      EXECDMP
*     SITUATION, AND NEED NOT BOTHER SETTING AKC AND BB. THEY MAY        EXECDMP
*     DEPEND ON THE LENGTH OF THE CURRENT RECORD IN THE DATA FILE, AS    EXECDMP
*     WELL AS ON FIELDS OF THE KEY DEFINITION, SO NOT SETTING THEM       EXECDMP
*     CAN SAVE MANY INSTRUCTIONS.                                        EXECDMP
*                                                                        EXECDMP
*     P<FSTT$AA> POINTS TO THE FSTT OF THE CURRENT FILE, WHICH MIGHT     EXECDMP
*     BE EITHER A MIP FILE OR ITS ASSOCIATED DATA FILE.                  EXECDMP
*                                                                        EXECDMP
*     MIPMODE = 0 IF THIS IS THE DATA FILE, OR NON-ZERO IF THE MIP FILE. EXECDMP
*                                                                        EXECDMP
*     P<FIAT$AA> POINTS TO THE CURRENT FIAT.                             EXECDMP
*                                                                        EXECDMP
*     P<MPAT$AA> POINTS TO THE MIP PART OF THE CURRENT FIAT.             EXECDMP
*                                                                        EXECDMP
*     FTCOP[0] CONTAINS A CODE INDICATING THE CURRENT OPERATION.         EXECDMP
*                                                                        EXECDMP
*     MRQLNG IS THE LENGTH OF A RECORD IN CHARACTERS -- THE EXISTING     EXECDMP
*       RECORD IN THE DATA FILE IF THIS IS A DELETE OR REPLACE, OR       EXECDMP
*       THE NEW RECORD IF THIS IS A PUT.                                 EXECDMP
*                                                                        EXECDMP
*     THE MIP FILE MUST BE OPEN, BUT IF THIS IS NOT A FILE-UPDATING      EXECDMP
*     OPERATION, THE DATA FILE NEED NOT BE OPEN.                         EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     IF THE INCOMING PARAMETER WAS NOT NEGATIVE, MIPMODE IS NOW         EXECDMP
*     NON-ZERO AND WE ARE INITIALIZED ON THE MIP FILE RATHER THAN THE    EXECDMP
*     DATA FILE.                                                         EXECDMP
*                                                                        EXECDMP
*     PKL IS THE LENGTH IN CHARACTERS OF THE PRIMARY KEY IN THE          EXECDMP
*       DATA FILE.                                                       EXECDMP
*                                                                        EXECDMP
*     PKT IS THE TYPE NUMBER OF THAT KEY.                                EXECDMP
*                                                                        EXECDMP
*     KEYLNGW IS THE NUMBER OF WORDS NEEDED TO CONTAIN SUCH A KEY.       EXECDMP
*                                                                        EXECDMP
*     AKW AND AKP GIVE THE STARTING POINT OF THE CURRENT ALTERNATE       EXECDMP
*       KEY, IN WORDS AND CHARACTERS FROM THE START OF A DATA RECORD.    EXECDMP
*                                                                        EXECDMP
*     AKL IS THE LENGTH OF THAT KEY IN CHARACTERS.                       EXECDMP
*                                                                        EXECDMP
*     AKT IS THE TYPE NUMBER OF THAT KEY.                                EXECDMP
*                                                                        EXECDMP
*     AKS IS THE NUMBER INDICATING WHETHER A SINGLE VALUE OF THAT        EXECDMP
*       ALTERNATE KEY MAY OCCUR MORE THAN ONCE IN THE DATA FILE, AND     EXECDMP
*       IF SO, WHETHER THE CORRESPONDING PRIMARY KEYS ARE TO BE LISTED   EXECDMP
*       IN AN I-S SUB-FILE, OR A FIFO SUB-FILE, IN THE MIP FILE.         CY211
*                                                                        EXECDMP
*     IF THE INCOMING PARAMETER IS NON-ZERO, THE FOLLOWING ADDITIONAL    EXECDMP
*       THINGS ARE SET.                                                  EXECDMP
*                                                                        EXECDMP
*     AKC IS THE NUMBER OF TIMES THE GIVEN ALTERNATE KEY IS TO BE        EXECDMP
*       EXTRACTED FROM THE DATA RECORD. (REPEATING GROUP COUNT)          EXECDMP
*       THEIR STARTING POINTS WILL BE MPAKG[0] CHARACTERS APART.         EXECDMP
*                                                                        EXECDMP
*     BB = 1 IF THIS IS A REPLACE, AND EITHER AKC IS SPECIFIED 1, OR     AFB0120
*       THE LENGTH OF BOTH THE NEW AND THE OLD RECORD IS SUCH AS TO      AFB0120
*       MAKE THE EFFECTIVE REPEATING GROUP COUNT 1.                      AFB0120
*       OTHERWISE BB = 0. A REPLACE CAN SKIP A LITTLE                    AFB0120
*       WORK WHEN THERE IS JUST ONE KEY VALUE ON EACH SIDE, AND THE      EXECDMP
*       VALUES HAPPEN TO BE IDENTICAL.                                   EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     STMD$AA - TO SWITCH FROM THE DATA FILE TO THE MIP FILE.            EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     X AND Y ARE USED AS SCRATCH.                                       EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
          ARRAY  [0:3];      #USED TO ASSOC. RMKDEF KT TO IS KT#         JJJ0114
              BEGIN                                                      JJJ0114
              ITEM AKTVAL (0,0,60) = [1,2,3,-1];                         JJJ0114
              END                                                        JJJ0114
          IF MIPMODE EQ 0 AND N GQ 0 THEN STMD$AA ( 16 ) ;               EXECDMP
          PKL = FSPKL[0] ;                                               EXECDMP
          PKT = FSPKT[0] ;                                               EXECDMP
          KEYLNGW = WLG(PKL) ;                                           EXECDMP
          AKW = MPAKW[0] ;                                               EXECDMP
          AKP = MPAKP[0] ;                                               EXECDMP
          AKL = MPAKL[0] ;                                               EXECDMP
          AKT = AKTVAL[MPAKT[0]];  #SET AKT TO CORRESPONDING IS KT#      JJJ0114
          AKS = MPAKS[0] ;                                               EXECDMP
          IF N NQ 0 AND AKL NQ 0                                         GBK0201
            THEN BEGIN #WILL ALTER FILE#                                 EXECDMP
              BB = 0 ;                                                   EXECDMP
              Y = MPAKG[0] ;                                             EXECDMP
              IF Y EQ 0                                                  EXECDMP
                THEN BEGIN                                               EXECDMP
                  AKC = 1 ;                                              EXECDMP
                END                                                      EXECDMP
                ELSE BEGIN                                               EXECDMP
                  AKC = MPAKC[0] ;                                       EXECDMP
                  IF AKC EQ 0                                            EXECDMP
                    THEN BEGIN                                           EXECDMP
                      X = 10 * AKW + AKP + AKL ;                         EXECDMP
                      AKC = ( MRQLNG - X ) / Y + 1 ;                     EXECDMP
                      IF FTRL[0]-X GQ Y OR FTRL[0] NQ MPRECLN 
                          THEN RETURN ; #BB=0#
                    END                                                  EXECDMP
                END                                                      EXECDMP
              IF AKC EQ 1 AND FTCOP[0] EQ OP"RPL" THEN BB = 1 ;          AFB0120
            END                                                          EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC LEVL$MP ( N ) ; BEGIN ITEM N ;                                 EXECDMP
 #                                                                       EXECDMP
* *   LEVL$MP - GO TO A GIVEN LEVEL OF THE MIP FILE             PAGE 1   EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC LEVL$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO LOCATE US IN THE CURRENT SUB-FILE AT A GIVEN LEVEL OF THE       EXECDMP
*     MIP FILE. IF IN A HIGHER LEVEL THAN BEFORE, AT THE CURRENT         EXECDMP
*     RECORD. IF IN A LOWER LEVEL THAN BEFORE, IN THE SUBFILE            EXECDMP
*     BUT NOWHERE IN PARTICULAR, WITH NO INFORMATION IN THE              EXECDMP
*     PTREE EXCEPT CURPTR=0.                                             EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THERE IS ONE PARAMETER, PASSED IN THE NORMAL SYMPL WAY. THIS       EXECDMP
*     IS 1, 2, OR 3, INDICATING A LEVEL IN THE CURRENT MIP FILE.         EXECDMP
*     LEVEL 1 CONTAINS 1 SUB-FILE, THE LIST OF ALTERNATE KEY             EXECDMP
*     DEFINITIONS. LEVEL 2 CONTAINS ONE SUB-FILE FOR EACH LEVEL-1        EXECDMP
*     RECORD, AND EACH IS A LIST OF ALTERNATE KEY VALUES.                EXECDMP
*     LEVEL 3 CONTAINS ONE SUB-FILE FOR EACH ALTERNATE KEY VALUE         EXECDMP
*     TO WHICH MORE THAN ONE PRIMARY KEY CORRESPONDS, AND EACH           EXECDMP
*     SUB-FILE IS A LIST OF ALL THOSE PRIMARY KEY VALUES EXCEPT          EXECDMP
*     THE LOWEST.                                                        EXECDMP
*                                                                        EXECDMP
*     CURLEV, A FIELD IN THE MIP PART OF THE FIAT, CONTAINS THE          EXECDMP
*     CURRENT LEVEL NUMBER. THIS MAY BE 0 AT OPEN TIME, OTHERWISE        EXECDMP
*     IT WILL BE 1 2 OR 3.                                               EXECDMP
*                                                                        EXECDMP
*     P<FIAT$AA> POINTS TO THE FIAT, AND P<MPAT$AA> TO THE               EXECDMP
*     MIP SECTION OF THE FIAT.                                           EXECDMP
*                                                                        EXECDMP
*     IF THE PARAMETER IS GREATER THAN CURLEV, THE CURRENT RECORD        EXECDMP
*     MUST BE IN CORE, AND RECLWA IS ITS LWA+1.                          EXECDMP
*     THE CURRENT RECORD MUST HAVE A DEPENDENT SUBFILE, AND THIS         EXECDMP
*     MUST BE CHECKED FOR BEFORE CALLING LEVL$MP. A SUBBLOCK             CY211
*     DOES NOT MEET THIS REQUIREMENT.                                    CY211
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     P<FINF$AA> POINTS TO THE FINF, OR FILE DESCRIPTOR, OF THE          EXECDMP
*     SUBFILE AT THE NEW LEVEL.                                          EXECDMP
*                                                                        EXECDMP
*     P<PTRE$AA> POINTS TO THE PTREE AT THE NEW LEVEL.                   EXECDMP
*                                                                        EXECDMP
*     CURLEV HAS BEEN ALTERED TO EQUAL THE INCOMING PARAMETER.           EXECDMP
*                                                                        EXECDMP
*     INDXLNG HAS BEEN SET TO THE LENGTH IN WORDS THAT AN INDEX RECORD   EXECDMP
*     AT THE NEW LEVEL WOULD HAVE TO HAVE.                               EXECDMP
*                                                                        CY211
*     TOMPLEFF AND TOMPES HAVE BEEN SET TO THE NUMBER OF WORDS AND       CY211
*       THE NUMBER OF CHARACTERS DISTANCE BETWEEN THE START OF A         CY211
*       RECORD AND THE START OF ITS PRIMARY KEY, IN ANY DATA RECORD      CY211
*       (I.E. NOT INDEX RECORD) OF THE CURRENT SUB-FILE AT THE NEW       CY211
*       LEVEL.                                                           CY211
*                                                                        EXECDMP
*     IF THE NEW LEVEL NUMBER IS GREATER THAN THE OLD ONE,
*     THE VARIANCE FLAG FOR THE NEW LEVEL HAS BEEN ZEROED.
*     IF NEW LESS THAN OLD, THE FLAG FOR THE OLD LEVEL HAS
*     BEEN ZEROED IF NECESSARY. 
*                                                                        EXECDMP
*     IF THE NEW LEVEL NUMBER IS LESS THAN THE OLD ONE, THE SUBFILE      EXECDMP
*     HEADER AT THE NEW LEVEL (AND AT INTERVENING LEVELS IF THE JUMP     EXECDMP
*     IS FROM 3 TO 1) HAS BEEN UPDATED IF THE SUBFILE IT DESCRIBES       EXECDMP
*     HAS BEEN ALTERED.                                                  EXECDMP
*                                                                        EXECDMP
*     IF THE NEW LEVEL NUMBER IS GREATER THAN THE OLD ONE,               EXECDMP
*     CURPTR = 0 , PTCURBLK[0] = PRIMARY INDEX BLOCK NUMBER,             CY211
*     PTCUREC[0] = 0.                                                    CY211
*                                                                        EXECDMP
*     IF THE NEW LEVEL NUMBER IS LESS THAN THE OLD ONE, THE CURRENT      EXECDMP
*     RECORD IN THE NEW SUBFILE IS THE ONE SPECIFIED IN THE PTREE        EXECDMP
*     AT THAT LEVEL, WHICH HAS REMAINED UNCHANGED SINCE WE               EXECDMP
*     DESCENDED FROM THAT LEVEL. THIS RECORD IS NOW IN CORE.             EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE.                                                              EXECDMP
*                                                                        EXECDMP
*     NOTE THAT IT IS ALLOWABLE TO MOVE ONE LEVEL IN EITHER              EXECDMP
*     DIRECTION, OR UP FROM LEVEL 3 TO LEVEL 1. BUT LEVL$MP              EXECDMP
*     MUST NOT BE CALLED TO MOVE DOWN FROM LEVEL 1 TO LEVEL 3.           EXECDMP
*     THERE IS NO TEMPTATION TO DO SO ANYWAY.                            EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     CURR$AA - TO GO TO THE CURRENT RECORD OF A SUBFILE.                EXECDMP
*     ALTR$AA - TO DO THE FORMALITIES BEFORE ALTERING A BLOCK            EXECDMP
*       IMAGE (HERE WHAT WE MAY ALTER IS A SUB-FILE HEADER).             EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          IF N EQ CURLEV                                                 EXECDMP
            THEN BEGIN                                                   EXECDMP
              P<FINF$AA> = MPATFIN[N-1] ;                                EXECDMP
              P<PTRE$AA> = MPATPTR[N-1] ;                                EXECDMP
              GOTO MIPLEVA ;                                             EXECDMP
            END                                                          EXECDMP
          IF N GR CURLEV                                                 EXECDMP
            THEN BEGIN                                                   EXECDMP
              P<FINF$AA> = MPATFIN[N-1] ;                                EXECDMP
              CURR$AA ;                                                  CIM0315
              P<SFH$MP> = RECLWA - 3 ;                                   EXECDMP
              FIWRD0[0] = SFHWD0[0] ;                                    EXECDMP
              FIWRD0[1] = SFHWD0[1] ;                                    EXECDMP
              IF N EQ 2                                                  EXECDMP
                THEN BEGIN                                               EXECDMP
                  FIWRD0[2] = SFHWD0[2] ;                                AFB0214
                END                                                      EXECDMP
                ELSE ORG = SFHFO[0] ;                                    EXECDMP
              P<PTRE$AA> = MPATPTR[N-1] ;                                EXECDMP
              CURLEV = N ;                                               EXECDMP
              VARIANCE(CURLEV) = 0; 
              CURPTR = 0 ;                                               EXECDMP
              PTCURBLK[0] = PRBK LAN ( 2**24-1 ) ;
              PTCUREC[0] = 0 ;                                           CREATEM
              QFR = 0;                                                   CY209
              QLR = 0;                                                   CY209
              QEI = 0;                                                   CY209
            END                                                          EXECDMP
            ELSE BEGIN                                                   EXECDMP
              ASLONGAS CURLEV GR N                                       EXECDMP
                DO BEGIN                                                 EXECDMP
                  CURLEV = CURLEV - 1 ;                                  EXECDMP
                  P<PTRE$AA> = MPATPTR[CURLEV-1] ;                       EXECDMP
                  IF VARIANCE(CURLEV+1) NQ 0 AND FTMER[0] EQ 7
                                                #WRITE PERMISSIONS# 
                      AND LOC( PUT$MP ) GR 0 #UPDATE CAPSULE LOADED#
                    THEN BEGIN                                           EXECDMP
                      CURR$AA ;                                          EXECDMP
                      P<SFH$MP> = RECLWA - 3 ;                           EXECDMP
                      IF SFHWD0[0] NQ FIWRD0[0] 
                            OR SFHWD0[1] NQ FIWRD0[1] 
                        THEN BEGIN
                          ALTR$AA;
                          SFHWD0[0] = FIWRD0[0];
                          SFHWD0[1] = FIWRD0[1];
                        END 
                    END                                                  EXECDMP
                  P<FINF$AA> = MPATFIN[CURLEV-1] ;                       EXECDMP
                  VARIANCE(CURLEV+1) = 0; 
                END                                                      EXECDMP
              CURR$AA ;                                                  EXECDMP
              P<SFH$MP> = RECLWA - 3 ;                                   EXECDMP
            END                                                          EXECDMP
      MIPLEVA: INDXLNG = WLG(KLENG+4) ;                                  EXECDMP
          TOMPES = KPOS ; 
          TOMPLEFF = KLOC ; 
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
PROC STAT$MP (XF);
          BEGIN 
          ITEM XF, FP;
                                                                         AFB0222
 #                                                                       EXECDMP
* *   STAT$MP - SET FTFP AND FAFP AFTER ALT KEY ACTION    PAGE  1        AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC STAT$MP                                                            CY211
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SET FTFP[0] AND FAFP[0] IN THE FIT AND FIAT AFTER A             CY211
*     GET, GETNEXT, OR REWIND BY ALTERNATE KEY.                          EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THERE IS ONE PARAMETER, PASSED IN THE NORMAL WAY. THIS IS          CY211
*     0 WHEN WE ARE POSITIONED ((AT THE BEGINNING)) OF A RECORD,         CY211
*     AND NONZERO WHEN ((AT THE END)) OF A RECORD.                       CY211
*                                                                        CY211
*     MPEOK[0], A FLAG IN THE MIP PART OF THE FIAT, IS 1 IF THE          CY211
*     MIP FILE IS CURRENTLY POSITIONED AT THE LAST OR ONLY               CY211
*     PRIMARY KEY VALUE FOR THE CURRENT ALTERNATE KEY VALUE, AND         CY211
*     0 OTHERWISE.                                                       CY211
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     FTFP[0] AND FAFP[0] = 8, SYMBOLIZED AS EOK, IF WE ARE              CY211
*       POSITIONED AT THE END OF THE LAST OR ONLY PRIMARY KEY            CY211
*       VALUE ASSOCIATED WITH THE CURRENT ALTERNATE KEY VALUE,           CY211
*       I.E. IF A GETNEXT WOULD NOW PRODUCE A NEW ALTERNATE KEY          CY211
*       VALUE. OTHERWISE THEY ARE = 16, SYMBOLIZED AS EOR.               CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          IF MPEOK[0] NQ 0 AND XF NQ 0
            THEN FP = EOK ;                                              AFB0318
            ELSE FP = EOR ;                                              AFB0318
          FILPOS(FP) ;                                                   AFB0222
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
PROC MSKP$MP; 
          BEGIN 
 #                                                                       EXECDMP
* *   MSKIP - SKIP FORWARD ONE RECORD BY ALT KEY               PAGE 1    EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC MSKIP                                                              EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SKIP FORWARD ONE RECORD BY ALTERNATE KEY, DISREGARDING THE      EXECDMP
*     XFER FLAG. THAT IS, IF WE ARE ON THE LAST OR ONLY PRIMARY KEY      EXECDMP
*     BELONGING TO A CERTAIN ALTERNATE KEY VALUE, GO TO THE FIRST OR     EXECDMP
*     ONLY PRIMARY KEY BELONGING TO THE NEXT VALUE OF THAT ALTERNATE     EXECDMP
*     KEY. OTHERWISE, GO TO THE NEXT PRIMARY KEY BELONGING TO THE        EXECDMP
*     CURRENT ALTERNATE KEY VALUE.                                       EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THE CURRENT PTREE MUST SHOW US POSITIONED AT A CERTAIN RECORD      EXECDMP
*     IN A LEVEL-2 OR LEVEL-3 SUBFILE OF A MIP FILE.                     EXECDMP
*                                                                        EXECDMP
*     CURLEV = 2 OR 3, INDICATING WHICH LEVEL.                           EXECDMP
*                                                                        EXECDMP
*     RECLWA = THE LWA+1 OF THE CURRENT RECORD.                          EXECDMP
*                                                                        EXECDMP
*     IF OMEGA IS NOT 0, WE MUST BE IN A LEVEL-3 SUBBLOCK WITHIN         EXECDMP
*       THE CURRENT RECORD AT LEVEL 2. THEN OMEGA IS THE FWA OF          EXECDMP
*       THE SUBBLOCK, QQ IS THE FWA OF THE CURRENT RECORD IN THE         EXECDMP
*       SUBBLOCK, AND KEYLNGW IS THE LENGTH OF THAT RECORD IN WORDS      EXECDMP
*       (BEING THE LENGTH OF A PRIMARY KEY IN WORDS ROUNDED UP.)         EXECDMP
*                                                                        EXECDMP
*     IF OMEGA=0 AND CURLEV=3, WE ARE POSITIONED ON A LEVEL-3 RECORD     EXECDMP
*       NOT IN A SUBBLOCK, WHICH CONSISTS OF A PRIMARY KEY. THE KEY      EXECDMP
*       OF THE PARENT LEVEL-2 RECORD IS THE CORRESPONDING ALTERNATE      EXECDMP
*       KEY VALUE.                                                       EXECDMP
*                                                                        EXECDMP
*     IF OMEGA=0 AND CURLEV=2, WE ARE POSITIONED ON A LEVEL-2 RECORD     EXECDMP
*       WHOSE KEY IS THE CURRENT ALTERNATE KEY VALUE, AND THE FIRST      EXECDMP
*       PART OF THIS RECORD IS THE CURRENT PRIMARY KEY VALUE, WHICH      EXECDMP
*       IS THE FIRST OR ONLY ONE THAT GOES WITH THE ALT KEY VALUE.       EXECDMP
*       RECPTR CONTAINS, IN BITS 0-29, THE RECORD POINTER FOR THIS       EXECDMP
*       RECORD.                                                          EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     THE PTREE, CURLEV, OMEGA, AND QQ INDICATE THE NEW POSITION         EXECDMP
*       IN THE SAME WAY AS DESCRIBED ABOVE.                              EXECDMP
*                                                                        EXECDMP
*     HOWEVER, IF WE WERE ALREADY AT THE LAST OR ONLY PRIMARY KEY        EXECDMP
*       VALUE FOR THE LAST VALUE OF THIS ALTERNATE KEY, THE ONLY         EXECDMP
*       CHANGE HAS BEEN TO LEAVE US POSITIONED ON THE LAST RECORD OF     EXECDMP
*       THE LEVEL-2 SUBFILE, AND TO SET QEI FOR THE CURRENT,             CY211
*       LEVEL-2, PTREE, TO 1.                                            CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     SVK2$MP ALIAS SAVEKEY2 - TO SAVE THE NEW VALUE OF THE ALT KEY.     CY211
*                                                                        CY211
*     SVK3$MP ALIAS SAVEKEY3 - TO SAVE THE NEW VALUE OF THE              CY211
*       PRIMARY KEY.                                                     CY211
*                                                                        EXECDMP
*     UPLV$MP - TO MOVE FROM A LEVEL-3 RECORD, WHETHER IN A SUBBLOCK     EXECDMP
*       OR NOT, TO THE PARENT LEVEL-2 RECORD.                            EXECDMP
*                                                                        EXECDMP
*     DNLV$MP - TO MOVE FROM A LEVEL-2 RECORD TO THE FIRST RECORD IN     EXECDMP
*       THE SUBFILE DEPENDING ON IT, WHETHER IN A SUBBLOCK OR NOT.       EXECDMP
*                                                                        EXECDMP
*     SKPF$AA - TO MOVE AHEAD ONE RECORD IN A SUBFILE AT EITHER LEVEL,   EXECDMP
*       BUT NOT IN A SUBBLOCK.                                           EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          IF OMEGA NQ 0                                                  EXECDMP
            THEN BEGIN                                                   EXECDMP
              QQ = QQ + KEYLNGW ;                                        EXECDMP
              IF QQ LS RECLWA - 2                                        AFB0207
                THEN BEGIN                                               EXECDMP
                  SAVEKEY3 ;                                             EXECDMP
                  RETURN ;                                               EXECDMP
                END                                                      EXECDMP
                ELSE BEGIN                                               AFB0318
                  UPLV$MP ;                                              AFB0318
                  GOTO MSKIPA ;                                          AFB0318
                END                                                      AFB0318
            END                                                          EXECDMP
          IF CURLEV EQ 3                                                 EXECDMP
            THEN BEGIN                                                   EXECDMP
              IF QLR NQ 0 THEN UPLV$MP ;                                 EXECDMP
            END                                                          EXECDMP
            ELSE BEGIN                                                   EXECDMP
              IF SUBFLAG NQ 0                                            AFB0318
                THEN BEGIN                                               EXECDMP
                  P<SFH$MP> = RECLWA - 3 ;                               EXECDMP
                  IF SUBRECCT NQ 0                                       EXECDMP
                    THEN BEGIN                                           EXECDMP
                      DNLV$MP ( 1 ) ;                                    AM2A089
                      SAVEKEY3 ;                                         EXECDMP
                      RETURN ;                                           EXECDMP
                    END                                                  EXECDMP
                END                                                      EXECDMP
            END                                                          EXECDMP
                                                                         EXECDMP
     MSKIPA:                                                             AFB0318
          IF QLR EQ 0                                                    EXECDMP
            THEN BEGIN                                                   EXECDMP
              SKPF$AA ;                                                  EXECDMP
              IF CURLEV EQ 2 THEN SAVEKEY2 ;                             EXECDMP
              SAVEKEY3 ;                                                 EXECDMP
            END                                                          EXECDMP
            ELSE BEGIN                                                   AFB0222
              QEI = 1;                                                   AFB0222
            END                                                          AFB0222
                                                                         EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC POSONKD ( N ) ; BEGIN ITEM N ;                                 EXECDMP
 #                                                                       EXECDMP
* *   POSONKD - POSITION AT A KEY DEFINITION RECORD             PAGE 1   EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC POSONKD                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO POSITION ON SOME RECORD AT LEVEL 1 OF THE CURRENT MIP FILE,     EXECDMP
*     I.E. AN ALTERNATE KEY DEFINITION RECORD, CORRESPONDING TO          EXECDMP
*     FTKL[0], FTRKW[0], AND FTRKP[0] IN THE FIT.                        EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THERE IS ONE PARAMETER, PASSED IN THE NORMAL SYMPL WAY.            EXECDMP
*     THIS IS THE ADDRESS OF A KEY DEFINITION WORD, INTO WHICH FTKL[0],  CY211
*     FTRKW[0] AND FTRKP[0] ARE TO BE COPIED.                            EXECDMP
*                                                                        EXECDMP
*     P<FIT$AA> POINTS TO THE CURRENT FIT.                               EXECDMP
*                                                                        EXECDMP
*     P<FIAT$AA> POINTS TO ITS FIAT, AND P<MPAT$AA> TO THE MIP           EXECDMP
*       PART OF THE FIAT.                                                EXECDMP
*                                                                        EXECDMP
*     FTKL[0], FTRKW[0], AND FTRKP[0] IN THE FIT SPECIFY AN ALTERNATE    EXECDMP
*       KEY SPECIES THAT MUST ALREADY EXIT IN THE MIP FILE.              EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     THE THREE FIELDS FROM THE FIT HAVE BEEN COPIED INTO THE WORD       EXECDMP
*     POINTED TO BY THE INCOMING PARAMETER.                              EXECDMP
*                                                                        EXECDMP
*     IF THEY DID NOT MATCH THE CORRESPONDING FIELDS OF THE MPAKD[0]     CY211
*     WORD IN THE FIAT, I.E. THE MOST-RECENTLY-WORKED-ON KEY             CY211
*     DEFINITION, WE HAVE GONE INTO THE MIP FILE, FOUND                  CY211
*     THE MATCHING RECORD IN ITS LEVEL-1 SUB-FILE, COPIED THAT           EXECDMP
*     1-WORD RECORD (1 WORD APART FROM THE SUBFILE HEADER) INTO THE      EXECDMP
*     WORD THE INCOMING PARAMETER POINTED TO, AND ALSO INTO THE          EXECDMP
*     MPAKD[0] WORD OF THE FIAT.                                         CY211
* 
*     IF THEY DID MATCH, WE SET THE KEYDEF WORD WHOSE ADDRESS 
*     IS GIVEN BY THE PARAMETER = MPAKD[0]. THIS IS TO COMPLETE THE 
*     KEYDEF WORD WITH KEY TYPE, IN CASE IT WILL BE COPIED TO 
*     FAPOSKEY1 (SEE THE SECOND LINE OF SUBROUTINE GET$MP). 
*                                                                        CY211
*     IN ANY CASE, KRAK$MP HAS BEEN CALLED TO SET UP                     CY211
*     PKL, PKT, KEYLNGW, AKW, AKP, AKL, AKT AND AKS.                     CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     IF WE TRIED TO FIND A MATCH IN THE LEVEL-1 SUBFILE OF THE MIP      EXECDMP
*     FILE AND COULD NOT, THIS IS A NON-FATAL ERROR.                     EXECDMP
*     IT LEAVES THE FILE EFFECTIVELY REWOUND BY PRIMARY 
*     KEY, SO THAT A FOLLOWING GET-NEXT WILL AT LEAST 
*     NOT CAUSE A STRANGE ERROR.
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     STMD$AA - TO INITIALIZE ON THE MIP FILE AND SET SOME POINTERS.     EXECDMP
*       ALSO TO INITIALIZE BACK ON THE DATA FILE, IF A
*       502 ERROR OCCURS. 
*     LEVL$MP - TO GO TO THE LEVEL-1 SUBFILE.                            EXECDMP
*     WKKY$IS - TO SEEK THE MATCHING RECORD IN THE SUBFILE.              EXECDMP
*     KRAK$MP - TO CRACK IT. NOTE THAT WE CALL KRAK$MP(0) NOT            EXECDMP
*       KRAK$MP(1) BECAUSE AKC AND BB DO NOT NEED TO BE SET --           EXECDMP
*       POSONKD IS NEVER CALLED IN THE CONTEXT OF ADDING OR DELETING,    EXECDMP
*       ONLY WHEN LOOKING FOR A KNOWN KEY VALUE.                         EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     ONLY THOSE MENTIONED ABOVE UNDER ((EXIT CONDITIONS)).              CY211
*                                                                        EXECDMP
 #                                                                       EXECDMP
          STMD$AA ( 16 ) ;                                               EXECDMP
          IF FAALTPOS[0] NQ 0 THEN LEVL$MP ( 1 ) ;                       CY209
          P<KYDF$AA> = N ;                                               EXECDMP
          KDWORD[0] = 0 ;                                                EXECDMP
          KDLOC[0] = FTRKW[0] ;                                          EXECDMP
          KDPOS[0] = FTRKP[0] ;                                          EXECDMP
          KDLNG[0] = FTKL[0] ;                                           EXECDMP
          IF B<0,27>MPAKD[0] NQ KDDEFN[0]                                EXECDMP
            THEN BEGIN                                                   EXECDMP
              LEVL$MP ( 1 ) ;                                            EXECDMP
              KEYFWA = N ;                                               EXECDMP
              WKKY$IS ( 0 ) ;                                            EXECDMP
              IF QMF EQ 0                                                EXECDMP
                THEN BEGIN                                               EXECDMP
                  KDWORD[0] = 0 ;                                        EXECDMP
                  FAPOSKEY1[0] = 0 ;
                  STMD$AA ( 0 ) ; 
                  PTOF[0] = 1 ; 
                  MSGZ$AA (EC502);  #NO SUCH KEY DEFINED#                JJJ0222
                  GOTO EXIT$AA;                                          JJJ0222
                END                                                      EXECDMP
              MPAKD[0] = W[RECFWA] ;                                     EXECDMP
              MPWRD1[0] = W[RECFWA+1];                                   CIM0526
              KDWORD[0] = W[RECFWA] ;                                    EXECDMP
            END                                                          EXECDMP
            ELSE BEGIN
              KDWORD[0] = MPAKD[0] ;
            END 
          KRAK$MP ( 0 ) ;                                                EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC RPOS$MP ; BEGIN                                                EXECDMP
 #                                                                       EXECDMP
* *   RPOS$MP - RESTORE POSITION BY ALTERNATE KEY             PAGE 1     EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC RPOS$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO RESTORE THE POSITION, ACCORDING TO ALTERNATE KEY, AS IT WAS     EXECDMP
*     FOLLOWING THE MOST RECENT GET, GETNEXT, REWIND, OR SKIP, IF THAT   EXECDMP
*     WAS BY ALTERNATE KEY, AS PREPARATION FOR AN ALTERNATE KEY GETNEXT  EXECDMP
*     OR SKIP. ALSO USED IN A PECULIAR DELETE CASE. IF THE CURRENT       EXECDMP
*     RECORD, FROM A GETNEXT POINT OF VIEW, IS SPECIFIED BY ALTERNATE    EXECDMP
*     KEY, AND PRIMARY KEYS CORRESPONDING TO THIS ALTERNATE KEY ARE      EXECDMP
*     LISTED BY FIFO, AND WE ARE ABOUT TO DELETE THE CURRENT RECORD,     EXECDMP
*     RPOS$MP IS CALLED FIRST AS A CONVENIENT WAY OF MOVING TO THE       EXECDMP
*     NEXT RECORD OF THE LEVEL-3 FIFO SUBFILE, BEFORE DELETING THE       EXECDMP
*     CURRENT RECORD.                                                    EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     IF THE LAST OPERATION WAS NOT AN UPDATE OR SEEK, THE CURRENT MIP   CY211
*       PTREE SHOWS THE PROPER POSITION, AND ALL WE NEED DO IS           EXECDMP
*       GO WHERE IT POINTS.                                              EXECDMP
*                                                                        EXECDMP
*       AS A COMPLICATION, HOWEVER, SUBBLOCK POSITION IS NOT SHOWN IN    EXECDMP
*       THE PTREE, BUT BY POINTERS OMEGA AND QQ. THESE WILL HAVE BEEN    EXECDMP
*       PRESERVED, IN ROUTINE SAVEKEY3, BY SETTING MPOMEGA[0]=0 IF       EXECDMP
*       OMEGA=0 AND QQ HAS NO SIGNIFICANCE, OR ELSE MPOMEGA[0]=QQ-OMEGA. EXECDMP
*       THAT DIFFERENCE WILL ALWAYS BE GREATER THAN 0 IF WE ARE IN A     EXECDMP
*       SUBBLOCK. OMEGA CAN BE RECONSTRUCTED INDEPENDENTLY.              EXECDMP
*                                                                        EXECDMP
*     IF THE MOST RECENT OPERATION WAS AN UPDATER, WE CANNOT DEPEND      EXECDMP
*       ON THE PTREE AND MUST RESTORE OUR POSITION USING KEYS. THE       EXECDMP
*       ALTERNATE KEY VALUE HAS BEEN SAVED IN THE FIAT AREA TO WHICH     EXECDMP
*       FAPKY2ADR[0] POINTS, AND THE PRIMARY KEY -- UNLESS THE ALTERNATE EXECDMP
*       KEY SPECIES IS ONE FOR WHICH NO DUPLICATE OCCURRENCES ARE        EXECDMP
*       ALLOWED -- HAS BEEN SAVED IN THE FIAT AREA TO WHICH              EXECDMP
*       FAPKY3ADR[0] POINTS. FAPOSKEY1[0] CONTAINS THE ALTERNATE KEY     EXECDMP
*       DEFINITION, SPECIFYING WHICH LIST OF ALTERNATE KEYS THE GIVEN    EXECDMP
*       ALTERNATE KEY VAUE BELONGS TO.                                   EXECDMP
*                                                                        EXECDMP
*     THE XFER FLAG IS 0 IF THE RECORD REACHED AS ABOVE IS THE ONE       EXECDMP
*       WE WOULD LIKE TO READ NEXT. IT IS 1 IF THE RECORD NEXT AFTER     EXECDMP
*       THAT ONE IS REALLY AIMED AT.                                     EXECDMP
*                                                                        EXECDMP
*     IF, BECAUSE OF DELETIONS IN THE MEANTIME, WE CANNOT MATCH ONE      EXECDMP
*       OF THE KEYS, WE SHOULD GO TO THE NEXT FOLLOWING POSITION THAT    EXECDMP
*       REMAINS, REGARDLESS OF XFER.                                     EXECDMP
*                                                                        EXECDMP
*     P<FIT$AA> IDENTIFIES THE CURRENT DATA FILE AND MIP FILE.           EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     XFER = 0.                                                          EXECDMP
*                                                                        EXECDMP
*     IF THE RESTORED POSITION IS REALLY AFTER THE LAST OR ONLY          EXECDMP
*       PRIMARY KEY VALUE FOR THE LAST ALTERNATE KEY VALUE, THE          EXECDMP
*       QEI FLAG AT THE CURRENT LEVEL OF THE MIP PTREE = 1.              EXECDMP
*                                                                        EXECDMP
*       OTHERWISE, IF OMEGA 0, THE MIP PTREE SHOWS WHERE THE CURRENT     EXECDMP
*       RECORD IS. CURLEV MAY BE 2 OR 3. THE CURRENT PRIMARY KEY VALUE   EXECDMP
*       COMES AT THE BEGINNING OF THE RECORD.                            EXECDMP
*                                                                        EXECDMP
*       OR IF OMEGA IS NOT 0, THE MIP PTREE SHOWS WHERE THE CURRENT      EXECDMP
*       RECORD IS, AND CURLEV IS 2, BUT THE RECORD IS THE PARENT OF      EXECDMP
*       A SUBBLOCK CONTAINING PRIMARY KEY VALUES, AND QQ IS THE FWA      EXECDMP
*       OF THE CURRENT VALUE. OMEGA IS THE FWA OF THE SUBBLOCK.          EXECDMP
*                                                                        EXECDMP
*       IN EITHER OF THESE CASES, THE RECORD IS IN CORE, AND             EXECDMP
*       RECFWA, RECLWA, AND RECLG LOCATE AND DESCRIBE IT.                EXECDMP
*                                                                        EXECDMP
*     THE CURRENT VALUES OF THE ALTERNATE AND PRIMARY KEYS ARE STORED    EXECDMP
*       IN THE FIT, POINTED TO BY FAPKY2ADR[0] AND FAPKY3ADR[0]          EXECDMP
*       RESPECTIVELY. THESE WILL BE THE SAME AS THEY WERE AT ENTRY, IF   EXECDMP
*       THE WANTED RECORD IN THE DATA FILE HAD NOT BEEN DELETED, AND     EXECDMP
*       XFER WAS 0 ON ENTRY.                                             EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     FATAL ERROR IF WE HAVE TO RECOVER POSITION THE HARD WAY, AND       EXECDMP
*       CANNOT MATCH THE KEY DEFINITION IN FAPOSKEY1[0] WITH ANY OF      EXECDMP
*       THOSE IN THE LEVEL-1 SUBFILE OF THE MIP FILE.                    EXECDMP
*                                                                        EXECDMP
*     FATAL ERROR IF WE HAVE TO RECOVER POSITION THE HARD WAY, AND       EXECDMP
*       THE ALTERNATE KEY SPECIES IS ONE FOR WHICH DUPLICATE VALUES      EXECDMP
*       ARE ALLOWED, AND THE CORRESPONDING PRIMARY KEY VALUES ARE        EXECDMP
*       TO BE LISTED IN FIFO SUBFILES, AND WE FIND A MATCH FOR THE       EXECDMP
*       SAVED ALTERNATE KEY VALUE, BUT NOT FOR THE SAVED PRIMARY KEY     EXECDMP
*       VALUE.                                                           EXECDMP
*                                                                        EXECDMP
*       IF A PRIMARY KEY IS GONE, WE WANT THE NEXT ONE IN THE SAME       EXECDMP
*       LIST. WHEN THE LIST IS I-S, THAT IS THE ONE THAT OUR SEARCH      EXECDMP
*       METHOD LIGHTS ON AUTOMATICALLY, AND ALL IS WELL. BUT WHEN THE    EXECDMP
*       LIST IS FIFO, THERE IS NO WAY OF KNOWING WHERE THE NEXT ONE      EXECDMP
*       MIGHT BE. TO AVOID THE DIFFICULTY, WE TRY TO MOVE AHEAD IN THE   EXECDMP
*       FIFO LIST BEFORE DELETING, AND SAVE A PRIMARY KEY VALUE THAT     EXECDMP
*       WILL NOT TURN UP MISSING. BUT IF IT DOES TURN UP MISSING HERE    EXECDMP
*       IN RPOS$MP, EITHER THE FILE IS BAD OR OUR LOGIC IS BAD.          EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     STMD$AA - TO MAKE EVERYTHING POINT TO THE MIP FILE SPECIFIED       EXECDMP
*       BY THE CURRENT FIT.                                              EXECDMP
*     CURR$AA - TO LOCATE THE CURRENT RECORD THE EASY WAY,               CY211
*       ACCORDING TO THE PTREE.                                          CY211
*     LEVL$MP - TO MOVE TO A GIVEN LEVEL IN THE MIP FILE.                EXECDMP
*     KRAK$MP - TO SET PKL, PKT, AKL, AKT, AKS, AKW, AKP.                EXECDMP
*     WKKY$IS - TO SEARCH FOR A GIVEN KEY IN AN I-S SUBFILE.             EXECDMP
*     SVK2$MP ALIAS SAVEKEY2 - TO SAVE A NEW ALT KEY VALUE IN THE FIAT.  CY211
*     CPCH$AA - TO COMPARE THE PRIMARY KEY VALUE AT THE BEGINNING        EXECDMP
*       OF THE CURRENT LEVEL-2 RECORD (WHICH IS NOT THE KEY OF THAT      EXECDMP
*       RECORD IN ITS OWN SUBFILE) WITH THE SAVED PRIMARY KEY VALUE.     EXECDMP
*     DNLV$MP - TO MOVE FROM THE CURRENT LEVEL-2 RECORD TO THE FIRST     EXECDMP
*       RECORD IN ITS DAUGHTER SUBFILE, WHETHER THAT SUBFILE IS AT       EXECDMP
*       LEVEL 3 OR HAS THE FORM OF A SUBBLOCK.                           EXECDMP
*     GOKY$MP - TO SCAN A LEVEL-3 SUBFILE OR A SUBBLOCK, WHICH MAY BE    EXECDMP
*       I-S OR FIFO, FOR A MATCH TO A GIVEN KEY VALUE.                   EXECDMP
*     UPLV$MP - TO RETURN FROM A LEVEL-3 SUBFILE OR A SUBBLOCK TO THE    EXECDMP
*       PARENT RECORD AT LEVEL 2.                                        EXECDMP
*     SKPF$AA - TO SKIP FORWARD ONE RECORD IN A SUBFILE (WOULDNT WORK    EXECDMP
*       FOR A SUBBLOCK)                                                  EXECDMP
*     SVK3$MP ALIAS SAVEKEY3 - TO SVE THE CURRENT PRIMARY KEY VALUE,     CY211
*       AND TO SET MPOMEGA[0] SO AS TO ENABLE US TO RECONSTRUCT          CY211
*       THE CORRESPONDING VALUES OF OMEGA AND QQ IN THE FUTURE.          CY211
*     GOFI$AA ALIAS GOSTARTFILE - TO REWIND THE FILE IF                  CY211
*       FAFP[0] = FPRWMT (WOULD HAVE BEEN SET SO WHEN THE ONLY           CY211
*       RECORD IN THE FILE WAS DELETED, SINCE WHEN SOME MAY HAVE         CY211
*       BEEN ADDED.)                                                     CY211
*     MSKP$MP - TO MOVE AHEAD ONE POSITION, MIPWISE. I.E. TO THE         CY211
*       NEXT PRIMARY KEY VALUE FOR THE SAME ALT KEY VALUE, IF            CY211
*       POSSIBLE, ELSE TO THE FIRST PRIMARY KEY VALUE FOR THE            CY211
*       NEXT ALTERNATE KEY VALUE.                                        CY211
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     QMF IS A RESULT VARIABLE SET BY VARIOUS KEY-MATCHING ROUTINES.     EXECDMP
*       WE ALSO SET IT TO 1 INITIALLY HERE, TO COVER THE CASE WHEN       EXECDMP
*       WE DONT REALLY NEED TO MATCH KEYS.                               EXECDMP
*     QQ IS A VARIABLE USED CONVENTIONALLY FOR THE FWA OF THE CURRENT    EXECDMP
*       RECORD IN A SUBBLOCK.                                            EXECDMP
*     OMEGA IS SIMILARLY THE FWA OF THE CURRENT SUBBLOCK IF WE ARE       EXECDMP
*       IN ONE, AND OTHERWISE MUST BE 0 IF CURLEV=2 (SUBBLOCKS ARE       EXECDMP
*       FOUND ONLY IN LEVEL-2 RECORDS OF MIP FILES.)                     EXECDMP
*     KEYFWA IS AN INPUT TO ALL THE KEY-MATCHING ROUTINES. IT GIVES      EXECDMP
*       THE ADDRESS OF THE WORD CONTAINING THE FIRST CHARACTER OF        EXECDMP
*       THE KEY.                                                         EXECDMP
*     RECFWA IS THE FWA OF THE CURRENT RECORD, SET BY CURR$AA OR BY      EXECDMP
*       WKKY$IS. NOTE THAT WHEN WE ARE IN A SUBBLOCK, RECFWA IS          EXECDMP
*       THE FWA OF THE PARENT RECORD.                                    EXECDMP
*     QQ IS THE FWA OF THE CURRENT RECORD, IF AND ONLY IF WE ARE IN      EXECDMP
*       A SUBBLOCK -- IF AND ONLY IF OMEGA IS NOT 0.                     EXECDMP
*     PKL AND PKT ARE THE LENGTH IN CHARACTERS AND THE TYPE OF A         EXECDMP
*       PRIMARY KEY IN THE DATA FILE. HABITUALLY SET BY CALLING          EXECDMP
*       KRAK$MP.                                                         EXECDMP
*     COND IS A RESULT INDICATOR, SET BY CPCH$AA. ITS SIGN IS SET        EXECDMP
*       AS IF IT CONTAINED THE DIFFERENCE FOUND BY SUBTRACTING THE       EXECDMP
*       SECOND COMPARAND FROM THE FIRST ONE.                             EXECDMP
*     AKS IS THE FILE ORGANIZATION OF SUBFILES (LEVEL-3 SUBFILES, OR     EXECDMP
*       SUBBLOCKS INSIDE LEVEL-2 RECORDS) CONTAINING PRIMARY KEY VALUES  EXECDMP
*       FOR ALTERNATE KEY VALUES OF THE CURRENT SPECIES. SET BY          EXECDMP
*       KRAK$MP, WHENEVER THE ALTERNATE KEY DEFINITION WORD IS           EXECDMP
*       CRACKED.                                                         EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          STMD$AA ( 16 ) ;                                               EXECDMP
          IF FAALTPOS[0] NQ 0 THEN LEVL$MP ( 1 ) ;                       CY209
          QMF = 1 ; #FAKE FOR LSTO$AA#                                   EXECDMP
          IF FAALTPOS[0] EQ 0 AND FASKLAST[0] EQ 0                       EXECDMP
            THEN BEGIN                                                   EXECDMP
              CURR$AA ;                                                  EXECDMP
              IF CURLEV EQ 2 AND MPOMEGA[0] NQ 0                         EXECDMP
                THEN BEGIN                                               EXECDMP
                  P<SFH$MP> = RECLWA - 3;                                AFB0725
                  OMEGA = OMEGAVAL ;                                     EXECDMP
                  QQ = OMEGA + MPOMEGA[0] ;                              EXECDMP
                END                                                      EXECDMP
              ELSE                                                       AFB0725
                  BEGIN                                                  AFB0725
                  OMEGA = 0;                                             AFB0725
                  END                                                    AFB0725
            END                                                          EXECDMP
            ELSE BEGIN                                                   EXECDMP
              IF B<0,27>MPAKD[0] NQ FAPKDEF[0] OR CURLEV LS 2            EXECDMP
                THEN BEGIN                                               EXECDMP
                  LEVL$MP ( 1 ) ;                                        EXECDMP
                  KEYFWA = LOC(FAPOSKEY1[0]) ;                           EXECDMP
                  WKKY$IS ( 0 ) ;                                        EXECDMP
                  IF QMF EQ 0 
                  THEN
                      BEGIN 
                      IMPOSSIBLE(BADPOS1); #TURN OFF AAM 2.N# 
                      END 
                  MPAKD[0] = W[RECFWA] ;                                 EXECDMP
                END                                                      EXECDMP
              LEVL$MP ( 2 ) ;                                            EXECDMP
              OMEGA = 0 ;                                                EXECDMP
              KRAK$MP ( 0 ) ;                                            EXECDMP
              KEYFWA = FAPKY2ADR[0] ;                                    EXECDMP
              IF FAFP[0] EQ FPRWMT                                       CY211
                THEN BEGIN                                               GETNR
                  QMF = 0 ;                                              GETNR
                  GOSTARTFILE ;                                          GETNR
                END                                                      GETNR
                ELSE WKKY$IS ( 0 ) ;                                     GETNR
              IF QMF EQ 0                                                EXECDMP
               THEN BEGIN                                                EXECDMP
                 IF QEI EQ 0 THEN SAVEKEY2 ;                             EXECDMP
               END                                                       EXECDMP
               ELSE BEGIN                                                EXECDMP
                IF AKS NQ FO"UNIQUE"                                     EXECDMP
                 THEN BEGIN                                              EXECDMP
                  QMF = 0 ;                                              EXECDMP
                  KEYFWA = FAPKY3ADR[0] ;                                EXECDMP
                  CPCH$AA ( KEYFWA , 0 , RECFWA , 0 ,PKL , PKT ) ;       EXECDMP
                  IF COND EQ 0                                           EXECDMP
                    THEN QMF = 1 ;                                       EXECDMP
                    ELSE BEGIN                                           EXECDMP
                      IF COND GR 0                                       EXECDMP
                        THEN BEGIN #KEY GREATER THAN RECORD#             EXECDMP
                          IF SUBFLAG NQ 0                                EXECDMP
                            THEN BEGIN                                   EXECDMP
                              DNLV$MP ( 0 ) ;                            AM2A089
                              GOKY$MP ( 0 ) ;                            EXECDMP
                              IF QMF EQ 0                                EXECDMP
                                THEN BEGIN                               EXECDMP
                                  IF AKS EQ FO"FIFO"
                                  THEN
                                      BEGIN 
                                      IMPOSSIBLE(BADPOS3);
                                      END 
                                  IF QEI NQ 0                            EXECDMP
                                   OR ( OMEGA NQ 0 AND QQ GQ RECLWA-2 )  EXECDMP
                                  THEN                                   CY211
                                      BEGIN                              CY211
                                      UPLV$MP;                           CY211
                                      GOTO RPOSA;                        CY211
                                      END                                CY211
                                END                                      EXECDMP
                            END                                          EXECDMP
                          ELSE                                           CY211
                              BEGIN                                      CY211
              RPOSA:          SKPF$AA;                                   CY211
                              IF QEI EQ 0                                CY211
                              THEN                                       CY211
                                  BEGIN                                  CY211
                                  SVK2$MP;                               CY211
                                  END                                    CY211
                            END                                          EXECDMP
                        END                                              EXECDMP
                    END                                                  EXECDMP
                 END                                                     EXECDMP
                END                                                      EXECDMP
            END                                                          EXECDMP
                                                                         EXECDMP
          IF QEI EQ 0                                                    EXECDMP
            THEN BEGIN                                                   EXECDMP
              IF QMF NQ 0                                                EXECDMP
              THEN
                  BEGIN 
                  IF XFER NQ 0
                  THEN
                      BEGIN 
                      MSKP$MP;
                      END 
                  END 
              ELSE
                  BEGIN 
                  SVK3$MP;
                  END 
            END                                                          EXECDMP
          XFER = 0;                                                      EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC RWIN$MP ; BEGIN                                                EXECDMP
 #                                                                       EXECDMP
* *   RWIN$MP - REWIND A FILE BY ALTERNATE KEY               PAGE 1      EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC RWIN$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO REWIND THE CURRENT FILE BY ALTERNATE KEY, I.E. TO SET           EXECDMP
*     UP TABLES SO THAT IF THE NEXT POSITIONING OPERATION ON THE         EXECDMP
*     FILE IS A GETNEXT, IT WILL GET THE RECORD WITH THE LOWEST          EXECDMP
*     VALUE OF THAT ALTERNATE KEY.                                       EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     P<FIT$AA> POINTS TO THE CURRENT FIT.                               EXECDMP
*     P<FIAT$AA> POINTS TO THE ASSOCIATED FIAT.                          EXECDMP
*     P<MPAT$AA> POINTS TO THE MIP SECTION OF THE FIAT.                  EXECDMP
*                                                                        EXECDMP
*     FTKL[0], FTRKW[0], AND FTRKP[0] IN THE FIT DEFINE A SPECIES OF     EXECDMP
*     ALTERNATE KEY THAT MUST EXIST. BUT NO KEY VALUE NEEDS TO BE        EXECDMP
*     SPECIFIED.                                                         EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     THE CURRENT POSITION IS THE FIRST RECORD OF THE LEVEL-2 SUBFILE    EXECDMP
*     THAT DEPENDS ON THE LEVEL-1 RECORD, IN THE MIP FILE, THAT          EXECDMP
*     CONTAINS THE SAME ALTERNATE KEY DEFINITION AS FTKL[0],             EXECDMP
*     FTRKW[0], AND FTRKP[0].                                            EXECDMP
*                                                                        EXECDMP
*     THE KEY DEFINITION HAS BEEN STORED IN FAPOSKEY1[0].                EXECDMP
*     THE ALTERNATE KEY VALUE HAS BEEN STORED WHERE FAPOSKY2ADR[0]       EXECDMP
*     POINTS. IF DUPLICATE VALUES OF THE ALTERNATE KEY ARE POSSIBLE,     EXECDMP
*     THE FIRST ASSOCIATED VALUE OF THE PRIMARY KEY IS STORED WHERE      EXECDMP
*     FAPOSKY3ADR[0] POINTS.                                             EXECDMP
*                                                                        EXECDMP
*     CURLEV = 2 AND MPOMEGA[0] = 0 INDICATE THE POSITION IN THE LEVEL-2 EXECDMP
*     SUBFILE.                                                           EXECDMP
*                                                                        EXECDMP
*     IF THE LEVEL-2 SUBFILE IS EMPTY, HOWEVER, THE QEI FLAG IN THE      EXECDMP
*     PTREE WILL BE 1, INDICATING EOI.                                   EXECDMP
*                                                                        EXECDMP
*     IF SUCH AN EOI, FAFP[0] IN THE FIAT WILL BE FPRWMT = 63.           CY211
*     OTHERWISE 0.                                                       CY211
*                                                                        EXECDMP
*     THE XFER FLAG IS 0.                                                EXECDMP
*                                                                        EXECDMP
*     FTFP[0] IN THE FIT = 0 (FPNULL).                                   CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     POSONKD - TO POSITION IN THE MIP FILE ACCORDING TO THE ALTERNATE   EXECDMP
*       DEFINITION, AND SET MPAKD[0]. IF THIS CHANGES MPAKD[0], THEN     EXECDMP
*       KRAK$MP IS CALLED AGAIN TO GET THE RIGHT VALUES OF AKL ETC.      EXECDMP
*     LEVL$MP - TO MOVE TO THE LEVEL-2 SUBFILE CONTAINING ALL THE        EXECDMP
*       VALUES OF THIS ALTERNATE KEY.                                    EXECDMP
*     GOFI$AA - TO POSITION ON THE FIRST RECORD OF THAT SUBFILE.         EXECDMP
*     SVK2$MP ALIAS SAVEKEY2 - TO SAVE THE FIRST ALT KEY VALUE WHERE     CY211
*       FAPOSKY2ADR[0] POINTS.                                           EXECDMP
*     SVK3$MP ALIAS SAVEKEY3-TO SAVE,IF DUPLICATE VALUES OF THE ALT KEY  CY211
*       ARE ALLOWED, THE FIRST PRIMARY KEY VALUE FOR THIS ALTERNATE      EXECDMP
*       KEY VALUE, WHERE FAPOSKY3ADR[0] POINTS.                          EXECDMP
*     STAT$MP - TO SET FTFP[0] AND FAFP[0].                              CY211
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          POSONKD ( LOC(FAPOSKEY1[0]) ) ;                                EXECDMP
          LEVL$MP ( 2 ) ;                                                EXECDMP
          GOSTARTFILE ;                                                  EXECDMP
          IF QEI NQ 0                                                    GETNR
            THEN BEGIN  #EMPTY FILE#                                     GETNR
              FAFP[0] = FPRWMT;                                          CY211
              FTFP[0] = FPNULL ;                                         GETNR
              RETURN ;                                                   GETNR
            END                                                          GETNR
          SAVEKEY2 ;                                                     EXECDMP
          OMEGA = 0 ;                                                    EXECDMP
          SAVEKEY3 ;                                                     EXECDMP
          XFER = 0 ;                                                     EXECDMP
          STAT$MP (0);
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
PROC SVK2$MP; 
          BEGIN 
 #                                                                       EXECDMP
* *   SVK2$MP - SAVE THE ALTERNATE KEY VALUE              PAGE  1        AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC SVK2$MP                                                            CY211
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SAVE THE CURRENT ALTERNATE KEY VALUE IN THE FIAT, AS PART OF    EXECDMP
*     THE CURRENT POSITION INFORMATION.                                  EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THE CURRENT RECORD IS A RECORD IN A LEVEL-2 SUBFILE OF THE MIP     EXECDMP
*     FILE. RECFWA CONTAINS ITS FWA, AND KLOC AND KPOS IN THE NORMAL     EXECDMP
*     WAY LOCATE ITS PRIMARY KEY. THIS KEY IS AN ALTERNATE KEY VALUE     EXECDMP
*     FROM THE ASSOCIATED DATA FILE.                                     EXECDMP
*                                                                        EXECDMP
*     AKL IS USED FOR CONVENIENCE AS THE KEY LENGTH IN CHARACTERS.       EXECDMP
*     KLENG COULD ALSO BE USED HERE. AKL WAS SET THE LAST TIME           EXECDMP
*     KRAK$MP WAS CALLED.                                                EXECDMP
*                                                                        EXECDMP
*     P<FIAT$AA> POINTS TO THE CURRENT FIAT.                             EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     THE KEY HAS BEEN STORED IN THE FIAT AREA POINTED TO BY             EXECDMP
*     FAPKY2ADR[0].                                                      EXECDMP
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     MOVC$AA - TO COPY THE KEY AS A CHARACTER STRING.                   EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          MOVC$AA ( RECFWA+KLOC,KPOS,FAPKY2ADR[0],0,AKL ) ;              EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
PROC SVK3$MP; 
          BEGIN 
 #                                                                       EXECDMP
* *   SVK3$MP - SAVE PRIMARY KEY VALUE FOR MIP POSITION       PAGE  1    AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC SVK3$MP                                                            CY211
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SAVE IN A FIAT AREA THE CURRENT PRIMARY KEY VALUE AS AN         EXECDMP
*     ADJUNCT TO THE CURRENT ALTERNATE KEY VALUE. ALSO TO SAVE A VALUE   EXECDMP
*     IN THE MPOMEGA[0] FIELD OF THE FIAT -- 0 IF OMEGA = 0, OR          EXECDMP
*     QQ-OMEGA (NEVER 0) OTHERWISE. EVEN THOUGH THE FILE IS NOT ALTERED  EXECDMP
*     BETWEEN TWO USER CALLS CONCERNING IT, OMEGA AND QQ MIGHT GET       EXECDMP
*     ALTERED BY AN INTERVENING ACTION ON ANOTHER FILE. THIS SAVE IS NOT EXECDMP
*     NECESSARY IF THE ALTERNATE KEY IS ONE FOR WHICH DUPLICATES         EXECDMP
*     ARE NOT ALLOWED, BECAUSE IN THAT CASE IT IS POSSIBLE, GIVEN        EXECDMP
*     THE ALTERNATE KEY VALUE, TO LOOK UP THE PRIMARY KEY VALUE          EXECDMP
*     UNAMBIGUOUSLY IN THE MIP FILE.                                     EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     THE CURRENT RECORD CONTAINS THE WANTED PRIMARY KEY VALUE,          EXECDMP
*     BEGINNING AT ITS FIRST CHARACTER.                                  EXECDMP
*                                                                        EXECDMP
*     IF OMEGA = 0, WE ARE IN A LEVEL-3 SUBFILE THAT IS NOT A            EXECDMP
*     SUBBLOCK, AND RECFWA IS THE FWA OF THE CURRENT RECORD.             EXECDMP
*     OR WE MAY BE IN A LEVEL-2 SUBFILE, EVERY RECORD OF WHICH ALSO      EXECDMP
*     BEGINS WITH A PRIMARY KEY VALUE, WHICH IS THE ONE                  EXECDMP
*     TO BE SAVED.                                                       EXECDMP
*                                                                        EXECDMP
*     IF OMEGA IS NOT 0, WE ARE IN A LEVEL-3 SUBFILE THAT CONSISTS       EXECDMP
*     OF A SUBBLOCK, AND QQ IS THE FWA OF THE CURRENT RECORD.            EXECDMP
*                                                                        EXECDMP
*     KEYLNGW IS THE NUMBER OF WORDS NEEDED TO CONTAIN A PRIMARY KEY     EXECDMP
*     OF THE DATA FILE, SO IT IS THE NUMBER OF WORDS WE NEED TO COPY.    EXECDMP
*                                                                        EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     IF AKS SHOWS THAT DUPLICATE ALTERNATE KEYS ARE POSSIBLE, THE       EXECDMP
*     PRIMARY KEY VALUE HAS BEEN STORED IN THE AREA FAPOSKEY3[0]         EXECDMP
*     POINTS TO, IN THE FIAT.                                            EXECDMP
*     ALSO, MPOMEGA[0] HAS BEEN SET SO AS TO MAKE IT POSSIBLE TO         EXECDMP
*     RESTORE POSITION IN A SUBBLOCK LATER, IF THE FILE REMAINS          EXECDMP
*     UNALTERED IN THE MEANTIME.                                         EXECDMP
*                                                                        EXECDMP
*     IF DUPLICATE ALTERNATE KEYS ARE NOT POSSIBLE, MPOMEGA[0] HAS       EXECDMP
*     BEEN ZEROED TO PREVENT TRYING TO GO INTO A SUBBLOCK LATER, IF      EXECDMP
*     THE FILE HAS REMAINED UNALTERED IN THE MEANTIME.                   EXECDMP
*                                                                        CY211
*     MPEOK[0], A FLAG IN THE MIP PART OF THE FIAT, HAS BEEN SET TO 1    CY211
*       IF THIS IS THE LAST OR ONLY PRIMARY KEY VALUE FOR THE CURRENT    CY211
*       ALTERNATE KEY VALUE, AND OTHERWISE TO 0.                         CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     MOVW$AA - TO COPY THE KEY. AS IT BEGINS ON A WORD BOUNDARY,        EXECDMP
*       AND A LITTLE GARBAGE IN THE LAST WORD CANNOT HURT, WE USE        EXECDMP
*       THE WORD-MOVER FOR SPEED.                                        EXECDMP
*     EOKS$MP - A FUNCTION THAT IS 1 IF WE ARE ON THE LAST OR ONLY       CY211
*       PRIMARY KEY VALUE FOR THE CURRENT ALTERNATE KEY VALUE, AND       CY211
*       OTHERWISE 0.                                                     CY211
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     X IS USED FOR SCRATCH                                              EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
              IF OMEGA EQ 0                                              EXECDMP
                THEN BEGIN                                               EXECDMP
                  X = RECFWA ;                                           EXECDMP
                  MPOMEGA[0] = 0 ;                                       EXECDMP
                END                                                      EXECDMP
                ELSE BEGIN                                               EXECDMP
                  X = QQ ;                                               EXECDMP
                  MPOMEGA[0] = QQ - OMEGA ;                              EXECDMP
                END                                                      EXECDMP
              MOVW$AA ( X , KEYLNGW , FAPKY3ADR[0] ) ;                   EXECDMP
              MPEOK[0] = EOKS$MP; 
          END                                                            EXECDMP
                                                                         EXECDMP
                                                                         EXECDMP
CONTROL EJECT;                                                           JJJ0209
PROC SCSB$MP; 
          BEGIN 
 #                                                                       EXECDMP
* *   SCSB$MP - SEARCH A IS SUBBLOCK BY KEY      PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC SCSB$MP                                                            CY211
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SEARCH AN I-S SUB-BLOCK FOR THE RECORD THAT MATCHES A GIVEN     EXECDMP
*     KEY, OR THE NEXT HIGHER IF NO MATCH.                               EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     KEYFWA IS THE FWA OF THE GIVEN KEY, WHICH BEGINS AT THE            EXECDMP
*       FIRST CHARACTER.                                                 EXECDMP
*     PKL AND PKT ARE THE LENGTH IN CHARACTERS AND THE TYPE OF THIS      EXECDMP
*       KEY, AND OF KEYS IN THE CURRENT SUBBLOCK, BECAUSE THEY REPRESENT EXECDMP
*       PRIMARY KEY VALUES IN THE ORIGINAL DATA FILE.                    EXECDMP
*     OMEGA IS THE FWA OF THE SUBBLOCK, AND THE ADDRESS OF ITS           EXECDMP
*       HEADER WORD. OBSERVE THAT HERE WE DO NOT USE RECLWA OF THE       EXECDMP
*       PARENT RECORD TO INDICATE THE END OF THE SUBBLOCK, BUT RELY ON   EXECDMP
*       THE INTERNAL RECORD COUNT GIVEN IN ITS HEADER WORD.              EXECDMP
*     KEYLNGW IS THE LENGTH IN WORDS OF A RECORD IN THE SUBBLOCK,        EXECDMP
*       BECAUSE IT IS THE NUMBER OF WORDS NEEDED TO CONTAIN A PRIMARY    EXECDMP
*       KEY FROM THE ORIGINAL DATA FILE.                                 EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     QMF = 0 IF NO MATCH, OR 1 IF A MATCH.                              EXECDMP
*                                                                        EXECDMP
*     QQ IS THE FWA OF THE MATCHING RECORD, IF QMF=1, OR THE FWA OF      EXECDMP
*       THE RECORD WITH THE NEXT HIGHER KEY, OR THE LWA+1 OF THE LAST    EXECDMP
*       RECORD IN THE SUBBLOCK IF THE GIVEN KEY IS HIGHER THAN ALL.      EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     CPCH$AA - TO DO THE KEY COMPARISONS                                EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     I, J, AND K ARE USED FOR SCRATCH.                                  EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          I = 0 ;                                                        EXECDMP
          FOR J = SUBBLOCRC1+1 WHILE J GR I+1                            EXECDMP
            DO BEGIN                                                     EXECDMP
              K = ( I+J ) / 2 ;                                          EXECDMP
              QQ = OMEGA + 1 + (K-1) * KEYLNGW ;                         EXECDMP
              CPCH$AA ( KEYFWA,0,QQ,0,PKL,PKT ) ;                        EXECDMP
              IF COND EQ 0                                               EXECDMP
                THEN BEGIN                                               EXECDMP
                  QMF = 1 ;                                              EXECDMP
                  RETURN ;                                               EXECDMP
                END                                                      EXECDMP
              IF COND GR 0                                               EXECDMP
                THEN I = K ;                                             EXECDMP
                ELSE J = K ;                                             EXECDMP
            END                                                          EXECDMP
          QMF = 0 ;                                                      EXECDMP
          QQ = OMEGA + 1 + ( J-1 ) * KEYLNGW ;                           EXECDMP
          END                                                            EXECDMP
CONTROL EJECT;                                                           JJJ0209
     PROC UPLV$MP ; BEGIN                                                EXECDMP
 #                                                                       EXECDMP
* *   UPLV$MP - RISE FROM LEVEL 3 TO LEVEL 2                    PAGE 1   EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC UPLV$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO RETURN FROM A LEVEL-3 SUBFILE IN A MIP FILE TO THE PARENT       EXECDMP
*     RECORD IN A LEVEL-2 SUBFILE. LEVL$MP(2) COULD HANDLE IT IF         EXECDMP
*     THE LEVEL-2 SUBFILE WERE NEVER A SUBBLOCK.                         EXECDMP
*                                                                        EXECDMP
* DC  ENTRY CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     CURLEV = 3 IF WE ARE IN A LEVEL-3 SUBFILE THAT IS NOT A            EXECDMP
*       SUBBLOCK, BUT HAS ONE OR MORE BLOCKS OF ITS OWN.                 EXECDMP
*     CURLEV = 2 IF WE ARE IN A LEVEL-3 SUBFILE THAT IS A MERE           EXECDMP
*       SUBBLOCK, EMBEDDED IN ITS PARENT RECORD.                         EXECDMP
*                                                                        EXECDMP
* DC  EXIT CONDITIONS                                                    EXECDMP
*                                                                        EXECDMP
*     OMEGA = 0 TO INDICATE THAT WE ARE NOT IN A SUBBLOCK IN ANY CASE.   EXECDMP
*                                                                        EXECDMP
*     WE ARE NOW POSITIONED ON THE PARENT RECORD OF THE LEVEL-2          EXECDMP
*       SUBFILE. RECFWA, RECLWA, AND RECLG ARE CORRECT FOR THAT          EXECDMP
*       RECORD.                                                          EXECDMP
*                                                                        EXECDMP
*     NOTE THAT IF WE HAVE JUST RETURNED FROM A SUBBLOCK, THE            EXECDMP
*       CORRECTNESS OF RECFWA, RECLWA, AND RECLG DEPENDS ON THEIR        EXECDMP
*       BEING LEFT UNCHANGED BY LOOKS AT THE SUBBLOCK, OR PROPERLY       EXECDMP
*       MODIFIED IF THE SUBBLOCK WAS ALTERED.                            EXECDMP
*                                                                        EXECDMP
*     P<FINF$AA> POINTS TO THE FINF OF THE LEVEL-2 SUBFILE               EXECDMP
*                                                                        EXECDMP
*     INDXLNG GIVES THE LENGTH IN WORDS THAT AN INDEX RECORD IN          EXECDMP
*       THAT SUBFILE MUST HAVE, I.E. A RECORD CONTAINING A VALUE         EXECDMP
*       OF THE CURRENT ALTERNATE KEY, PLUS A 24-BIT BLOCK NUMBER.        EXECDMP
*                                                                        CY211
*     TOMPLEFF AND TOMPES HAVE BEEN SET TO THE NUMBER OF WORDS AND       CY211
*       THE NUMBER OF CHARACTERS DISTANCE BETWEEN THE START OF A         CY211
*       DATA RECORD (I.E. NOT AN INDEX RECORD) IN THE LEVEL-2            CY211
*       SUBFILE THAT IS NOW CURRENT, AND THE START OF ITS                CY211
*       PRIMARY KEY.                                                     CY211
*                                                                        EXECDMP
* DC  ERROR CONDITIONS                                                   EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     LEVL$MP - TO DO THE WORK IF WE WERE NOT IN A SUBBLOCK.             EXECDMP
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
*                                                                        EXECDMP
 #                                                                       EXECDMP
          IF CURLEV EQ 3                                                 EXECDMP
            THEN LEVL$MP ( 2 ) ;                                         EXECDMP
            ELSE BEGIN                                                   EXECDMP
              OMEGA = 0 ;                                                EXECDMP
              P<FINF$AA> = MPATFIN[1] ;                                  EXECDMP
              INDXLNG = WLG(KLENG+4) ;                                   EXECDMP
              TOMPES = KPOS ; 
              TOMPLEFF = KLOC ; 
            END                                                          EXECDMP
          END                                                            EXECDMP
                                                                         EXECDMP
     END   TERM                                                          EXECDMP
