*DECK,MWSADMP 
*CALL COMUSETXT 
USETEXT AAMMIPB ; 
PROC MWSA$MP; 
      BEGIN 
      XREF
          BEGIN 
          PROC  CPCH$AA;
          PROC  FILP$AA;
          PROC  MOVW$AA;
          PROC MSGZ$AA; 
          LABEL EXIT$AA;
          PROC  MSKP$MP;
          PROC  SKPF$AA;
          PROC  SVK2$MP;
          PROC  TRN1$IS;
          PROC SVK3$MP; 
          FUNC PKCT$MP; 
          END 
      XDEF
          BEGIN 
          PROC  PSIX$MP;
          PROC  SKIX$MP;
          END 
          ITEM DD , EE , GG ; #VARIABLES FOR INDEX-ONLY ROUTINES#        EXECDMP
          ITEM I , J , X , Y;  #SCRATCH VARIABLES#
CONTROL EJECT;
PROC PSIX$MP;                                                            REORG1 
          BEGIN                                                          REORG1 
 #                                                                       CY211
* *   PSIX$MP - HAS THE INDEX-ONLY OP REACHED ITS TERMINUS       PAGE  1 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC PSIX$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO DECIDE WHETHER THE CURRENT INDEX-ONLY GETNEXT OR SKIP           CY211
*     HAS REACHED ITS TERMINAL POINT, WHICH MAY BE EOI OR                CY211
*     A GIVEN KEY VALUE.                                                 CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     IF FTKA[0] = 0 THEN THERE IS NO GIVEN KEY VALUE.                   CY211
*                                                                        CY211
*     OTHERWISE, KEYFWA AND KEYOFF ARE THE FWA AND CHARACTER             CY211
*       POSITION OF THE GIVEN KEY VALUE, COLLATED IF NECESSARY.          CY211
*                                                                        CY211
*     FAPKYADR2[0] POINTS TO THE AREA IN THE FIAT WHERE THE              CY211
*       CURRENT ALTERNATE KEY VALUE IS SAVED.                            CY211
*                                                                        CY211
*     P<FIT$AA>, P<FIAT$AA>, P<PTRE$AA> MUST POINT TO THE                CY211
*       PROPER FIT, FIAT, AND PTREE. THE PTREE WILL BE FOR A             CY211
*       LEVEL-2 SUBFILE OF A MIPFILE. THE QEI FLAG IN THIS               CY211
*       PTREE WILL BE 1 IF WE HAVE REACHED EOI ALREADY,                  CY211
*       OTHERWISE 0.                                                     CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     QMF = 0 IF WE HAVE NOT REACHED THE GOAL.                           CY211
*                                                                        CY211
*     QMF = 1 IF WE HAVE REACHED THE GOAL.                               CY211
*     (1) AT EOI IS ALWAYS THE GOAL. IT IS THE ONLY POSSIBLE             CY211
*     WAY IF FTKA[0]=0 AND THERE IS NO KEY.                              CY211
*     (2) IF FTREL=REL"GT", THE GOAL IS REACHED WHEN THE                 CY211
*     CURRENT ALTERNATE KEY VALUE IS GREATER THAN THE ONE                CY211
*     KEYFWA POINTS TO.                                                  CY211
*     (3) OTHERWISE, THE GOAL IS REACHED WHEN THE CURRENT                CY211
*     ALTERNATE KEY VALUE IS EQUAL TO OR GREATER THAN THE                CY211
*     ONE KEYFWA POINTS TO.                                              CY211
*                                                                        CY211
*     QNE = 0 IF THE CURRENT ALTERNATE KEY VALUE IS EQUAL                CY211
*     TO THE ONE KEYFWA POINTS TO. OTHERWISE QNE = 1.                    CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     CPCH$AA - TO COMPARE KEY VALUES.                                   CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     COND, IN WHICH CPCH$AA RETURNS RESULTS.                            CY211
*                                                                        CY211
 #                                                                       CY211
          QNE = 1 ;                                                      AFB0318
          IF QEI NQ 0                                                    AFB0318
            THEN QMF = 1 ;                                               AFB0318
            ELSE BEGIN                                                   AFB0318
              IF FTKA[0] EQ 0                                            AFB0318
                THEN QMF = 0 ;                                           AFB0318
                ELSE BEGIN                                               AFB0318
                  CPCH$AA ( KEYFWA,KEYOFF,FAPKY2ADR[0],0,MAJKEY,AKT ) ;  AFB0318
                  IF COND LS 0                                           AFB0318
                    THEN QMF = 1 ;                                       AFB0318
                    ELSE BEGIN                                           AFB0318
                      IF COND EQ 0                                       AFB0318
                        THEN BEGIN                                       AFB0318
                          QNE = 0 ;                                      AFB0318
                          IF FTREL EQ REL"LE" OR FTREL EQ REL"LT" OR     CY210
                          FTREL EQ REL"NE"                               CY210
                          THEN                                           CY210
                            BEGIN                                        CY210
                            MSGZ$AA( EC551 ) ;   #REL VALUE INVALID#     CY210
                            GOTO EXIT$AA ;                               CY210
                            END                                          CY210
                          IF FTREL[0] EQ REL"GT"                         AFB0318
                            THEN QMF = 0 ;                               AFB0318
                            ELSE QMF = 1 ;                               AFB0318
                        END                                              AFB0318
                        ELSE QMF = 0 ; #COND GR 0#                       AFB0318
                    END                                                  AFB0318
                END                                                      AFB0318
            END                                                          AFB0318
          END                                                            AFB0318
CONTROL EJECT;
PROC SKIX$MP;                                                            REORG1 
          BEGIN                                                          AFB0318
 #                                                                       CY211
* *   SKIX$MP - SKIP ON VALUE IN INDEX-ONLY MODE       PAGE   1          AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC SKIX$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO SKIP IN A MIP FILE FROM ONE ALTERNATE KEY VALUE                 CY211
*     TO THE NEXT ONE, ADDING TO FTRL[0] THE NUMBER OF                   CY211
*     PRIMARY KEY VALUES ASSOCIATED WITH THE FORMER                      CY211
*     ALTERNATE KEY VALUE.                                               CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     WE ARE CURRENTLY POSITIONED ON A RECORD IN A LEVEL-2               CY211
*     SUBFILE OF A MIP FILE.                                             CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     THE PRIMARY KEY COUNT FOR THE STARTING ALTERNATE KEY               CY211
*     VALUE HAS BEEN ADDED TO FTRL[0]. THEN A SKIP TO THE                CY211
*     NEXT ALTERNATE KEY VALUE HAS BEEN ATTEMPTED. IF WE WERE            CY211
*     NOT ALREADY ON THE LAST VALUE IN THE SUBFILE, QEI IN               CY211
*     THE PTREE = 0, AND THE NEW ALTERNATE KEY VALUE HAS BEEN            CY211
*     STORED IN THE FIAT AREA TO WHICH FAPKY2ADR[0] POINTS.              CY211
*                                                                        CY211
*     BUT IF WE WERE ALREADY ON THE LAST RECORD, QEI = 1 AND THE PTREE   CY211
*     SHOWS US STILL POSITIONED ON THE SAME ALTERNATE KEY                CY211
*     VALUE.                                                             CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     PKCT$MP - THE FUNCTION EQUAL TO THE NUMBER OF                      CY211
*       PRIMARY KEY VALUES ASSOCIATED WITH THE CURRENT                   CY211
*       ALTERNATE KEY VALUE.                                             CY211
*     SKPF$AA - THE ROUTINE FOR SKIPPING FORWARD ONE                     CY211
*       RECORD IN ANY FILE OR SUBFILE.                                   CY211
*     SVK2$MP - THE ROUTINE FOR SAVING THE CURRENT                       CY211
*       ALTERNATE KEY VALUE IN THE AREA OF THE FIAT TO                   CY211
*       WHICH FAPKY2ADR[0] POINTS.                                       CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
 #                                                                       CY211
          FTRL = FTRL + PKCT$MP;
          SKPF$AA;                                                       AFB0318
          SVK2$MP;
          END                                                            AFB0318
CONTROL EJECT;
 #                                                                       CY211
* *   MWSA$MP - COPY PRIMARY KEY LIST TO WSA     PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC MWSA$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO COPY PRIMARY KEY VALUES FROM THE CURRENT POSITION IN A          CY211
*     MIP FILE UNTIL A TERMINAL POSITION IS REACHED, OR THE SPACE,       CY211
*     WHOSE LENGTH IS GIVEN IN FTMRL[0] IS EXHAUSTED.                    CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     FTWSA[0] IS THE FWA OF THE AREA INTO WHICH KEY VALUES ARE          CY211
*       TO BE COPIED, AND FTMRL[0] IS ITS LENGTH IN CHARACTERS.          CY211
*                                                                        CY211
*     WE ARE CURRENTLY POSITIONED ON A LEVEL-2 OR LEVEL-3 RECORD         CY211
*       OF A MIP FILE.                                                   CY211
*                                                                        CY211
*     IF ON A LEVEL-3 RECORD, IT CONTAINS THE FIRST PRIMARY KEY          CY211
*       VALUE IN THE WANTED SERIES.                                      CY211
*     IF ON A LEVEL-2 RECORD, AND OMEGA=0, THE LEVEL-2 RECORD            CY211
*       CONTAINS THE FIRST PRIMARY KEY VALUE IN THE WANTED SERIES,       CY211
*       WHICH IS THE FIRST OR ONLY ONE FOR THE CURRENT ALTERNATE         CY211
*       KEY VALUE.                                                       CY211
*     IF ON A LEVEL-2 RECORD AND OMEGA IS NOT 0, QQ IS THE FWA           CY211
*       OF THE MINOR RECORD IN THE SUBBLOCK, CONTAINING THE              CY211
*       FIRST PRIMARY KEY VALUE IN THE WANTED SERIES.                    CY211
*                                                                        CY211
*     THE CURRENT RECORD MUST ALREADY BE IN CORE, AND RECFWA             CY211
*       AND RECLWA MUST LOCATE IT.                                       CY211
*     RNO IS THE NUMBER OF THE CURRENT RECORD, WITHIN ITS BLOCK.         CY211
*     PKL AND PKT ARE THE LENGTH IN CHARACTERS AND THE TYPE OF THESE     CY211
*       PRIMARY KEY VALUES.                                              CY211
*     KEYLNGW IS THE NUMBER OF WORDS NEEDED FOR A KEY, I.E.              CY211
*       (PKL+9)/10.                                                      CY211
*     FTCOP[0] TELLS WHAT THE CURRENT OPERATION IS -- IN PRACTICE        CY211
*       A GET OR GETNEXT.                                                CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     FTFP[0] AND FAFP[0] ARE 0 IF WE STOPPED BECAUSE THE FTWSA[0]       CY211
*       AREA WAS EXHAUSTED. THE PTREE AND FIAT ARE SET UP TO ALLOW       CY211
*       CONVENIENT RESUMPTION OF THE COPYING (BY A GETNEXT.)             CY211
*     FTFP[0] AND FAFP[0] ARE EOI (100B) IF WE STOPPED BECAUSE OF        CY211
*       REACHING EOI IN THE LEVEL-2 SUBFILE.                             CY211
*     FTFP[0] AND FAFP[0] ARE EOK (10B) IF WE STOPPED BECAUSE OF         CY211
*       REACHING THE NEXT ALTERNATE KEY VALUE, IF A GET, OR THE          CY211
*       TERMINAL ALTERNATE KEY VALUE, IF A GETNEXT. IF FTREL IS          CY211
*       ((GE)), QNE IS 0 IF WE STOPPED AT AN EQUAL KEY, OR 1 IF          CY211
*       THERE WAS NO EQUAL KEY, AND WE STOPPED AT THE LOWEST             CY211
*       HIGHER KEY. FTRC[0] IS THE NUMBER OF PRIMARY KEY VALUES          CY211
*       ASSOCIATED WITH THE ALTERNATE KEY VALUE AT WHICH WE              CY211
*       STOPPED -- THESE PRIMARY KEY VALUES HAVE NOT BEEN COPIED.        CY211
*                                                                        CY211
*     FTPTL[0] HAS BEEN INCREASED BY THE TOTAL NUMBER OF PRIMARY         CY211
*       KEYS COPIED.                                                     CY211
*     THE PRIMARY KEY VALUES HAVE BEEN COPIED SO AS EACH TO BEGIN        CY211
*       ON A WORD BOUNDARY. FOR SYMBOLIC KEYS, BLANK FILLER              CY211
*       CHARACTERS ARE USED, OTHERWISE BINARY ZERO FILLER.               CY211
*       SYMBOLIC KEYS HAVE BEEN DECOLLATED.                              CY211
*                                                                        CY211
*     THE ENDING POSITION HAS BEEN SAVED BY SVK2$MP AND SVK3$MP, WHICH   CY211
*       WILL HAVE BEEN CALLED BY MSKP$MP.                                CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     MOVW$AA - TO MOVE KEYS TO THE FTWSA[0] AREA.                       CY211
*     TRN1$IS - TO DECOLLATE THEM IN PLACE.                              CY211
*     MSKP$MP - TO MOVE AHEAD BY ONE PRIMARY KEY, AND THEN SAVE          CY211
*       THE ALTERNATE AND PRIMARY KEY VALUES BY CALLING SVK2$MP          CY211
*       AND SVK3$MP. THIS SUBROUTINE IS THE CHEAPEST WAY OF              CY211
*       MOVING FROM THE END OF A SERIES OF PRIMARY KEYS TO THE           CY211
*       START OF THE NEXT SERIES OF PRIMARY KEYS, AND THE SAVING         CY211
*       OF KEYS AFTERWARDS IS A BONUS. SO EVERY TIME WE HAVE             CY211
*       CALLED MOVW$AA TO MOVE A GROUP OF KEYS, WE ADVANCE RNO AND       CY211
*       PTCUREC[CURPTR], OR QQ, TO POINT TO THE LAST OF THEM             CY211
*       INSTEAD OF THE LAST+1, AND THEN CALL MSKP$MP TO DO THE           CY211
*       REST.                                                            CY211
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0].                 CY211
*     PSIX$MP - IN CASE OF A GETNEXT, TO DETERMINE WHETHER A             CY211
*       NEW ALTERNATE KEY VALUE IS THE TERMINAL ONE.                     CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     NONE EXCEPT THOSE MENTIONED ABOVE. STRICTLY SPEAKING,              CY211
*       DD ETC. ARE LOCAL, THOUGH LISTED A COUPLE OF PAGES               CY211
*       BACK, BECAUSE MWSA$MP IS THE MAIN PROGRAM OF THIS                CY211
*       MODULE.                                                          CY211
*                                                                        CY211
 #                                                                       CY211
CONTROL EJECT;                                                           CY211
#         START OF MWSA$MP CODE # 
          BEGIN 
          QNE = 1 ;                                                      AFB0318
          XFER = 0 ;                                                     AFB0318
          FTPTL[0] = 0 ;                                                 AFB0318
          DD = FTMRL[0] / ( 10 * KEYLNGW ) ;                             AFB0318
          IF DD EQ 0
          THEN
              BEGIN 
              MSGZ$AA(EC142); #WSA TOO SMALL# 
              GOTO EXIT$AA; 
              END 
          EE = FTWSA[0] ;                                                AFB0318
          IF FTCOP[0] EQ OP"GTN" THEN GOTO MWSAF ;
     MWSAD:                                                              AFB0318
          IF OMEGA NQ 0                                                  AFB0318
            THEN BEGIN                                                   AFB0318
              X = QQ ;                                                   AFB0318
              GG = ( RECLWA - 2 - QQ ) / KEYLNGW ;                       AFB0318
            END                                                          AFB0318
            ELSE BEGIN                                                   AFB0318
              X = RECFWA ;                                               AFB0318
              IF CURLEV EQ 3                                             AFB0318
                THEN GG = RC-RNO+1 ;                                     AFB0318
                ELSE GG = 1 ;                                            AFB0318
            END                                                          AFB0318
          IF DD LS GG THEN GG = DD ;                                     AFB0318
          Y = GG * KEYLNGW ;                                             AFB0318
          MOVW$AA ( X , Y , EE ) ;                                       AFB0318
          IF PKT EQ KT"SYMBOLIC"                                         AFB0603
          THEN                                                           AFB0603
            BEGIN            #MUST DECOLLATE THE SYMBOLIC KEYS#          AFB0603
            TRN1$IS (EE,0,(Y*10),LOC(FSCODITAB));                        JJJ0604
            END                                                          AFB0603
          DD = DD - GG ;                                                 AFB0318
          FTPTL[0] = FTPTL[0] + GG ;                                     AFB0318
          EE = EE + Y ;                                                  AFB0318
          IF OMEGA NQ 0                                                  AFB0318
            THEN QQ = QQ + ( GG-1 ) * KEYLNGW ;                          AFB0318
            ELSE BEGIN                                                   AFB0318
              RNO = RNO + ( GG - 1 ) ;                                   AFB0318
              PTCUREC[CURPTR] = RNO ;                                    AFB0318
              IF RNO EQ RC AND FWD EQ 0 THEN QLR = 1 ;                   AFB0318
            END                                                          AFB0318
          MSKP$MP;
                                                                         AFB0318
     MWSAF: 
          IF QEI NQ 0                                                    AFB0318
            THEN BEGIN                                                   AFB0318
              FILPOS(EOI) ;                                              AFB0318
            END                                                          AFB0318
            ELSE BEGIN                                                   AFB0318
              IF CURLEV EQ 2 AND OMEGA EQ 0                              AFB0318
                THEN BEGIN                                               AFB0318
                  IF FTCOP[0] EQ OP"GET"                                 AFB0318
                  THEN                                                   REORG1 
                      BEGIN                                              REORG1 
                      QMF = 1;                                           REORG1 
                      END                                                REORG1 
                  ELSE                                                   REORG1 
                      BEGIN                                              REORG1 
                      PSIX$MP;                                           REORG1 
                      END                                                REORG1 
                END                                                      AFB0318
                ELSE QMF = 0 ;                                           AFB0318
              IF QMF NQ 0                                                AFB0318
                THEN BEGIN                                               AFB0318
                  FILPOS(EOK) ;                                          AFB0318
                  FTRC = PKCT$MP; 
                END                                                      AFB0318
                ELSE BEGIN                                               AFB0318
                  IF DD NQ 0                                             AFB0318
                    THEN GOTO MWSAD ; #CONTINUE LOOP#                    AFB0318
                    ELSE BEGIN                                           AFB0318
                      FILPOS(FPNULL) ; #TOO LITTLE SPACE#                AFB0318
                    END                                                  AFB0318
                END                                                      AFB0318
            END                                                          AFB0318
                                                                         AFB0318
              J = PKL - ( PKL / 10 * 10 ) ;                              AFB0318
              IF J NQ 0                                                  AFB0318
                THEN BEGIN                                               AFB0318
                  DD = 1 ;                                               AFB0318
                  FOR J = J+1 STEP 1 UNTIL 10                            AFB0318
                      DO                                                 AFB0318
                      BEGIN                                              AFB0318
                      DD = DD * 64 ;                                     AFB0318
                      END                                                AFB0318
                  DD = DD - 1 ;                                          AFB0318
                  X = -DD ;                                              AFB0318
                  DD = DD LAN "          " ;                             AFB0318
                  J = KEYLNGW ;                                          AFB0318
                  FOR I = FTWSA[0]+KEYLNGW-1 STEP J UNTIL EE-1           AFB0318
                    DO W[I] = W[I] LAN X LOR DD ;                        AFB0318
                END                                                      AFB0318
          END                                                            AFB0318
      END 
      TERM
