*DECK SEEKDIS 
*CALL COMUSETXT 
PROC SEEK$IS; 
      BEGIN 
      XREF
          BEGIN 
          LABEL EXIT$AA;
          PROC  BACK$AA;
          PROC  CPCH$AA;
          PROC  CURR$AA;
          PROC  EZKY$IS;
          PROC  FILP$AA;
          PROC  GETN$IS;
          PROC  GOFI$AA;
          PROC  GOKY$IS;
          PROC  GTNR$MP;
          PROC  KPTR$IS;
          PROC  MOVC$AA;
          PROC  MSGZ$AA;
          PROC MSGF$AA; 
          PROC  OPOS$IS;
          PROC  POST$IS;
          FUNC QUMP$AA; 
          PROC  RDRC$AA;
          PROC  SEBL$AA;
          PROC  SEEK$MP;
          PROC  SKIP$MP;
          PROC  SKPF$AA;
          PROC PKA$MP ; 
          END 
  
CONTROL WEAK GTNR$MP,SEEK$MP,SKIP$MP,PKA$MP ; 
  
      XDEF
          BEGIN 
          FUNC CEEK$IS; 
          PROC GTNR$IS; 
          PROC SKIP$IS; 
          END 
      ITEM T1;                     #TEMP STORAGE# 
CONTROL EJECT;
     FUNC ARRIVED ; BEGIN                                                JJJ1116
 #                                                                       CY211
* *   ARRIVED - IS THIS THE LAST GETNR           PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC ARRIVED                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     AS A SYMPL FUNCTION, TO RETURN A VALUE OF 1 IF THE DATA            CY211
*     BLOCK IS NOW COMPLETELY IN CORE, AND OTHERWISE 0.                  CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     P<PTRE$AA> LOCATES THE PTREE FOR THE FILE FOR WHICH WE             CY211
*     ARE CONCERNED.                                                     CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     NOTHING BUT THE FUNCTION -- SEE ABOVE.                             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                                                               CY211
*                                                                        CY211
 #                                                                       CY211
          IF CURPTR EQ NLEV AND PTBLKIN[CURPTR] NQ 0                     JJJ1116
            THEN ARRIVED = 1 ;                                           JJJ1116
            ELSE ARRIVED = 0 ;                                           JJJ1116
          END                                                            JJJ1116
CONTROL EJECT;                                                           ISISMOD
FUNC CEEK$IS ;                                                           AFB0214
          BEGIN                                                          ISISMOD
                                                                         JJJ0907
 #                                                                       JJJ0907
* *   CEEK$IS - ARE WE IN MIDST OF SEEK ON THIS KEY     PAGE  1          AM2A077
* *   A.F.R.BROWN                                                        JJJ0907
* 1DC CEEK$IS                                                            JJJ1116
*                                                                        JJJ0907
* DC  FUNCTION                                                           JJJ0907
*                                                                        JJJ0907
*     BEFORE CALLING A SUBROUTINE THAT WILL LOCATE A RECORD OR POSITION  JJJ0907
*     BY KEY, TO SEE WHETHER THE PREVIOUS OPERATION WAS A SEEK BY THE    JJJ0907
*     SAME KEY, AND WHETHER THE PTREE HAS BEEN UNDISTURBED SINCE THEN,   JJJ0907
*     I.E. WHETHER WE CAN BEGIN SEARCHING FROM THE CURRENT LEVEL OF THE  JJJ0907
*     PTREE, OR MUST GO BACK TO THE PRIMARY INDEX.                       JJJ0907
*                                                                        JJJ0907
*     SIKH$IS IS CODED AS A FUNCTION, AND RETURNS IN X6, AS THE VALUE    JJJ0907
*     OF THE FUNCTION IN SYMPL, A 0 IN THE FAVORABLE CASE AND A NON-     JJJ0907
*     ZERO IN THE UNFAVORABLE CASE. IN GENERAL THE SIGNIFICANCE IS       JJJ0907
*     THAT IF SIKH$IS EQ 0, GOKY$IS MAY BE CALLED, BUT OTHERWISE,        JJJ0907
*     EZKY$IS MUST BE CALLED.                                            JJJ0907
*                                                                        JJJ1116
*     BECAUSE NOT ALL JOBS USE THE SEEK FUNCTION, WE WANT TO SEPARATE    JJJ1116
*     OUT AS MUCH SEEK CODE AS POSSIBLE. SO THE BODY OF SIKH$IS HAS BEEN JJJ1116
*     TAKEN OUT AND NAMED CEEK$IS, AND ONLY THE SHORT RESIDUE OF         JJJ1116
*     SIKH$IS NEEDS TO BE PERPETUALLY IN THE BASIC I-S OVERLAY.          JJJ1116
*                                                                        JJJ0907
* DC  ENTRY CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     1. KEYFWA, KEYOFF, QREL AND MAJKEY MUST BE CORRECTLY SET.          CY211
*        FOR THEIR SIGNIFICANCES,                                        JJJ1116
*        REFER TO THE ENTRY CONDITIONS OF EZKY$IS.                       JJJ0907
*                                                                        JJJ0907
*     2. IF THE PRECEDING OPERATION WAS A SEEK, THE                      CY211
*        FASEEKEY1 WORD OF THE FIAT MUST REMAIN AS IT WAS CORRECTLY      JJJ0907
*        SET BY THAT SEEK.                                               JJJ0907
*                                                                        JJJ0907
* DC  EXIT CONDITIONS                                                    JJJ0907
*                                                                        JJJ0907
*     AS EXPLAINED ABOVE UNDER ((FUNCTION)), A 0 OR 1 IS RETURNED IN     JJJ0907
*     X6, AS THE VALUE OF THE SYMPL FUNCTION, TO INDICATE GOOD OR BAD    JJJ0907
*     RESPECTIVELY.                                                      JJJ0907
*                                                                        JJJ0907
* DC  ERROR CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     NONE                                                               CY211
*                                                                        JJJ0907
* DC  CALLED ROUTINES                                                    JJJ0907
*                                                                        JJJ0907
*     CPCH$AA -- TO COMPARE TWO KEYS                                     JJJ0907
*                                                                        JJJ0907
* DC  NON-LOCAL VARIABLES                                                JJJ0907
*                                                                        JJJ0907
*     COND IS DESTROYED.                                                 JJJ0907
*                                                                        JJJ0907
 #                                                                       JJJ0907
                                                                         JJJ0907
CONTROL EJECT;                                                           JJJ0907
          COND = 1 ;                                                     AFB0214
          IF SEEKMODE EQ 0 AND FAALTPOS[0] EQ 0 AND PREVOP EQ OP"SEK"    GETNR
           AND MAJKEY EQ SEEKLENG                                        AFB0517
            THEN BEGIN                                                   AFB0214
              CPCH$AA ( KEYFWA,KEYOFF,FASKY3ADR[0],0,MAJKEY,KTYPE ) ;    AFB0214
            END                                                          AFB0214
          CEEK$IS = COND ;                                               AFB0214
          END                                                            AFB0214
CONTROL EJECT;
PROC AMBLE;                                                              AFB0517
          BEGIN                                                          AFB0517
 #                                                                       CY211
* *   AMBLE - SET KEYOFF,MAJKEY,QREL TO USUAL VALUES    PAGE  1          AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC AMBLE                                                              CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO SET KEYOFF, MAJKEY, AND QREL TO THEIR COMMONEST VALUES          CY211
*     AS A PRELIMINARY TO SETTING KEYFWA TO POINT TO THE KEY AND         CY211
*     THEN CALLING EZKY$IS OR GOKY$IS.                                   CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     PRESUMABLY P<PTRE$AA> LOCATES THE PTREE FOR THE FILE IN            CY211
*     QUESTION, OR SUBFILE, AND P<FSTT$AA> LOCATES THE FSTT OF           CY211
*     THE FILE, OR OF THE PARENT FILE AT LEVEL 1 IF THIS IS A            CY211
*     SUB-FILE IN A MIP FILE.                                            CY211
*                                                                        CY211
*     P<FINF$AA> MUST BE SET TO THE RIGHT FILE OR SUB-FILE               CY211
*     DESCRIPTOR, SO THAT KLENG WILL BE CORRECT.                         CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     SEE UNDER FUNCTION ABOVE.                                          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                                                               CY211
*                                                                        CY211
 #                                                                       CY211
          KEYOFF = 0 ;                                                   ISISIS 
          MAJKEY = KLENG ;                                               ISISIS 
          QREL = REL"EQ" ;                                               ISISIS 
          END                                                            ISISIS 
CONTROL EJECT;
PROC GTNR$IS;                                                            JJJ0523
          BEGIN                                                          JJJ0523
 #                                                                       CY211
* *   GTNR$IS - DO A GETNEXT WITHOUT RECALL      PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC GTNR$IS                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO DO AS MUCH OF A GETNEXT, WHETHER BY PRIMARY OR BY ALTERNATE     CY211
*     KEY, AS CAN BE DONE WITHOUT WAITING FOR COMPLETION OF AN I/O.      CY211
*     OR TO CONTINUE A PREVIOUS GTNR$IS ON THE SAME FILE. WHEN THE       CY211
*     WANTED RECORD IS ACTUALLY IN CORE, TO DO, EFFECTIVELY, A GET-      CY211
*     NEXT AND CHANGE THE CURRENT-OP CODE IN THE FIT TO GET-NEXT.        CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     ESSENTIALLY THE SAME AS FOR SUBROUTINE GETN$IS.                    CY211
*     IN ORDER FOR THIS CALL TO GTNR$IS TO CONTINUE A                    CY211
*     PRECEDING ONE, RATHER THAN STARTING FROM SCRATCH, IT MUST          CY211
*     FIND THAT FAALTPOS[0]=0,MEANING THE FILE HAS NOT BEEN              CY211
*     ALTERED SINCE THE LAST TIME AN OPERATION WAS DONE THROUGH          CY211
*     THE CURRENT FIT, AND THE CODE FOR LAST OPERATION MUST              CY211
*     SHOW THAT IT WAS ALSO A GETNEXT-WITHOUT-RECALL.                    CY211
*                                                                        CY211
*     IF THE CURRENT FILE POSITION IS BY ALTERNATE KEY, THEN AN          CY211
*     IMPORTANT RECORD OF PROGRESS MADE BY EACH OF A SERIES OF           CY211
*     CALLS TO GTNR$IS IS MPSKSTG[0], A FIELD IN THE MIP PART OF         CY211
*     THE FIAT. ITS PROGRESSIVE VALUES ARE --                            CY211
*     0 - WE ARE STILL SEEKING THE CURRENT VALUE OF THE ALTERNATE        CY211
*       KEY IN THE MIP FILE.                                             CY211
*     1 - WE HAVE FOUND THAT, BUT IT WAS AT THE END OF ITS BLOCK,        CY211
*       AND WE ARE WAITING FOR THE SUCCESSOR BLOCK TO BE READ            CY211
*       IN ORDER TO GET THE NEXT ALTERNATE KEY VALUE.                    CY211
*     2 - WE HAVE FOUND THE CURRENT ALTERNATE KEY VALUE. IT HAD          CY211
*       MORE THAN ONE PRIMARY KEY VALUE LISTED UNDER IT, AND WE          CY211
*       ARE SEEKING THE CURRENT ONE IN ITS SUB-FILE.                     CY211
*     1 AGAIN - HAVING FOUND THE CURRENT PRIMARY KEY VALUE BLOCK,        CY211
*       WE HAVE TO SKIP TO A NEW BLOCK TO GET THE NEXT ONE, AND          CY211
*       THIS INVOLVES AN I/O. THE CASE IS DISTINGUISHABLE FROM           CY211
*       THE EARLIER 1, BECAUSE WE ARE AT A DIFFERENT LEVEL OF            CY211
*       THE MIP FILE.                                                    CY211
*     7 - WE HAVE THE WANTED VALUE OF THE PRIMARY KEY, AND ARE           CY211
*       SEEKING IT IN THE DATA FILE FOR THE FIRST TIME.                  CY211
*     9 - CONTINUING TO SEEK IT IN THE DATA FILE.                        CY211
*                                                                        CY211
*     THE VALUE 8 ALSO OCCURS IN THIS SERIES, MEANING WE ARE             CY211
*     ALREADY AT EOI. BUT IT DOESNT STAY AROUND LONG ENOUGH TO           CY211
*     BE AN ENTRY CONDITION.                                             CY211
*                                                                        CY211
*     THE VALUE 100 ALSO OCCURS. THIS IS AN EXCEPTIONAL SIGNAL           CY211
*     FROM GTNR$MP TO GTNR$IS THAT THE CURRENT ALTERNATE KEY SPECIES     CY211
*     IS DEFINED AS HAVING PRIMARY KEY VALUES LISTED BENEATH IT IN       CY211
*     FIFO SUBFILES. THEN THERE IS NO POINT IN TRYING TO OVERLAP         CY211
*     AND SAVE TIME, SO GTNR$IS WILL TURN THE WHOLE THING INTO A         CY211
*     STRAIGHT GETNEXT RIGHT AWAY.                                       CY211
*                                                                        CY211
*     WHEN FAFP[0]=FPRWMT (63) ON ENTRY IT MEANS THE FILE WAS            CY211
*     EMPTY WHEN POSITION WAS LAST ESTABLISHED, SO IT IS                 CY211
*     LOGICALLY REWOUND BUT KEY VALUES ARE NOT INCLUDED IN THE           CY211
*     POSITION INFORMATION. IN THIS CASE WE PUSH THROUGH WITHOUT         CY211
*     TRYING TO OVERLAP ANYTHING. CHANGE THE OP CODE IN THE FIT          CY211
*     TO GETNEXT, AND CALL GETN$IS TO DO IT, WHETHER BY PRIMARY          CY211
*     OR BY ALTERNATE KEY.                                               CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     IF THE GETNEXT IS NOT COMPLETE, FTFP[0] AND FAFP[0] ARE 0          CY211
*     AND THE OPERATION CODE IN THE FIT IS STILL GETNEXT-WITHOUT-        CY211
*     RECALL.                                                            CY211
*                                                                        CY211
*     IF NOT COMPLETE, AND POSITION IS BY ALTERNATE KEY,                 CY211
*     MPSKSTG[0] WILL HAVE BEEN UPDATED.                                 CY211
*                                                                        CY211
*     IF NOT COMPLETE, AND POSITION IS BY PRIMARY KEY, AND IS            CY211
*     AT THE LAST RECORD OF A BLOCK, AND WE ARE NOW WAITING FOR          CY211
*     THE NEXT BLOCK TO BE READ, THE PTREE IS ALTERED TO SHOW            CY211
*     THE POSITION AS BEING AT RECORD NUMBER 0 OF THE NEXT               CY211
*     BLOCK. EVEN IF THE GETNEXT-WITHOUT-RECALL WERE NOT                 CY211
*     REPEATED, THIS SETTING OF THE PTREE WOULD NOT HURT ANYTHING.       CY211
*     FOR IF THE NEXT THING WERE AN UPDATE, THE PTREE SETTING            CY211
*     WOULD BECOME VALUELESS. IF IT WERE A GET, THE PTREE SETTING        CY211
*     WOULD BE SUPERSEDED. IF IT WERE A GETNEXT OR SKIP, THE             CY211
*     SETTING TO RECORD 0 OF ONE BLOCK WILL FUNCTION JUST THE            CY211
*     SAME AS A SETTING TO THE LAST RECORD OF THE PRECEDING              CY211
*     BLOCK.                                                             CY211
*                                                                        AM2A088
*     FASKLAST IS 1 IF THE PTREE HAS BEEN LEFT IN SUCH A STATE THAT      AM2A088
*     IT DOES NOT CONVENIENTLY DEFINE THE CURRENT POSITION IN THE FILE,  AM2A088
*     SO THAT A FOLLOWING GET-NEXT OR SKIP WILL HAVE TO RECOVER POSI-    AM2A088
*     TION BY KEY. FASKLAST IS RESET TO 0 WHEN THE PTREE  HAS BEEN MADE  AM2A088
*     TO CORRESPOND TO THE KEY VALUE.                                    AM2A088
*                                                                        CY211
*     IF THE ACTION IS COMPLETE, THE OPERATION CODE AT FTCOP[0]          CY211
*     AND FTPOP[0] HAS BEEN CHANGED TO GETNEXT. THE EXIT CONDITIONS      CY211
*     ARE THEN THE SAME AS IN SUBROUTINE GETN$IS, WHICH IN TURN          CY211
*     ARE THE SAME AS FOR GET$IS. WE ALSO ADD ONE TO THE COUNT           GAG1103
*     OF GETNEXTS IN THE FSTT.                                           GAG1103
*                                                                        CY211
*     FSGTNRCNT[0] IN THE FSTT HAS BEEN INCREASED BY 1.                  CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     EC100, NON-FATAL, IF THE FILE WAS POSITIONED AT EOI WHEN WE        CY211
*     ENTER GTNR$IS.                                                     CY211
*                                                                        CY211
*     EC564, FATAL, IF THE POSITION IS BY ALTERNATE KEY, THE NEXT        CY211
*     PRIMARY KEY VALUE IS FOUND IN THE MIP FILE, AND NO RECORD          CY211
*     WITH THAT PRIMARY KEY VALUE IS FOUND IN THE DATA FILE.             CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     OPOS$IS - TO POSITION THE FILE AT THE BEGINNING OR EOI, IF         CY211
*     PTOF[0] IS NOT 0, AND TO CLEAR PTOF[0]. THIS FIELD MAY BE SET AT   CY211
*     OPEN TIME TO DECLARE THAT THE FILE IS LOGICALLY AT A POSITION,     CY211
*     WITHOUT ACTUALLY DOING THE I/O THAT WOULD NORMALLY BE INVOLVED     CY211
*     IN SETTING THINGS UP ACCORDINGLY.                                  CY211
*                                                                        CY211
*     GETN$IS - TO DO ALL THE WORK OF A GETNEXT, IF WE DECIDE TO TURN    CY211
*     THE OPERATION INTO A GETNEXT WITHOUT ANY FURTHER ATTEMPTS TO       CY211
*     OVERLAP.                                                           CY211
*                                                                        CY211
*     AMBLE - TO SET KEYOFF=0, MAJKEY=KLENG AND QREL=REL"EQ" BEFORE      CY211
*     CALLING EZKY$IS OR GOKY$IS.                                        CY211
*                                                                        CY211
*     EZKY$IS - TO LOCATE A RECORD BY KEY IN AN I-S FILE, WHICH MAY      CY211
*     BE THE DATA FILE OR A MIP SUB-FILE.                                CY211
*                                                                        CY211
*     GOKY$IS - TO CONTINUE A PROCESS OF LOCATING A RECORD BY KEY,       CY211
*     BEGUN BY A CALL TO EZKY$IS BUT NOT YET COMPLETED.                  CY211
*                                                                        CY211
*     THE PARAMETER IS NEGATIVE WHEN EZKY$IS OR GOKY$IS IS CALLED,       CY211
*     INDICATING THAT IF THE SUBROUTINE HAS TO INITIATE THE READING      CY211
*     OF A BLOCK, THIS SHOULD BE WITHOUT RECALL, AND THE SUBROUTINE      CY211
*     SHOULD THEN EXIT. ( -1 ) HAS NO SPECIAL MEANING BEYOND THIS.       CY211
*     ( -3 ) MEANS THAT GOKY$IS SHOULD NOT CALL IT A FATAL ERROR         CY211
*     WHEN THE KEY IS FOUND TO BE TOO LOW FOR THE FIRST RECORD OF        CY211
*     THE CURRENT BLOCK, AND THE CURRENT BLOCK IS NOT THE PRIMARY        CY211
*     INDEX BLOCK. NORMALLY, THE WAY WE GO DOWN THE TREE OF AN           CY211
*     INDEXED FILE MAKES THAT SITUATION ((IMPOSSIBLE)). HERE IT          CY211
*     CAN HAPPEN, THOUGH. WE REACH THE OLD CURRENT RECORD, TO            CY211
*     WHICH THE PTREE POINTS, BUT IT IS THE LAST IN ITS BLOCK, AND       CY211
*     THE NEXT BLOCK IS NOT IN CORE. SO WE ALTER THE PTREE WORD TO       CY211
*     RECORD 0 OF THE NEXT BLOCK, START A READ WITHOUT RECALL OF         CY211
*     THE NEXT BLOCK, AND EXIT FROM GTNR$IS. ON THE NEXT TRIP            CY211
*     THROUGH GTNR$IS, GOKY$IS(-3) IS CALLED. IT FINDS ITSELF            CY211
*     ALREADY AT THE DATA BLOCK LEVEL OF THE PTREE, AND FINDS THE        CY211
*     CURRENT BLOCK, WHICH IS REALLY THE ((NEXT)) BLOCK, TO BE           CY211
*     ALREADY IN CORE. SO IT MATCHES THE STORED PRIMARY KEY              CY211
*     VALUE (OLD) WITH THE CURRENT BLOCK (NEW) AND FINDS THE             CY211
*     KEY TO BE TOO LOW. HOWEVER, IN THIS ONE CASE, THAT IS              CY211
*     FINE AND JUST MEANS THAT THE FIRST LIVE RECORD OF THE              CY211
*     CURRENT BLOCK IS TO BECOME CURRENT IN ALL SENSES.                  CY211
*                                                                        CY211
*     ARRIVED - A FUNCTION FOR DECIDING WHETHER THE BLOCK                CY211
*     CONTAINING THE WANTED RECORD IS NOW READY IN CORE.                 CY211
*                                                                        CY211
*     CURR$AA - TO SET RECFWA AND VARIOUS OTHER POINTERS                 CY211
*     ACCORDING TO THE CURRENT WORD OF THE PTREE.                        CY211
*                                                                        CY211
*     CPCH$AA - TO COMPARE TWO KEY VALUES.                               CY211
*                                                                        CY211
*     SEBL$AA - TO LOCATE THE BLOCK TO WHICH A GIVEN WORD OF             CY211
*     THE PTREE POINTS. THIS IS USED TO GET THE NEXT BLOCK,              CY211
*     WITHOUT RECALL, WHEN THE CURRENT POSITION WAS BY PRIMARY           CY211
*     KEY AND WAS AT THE END OF THE BLOCK. IT IS THE ACTION              CY211
*     THAT LEADS TO THE NECESSITY OF CALLING GOKY$IS WITH THE            CY211
*     SPECIAL PARAMETER OF ( -3 ).                                       CY211
*                                                                        CY211
*     SKPF$AA - TO SKIP FORWARD TO THE NEXT LIVE RECORD. THIS            CY211
*     IS ALWAYS EITHER FROM THE CURRENT RECORD TO THE NEXT               CY211
*     LIVE ONE, WITHIN THE SAME BLOCK, OR ELSE FROM RECORD 0             CY211
*     TO THE FIRST LIVE ONE, ALSO WITHIN A BLOCK.                        CY211
*                                                                        CY211
*     GTNR$MP - TO DO MOST OF THE WORK OF GTNR$IS, WHEN THE              CY211
*     CURRENT POSITION IS BY ALTERNATE KEY.                              CY211
*                                                                        CY211
*     RDRC$AA - TO COPY THE RECORD TO THE USER AREA, IF THE              CY211
*     OPERATION HAS COMPLETED, AND TO RETURN ONE OR TWO KEY VALUES       CY211
*     IF CALLED FOR.                                                     CY211
*                                                                        CY211
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0], AND TO SAVE     CY211
*     THE PRIMARY KEY VALUE AS POSITION INFORMATION IF WE HAVE MOVED     CY211
*     TO A NEW ONE.                                                      CY211
* 
*     PKA$MP - TO RETURN THE PRIMARY KEY VALUE TO THE CALLER, IF
*     THE OPERATION IS BY ALTERNATE KEY AND PKA IS NOT 0. 
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     KEYFWA IS USED AS AN INPUT FOR GOKY$IS, EZKY$IS, AND PKA$MP.
*                                                                        CY211
*     COND IS USED BY GTNR$MP AS A RESULT VARIABLE. AS GTNR$MP HAS       CY211
*     TO CHECK FIELD MPSKSTG[0] OF THE FIAT SEVERAL TIMES, IT COPIES     CY211
*     IT INTO COND THE FIRST TIME, TO SPEED UP THE SUBSEQUENT LOOKS,     CY211
*     AND WE SEE IT THERE ON RETURN FROM GTNR$MP.                        CY211
*                                                                        CY211
*     (COND IS USED BY SEVERAL SUBROUTINES TO RETURN A RESULT.           CY211
*     CPCH$AA IS BY FAR THE MOST IMPORTANT USER, BUT NEED NOT BE         CY211
*     THE ONLY ONE. AS LONG AS COND IS LOOKED AT, TO DETERMINE WHAT      CY211
*     TO DO NEXT, IMMEDIATELY ON RETURN FROM THE SUBROUTINE THAT         CY211
*     SET IT, AND BEFORE ANYTHING ELSE IS CALLED. HERE IT HAPPENS        CY211
*     WE CALL AMBLE AND BREAK THE RULE, BUT AMBLE IS NEARBY              CY211
*     AND CAN BE SEEN TO BE HARMLESS.)                                   CY211
*                                                                        CY211
*     COND IS ALSO SET HERE AS A RESULT BY CPCH$AA .                     CY211
*                                                                        CY211
*     RNO IS THE NUMBER OF THE CURRENT RECORD IN ITS BLOCK, SET BY       CY211
*     CURR$AA .                                                          CY211
*                                                                        CY211
*     QMF IS A RESULT VARIABLE SET BY EZKY$IS OR GOKY$IS WHEN IT         CY211
*     COMPLETES, TO 1 IF A MATCHING RECORD IS FOUND, AND 0 IF NOT.       CY211
*                                                                        CY211
 #                                                                       CY211
          IF PTOF NQ 0                                                   AFB1208
          THEN                                                           AFB1208
              BEGIN                                                      AFB1208
              OPOS$IS;       #DO OPEN POSITIONING#                       AFB1208
              END                                                        AFB1208
          IF FAFP[0] EQ EOI                                              GETNR
            THEN BEGIN                                                   GETNR
              FTFP[0] = EOI ;                                            GETNR
              MSGZ$AA(EC100); 
              GOTO EXIT$AA;                                              GETNR
                                                                         GETNR
            END                                                          GETNR
          IF FAFP[0] EQ 63                                               GETNR
            THEN BEGIN                                                   GETNR
ISSEKNJ:                                                                 CY211
              FTCOP = OP"GTN";                                           GETNR
              FTPOP = OP"GTN";                                           GETNR
              GETN$IS;                                                   GETNR
              RETURN ;                                                   GETNR
            END                                                          GETNR
          CONTROL IFEQ STATS,1 ;
          FSGTNRCNT = FSGTNRCNT + 1 ;  # INCREMENT GETNR COUNT #
          CONTROL ENDIF ; 
          IF FAPOSKEY1[0] NQ 0                                           JJJ1116
            THEN BEGIN                                                   JJJ1116
              GTNR$MP;                                                   JJJ0523
              IF COND EQ 100   THEN  GOTO ISSEKNJ;  #DO WITH RECALL#     CY211
              IF  COND LQ 6 THEN GOTO ISSEKNA ;                          GETNR
              IF COND EQ 8 THEN GOTO ISSEKND ;                           GETNR
              KEYFWA = FAPKY3ADR[0];                                     GETNR
              AMBLE ;                                                    AFB0517
              IF COND EQ 7                                               GETNR
                THEN BEGIN                                               GETNR
                  MPSKSTG[0] = 9 ;                                       GETNR
                  EZKY$IS ( -1 ) ;                                       GETNR
                END                                                      GETNR
                ELSE BEGIN                                               GETNR
                  GOKY$IS ( -1 ) ;                                       CY210
                END                                                      GETNR
              IF ARRIVED EQ 0                                            GETNR
                THEN GOTO ISSEKNA ;                                      GETNR
                ELSE BEGIN                                               GETNR
                  IF QMF NQ 0 
                   THEN BEGIN 
                     PKA$MP ; 
                     GOTO ISSEKNH ; 
                   END
                  ELSE
                      BEGIN 
                      FSRUINFLG[0] = TRUE ; 
                      MSGF$AA(EC546); 
                      GOTO EXIT$AA; 
                      END 
                END                                                      GETNR
            END                                                          JJJ1116
          IF FAALTPOS[0] EQ 0 AND PREVOP EQ OP"GTN" 
           AND ARRIVED NQ 0 
            THEN BEGIN
              SEBL$AA ( CURPTR , 1 ) ;                                   AFB0801
              IF PTCUREC[CURPTR] LS RC THEN GOTO ISSEKNJ ;
          END 
          KEYFWA = FAPKY3ADR[0] ;                                        JJJ1116
          AMBLE ;                                                        AFB0517
          IF FAALTPOS[0] NQ 0 OR PREVOP NQ OP"SEN"                       CY211
            THEN BEGIN                                                   AM2A088
              FASKLAST[0] = 1 ;                                          AM2A088
              EZKY$IS ( -1 ) ;                                           AM2A088
            END                                                          AM2A088
            ELSE BEGIN                                                   AM2A088
              GOKY$IS(-3);     #DO THE SPECIAL POSITIONING#              AM2A088
            END                                                          JJJ1116
          IF ARRIVED EQ 0 THEN GOTO ISSEKNA ; #FP=0#                     JJJ1116
          FASKLAST[0] = 0 ;                                              AM2A088
          IF QEI NQ 0 THEN GOTO ISSEKND ;                                GETNR
          CURR$AA ;                                                      GETNR
          IF XFER EQ 0 THEN GOTO ISSEKNH ;                               AFB0517
          CPCH$AA ( KEYFWA , 0 , TEMPLOC , TEMPOS , KLENG , KTYPE ) ;    AFB0528
          IF COND NQ 0 THEN GOTO ISSEKNH ;                               AFB0517
            #CURRENT RECORD HAS BEEN DELETED#                            GETNR
          IF RNO LS RC THEN GOTO ISSEKNT ;                               GETNR
          IF FWD EQ 0                                                    JJJ1116
            THEN BEGIN #EOI#                                             JJJ1116
     ISSEKND: FILPOS(EOI) ;                                              GETNR
              RETURN ;                                                   GETNR
            END                                                          JJJ1116
          PTCUREC[0] = 0 ;                                               GETNR
          PTCURBLK[CURPTR] = FWD ;                                       JJJ1116
          PTCUREC[CURPTR] = 0 ;                                          JJJ1116
          SEBL$AA ( CURPTR , 0 ) ;                                       JJJ1116
 #                                                                       CY211
*     SETTING PTCUREC[CURPTR]=0 IS TRICKY. IF SEBL$AA TELLS US THE BLOCK CY211
*     IS NOW IN CORE, WE GO TO ISSEKNT AND SKIP FORWARD FROM RECORD 0 TO CY211
*     THE ((NEXT)) LIVE RECORD IN THE BLOCK, WHICH OF COURSE IS THE      CY211
*     FIRST, AND IS JUST WHAT WE WANT. IF NOT, WHAT WILL HAPPEN.         CY211
*     (1) IF THE FILE IS ALTERED BEFORE THE NEXT ACTION THROUGH THIS FIT CY211
*     OR IF THE NEXT ACTION THROUGH THIS FIT IS A SEEK BY KEY, A GET OR  CY211
*     START BY KEY, OR AN UPDATER, IT DOESNT MATTER, BECAUSE THE EFFECT  CY211
*     OF THIS GETNEXT-NO-RECALL WOULD BE LOST ANYWAY.                    CY211
*     (2) OTHERWISE, IF THE NEXT ACTION IS A SKIPF OR A GETNEXT,         CY211
*       THE FACT THAT XFER = 1 WILL FORCE AN IMMEDIATE SKIP FORWARD      CY211
*       FROM RECORD 0 TO THE FIRST LIVE RECORD.                          CY211
*     (3) OR IF THE NEXT ACTION IS A SKIPB, TO AVOID CONFUSION           CY211
*       A RECORD NUMBER OF 0 IN THE PTREE WILL CAUSE POSITION TO BE      CY211
*       REESTABLISHED BY KEY TO WHERE IT WAS BEFORE THIS SERIES          CY211
*       OF GETNEXT-WITHOUT-RECALL ORDERS BEGAN, AND THEN THE SKIPB       CY211
*       WILL BE DONE.                                                    CY211
      (4) FINALLY, IF THE NEXT ACTION IS A GETNEXT-WITHOUT-RECALL,       CY211
*       WHICH WOULD BE THE MOST LOGICAL THING, WE WILL MAKE THE          CY211
*       GOKY$IS(-3) CALL, ABOUT 20 LINES BACK. IF THE BLOCK TURNS        CY211
*       OUT STILL NOT TO BE IN CORE, ARRIVED REMAINS 0, WE JUMP TO       CY211
*       ISSEKNA, AND NOTHING HAS CHANGED. BUT IF THE BLOCK IS IN         CY211
*       CORE NOW, GOKY$IS CALLS SEBL$AA, LOCATES THE BLOCK, DOES A       CY211
*       BINARY SEARCH BY KEY (THE KEY IS REALLY THAT OF THE LAST         CY211
*       RECORD IN THE PRECEDING BLOCK), FINDS THE KEY TOO LOW FOR        CY211
*       THE BLOCK, REFRAINS FROM CALLING THIS AN ERROR BECAUSE OF        CY211
*       THE SPECIAL CASE. NOW WHEN GOKY$IS FINDS NO MATCH TO THE         CY211
*       KEY, AT THE DATA BLOCK LEVEL, IT POSITIONS US ON THE NEXT        CY211
*       HIGHER RECORD. THIS TURNS OUT TO BE THE FIRST LIVE RECORD        CY211
*       IN THE NEW BLOCK, WHICH IS JUST WHAT WE WANTED.                  CY211
 #                                                                       CY211
          IF ARRIVED NQ 0                                                JJJ1116
            THEN BEGIN                                                   GETNR
     ISSEKNT: SKPF$AA ;                                                  GETNR
     ISSEKNH: FTCOP[0] = OP"GTN" ;                                       GETNR
              FTPOP[0] = OP"GTN" ;                                       GETNR
              IF FAPOSKEY1[0] EQ 0 OR MPEOK[0] EQ 0                      GETNR
                THEN BEGIN                                               GETNR
                  FILPOS(EOR) ;                                          GETNR
                END                                                      GETNR
                ELSE BEGIN                                               GETNR
                  FILPOS(EOK) ;                                          GETNR
                END                                                      GETNR
              RDRC$AA;
              FSGTNCNT[0] = FSGTNCNT[0] + 1 ;                            GAG1103
            END                                                          GETNR
            ELSE BEGIN                                                   GETNR
     ISSEKNA: FILPOS(FPNULL) ;                                           GETNR
            END                                                          GETNR
          END                                                            JJJ1116
CONTROL EJECT;                                                           ID0913 
PROC SKIP$IS;                                                            ID0913 
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   SKIP$IS - SKIP FORWARD OR BACKWARD IN AN I-S FILE         PAGE 1   ID0913 
* *   A.F.R.BROWN                                                        ID0913 
* 1DC SKIP$IS                                                            ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO SKIP FORWARD OR BACKWARD IN THE BASIC SEQUENCE (BY PRIMARY      ID0913 
*     KEY), OR FORWARD IN THE SEQUENCE DEFINED BY AN ALTERNATE KEY,      ID0913 
*     IN AN I-S FILE.                                                    ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     THE FILE IS IDENTIFIED BY P<FIT$AA>. THE DATA FILE, AND ITS        ID0913 
*     ASSOCIATED MIP FILE, IF ANY, MUST HAVE BEEN OPENED.                ID0913 
*                                                                        ID0913 
*     FTSKP[0] CONTAINS THE SKIP COUNT.                                  CY211
*                                                                        CY211
*     FTCOP[0] CONTAINS THE OPERATION CODE THAT TELLS WHETHER THIS       CY211
*     IS A FORWARD OR BACKWARD SKIP.                                     CY211
*                                                                        ID0913 
*     FILE POSITION, AND THE IDENTITY OF THE KEY BY WHICH POSITION IS    ID0913 
*     RECKONED, ARE DEFINED THE SAME WAY AS FOR GETN$IS.                 ID0913 
*     WITH ONE EXCEPTION - IF THE CURRENT RECORD NUMBER IN THE PTREE     CY211
*     IS 0, WHICH CAN HAPPEN WHEN POSITION IS BY PRIMARY KEY AND         CY211
*     GETNEXT-WITHOUT-RECALL HAS BEEN DONE, SKIP BACKWARD CANNOT HANDLE  CY211
*     THIS, THOUGH SKIP FORWARD AND GETNEXT CAN. SO SKIP BACKWARD SETS   CY211
*     FAALTPOS[0] TO 1 TO FORCE ITSELF TO FIND THE POSITION BY KEY       CY211
*     RATHER THAN RELYING ON THE PTREE AS GIVEN.                         CY211
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     POSITION INFORMATION, WHICH IS THE PURPOSE OF THE SKIP, IS STORED  ID0913 
*     IN THE SAME WAY AS AFTER A GET$IS. BUT NO RECORD OR KEY IS COPIED  ID0913 
*     TO A USER AREA.                                                    ID0913 
*                                                                        ID0913 
*     IF THE SKIP IS COMPLETED, FTSKP[0] = 0. OTHERWISE, IT CONTAINS     ID0913 
*     THE UNUSED PORTION OF ITS ORIGINAL VALUE. NOTE THAT THE SKIP FROM  ID0913 
*     THE LAST RECORD, WITH XFER=0, TO THE EOI POSITION, IS ALLOWED      ID0913 
*     TO REDUCE A FORWARD SKIP COUNT BY 1. CONVERSELY, IF FAFP[0]=EOI    CY211
*     AT THE BEGINNING OF A BACKWARD SKIP, THE SKIP COUNT IS REDUCED     CY211
*     BY 1 IF THE FILE IS NOT EMPTY, BY SETTING FAFP[0] TO EOR AND       CY211
*     POSITIONING ON THE LAST RECORD, WITH XFER = 0.                     CY211
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     THERE IS A NON-FATAL ERROR IF                                      CY211
*     (1) ON A FORWARD SKIP, WE HAVE TO SET FAFP[0] AND FTFP[0] = EOI,   CY211
*     OR FIND FAFP[0]=EOI, WITH A SKIP COUNT GREATER THAN 0.             CY211
*     (2) ON A BACKWARD SKIP, WE POSITION ON THE FIRST RECORD, WITH      CY211
*     XFER = 0 AND A SKIP COUNT GREATER THAN 0.                          CY211
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     SKIP$MP - TO DO THE JOB IF FAPOSKEY1[0] CONTAINS NON-ZERO,         ID0913 
*       INDICATING A POSITION BY ALTERNATE KEY.                          ID0913 
*     POST$IS - TO RESTORE THE PREVIOUS POSITION BY PRIMARY KEY.         CY211
*     SKPF$AA - TO STEP FORWARD ONE RECORD BY PRIMARY KEY.               ID0913 
*     BACK$AA - TO STEP BACK ONE RECORD BY PRIMARY KEY.                  ID0913 
*     GOFI$AA ALIAS GOENDFILE - TO POSITION ON THE LAST RECORD           CY211
*     (PROPERLY SPEAKING GOENDFILE POSITIONS AT EOI, BUT BY ZEROING      CY211
*     QEI WE CAN CONVERT THAT TO LAST RECORD. FAFP[0]=EOI MEANS EOI      CY211
*     BUT DOES NOT GUARANTEE THAT THE PTREE POINTS TO THE LAST           CY211
*     RECORD.)                                                           CY211
*     OPOS$IS - TO DO THE FILE POSITIONING SPECIFIED AT OPEN.            JJJ0203
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0], AND SAVE        CY211
*     THE PRIMARY KEY VALUE AS POSITION INFORMATION.                     CY211
*                                                                        CY211
*     CURR$AA - TO SET RECFWA AND VARIOUS OTHER POINTERS TO POINT TO     CY211
*     THE CURRENT RECORD, ACCORDING TO THE PTREE. THIS IS CALLED AFTER   CY211
*     BACK$AA, WHICH BACKSPACES THE PTREE SO TO SPEAK, BUT MAY NOT       CY211
*     HAVE ACTUALLY LOCATED THE RECORD.                                  CY211
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
 #                                                                       ID0913 
CONTROL EJECT;            #START OF SKIP$IS CODE#                        ID0913 
                                                                         ISISMOD
          IF PTOF NQ 0                                                   JJJ0203
          THEN                                                           JJJ0203
              BEGIN                                                      JJJ0203
              OPOS$IS;       #DO OPEN POSITIONING#                       JJJ0203
              END                                                        JJJ0203
          IF FAPOSKEY1[0] NQ 0                                           ISISMOD
            THEN SKIP$MP ;                                               JJJ0916
            ELSE BEGIN                                                   ISISIS 
              IF FTCOP[0] EQ OP"SKF"                                     JJJ1116
                THEN BEGIN                                               ISISIS 
                  IF FAFP[0] EQ EOI                                      AFB0222
                  THEN                                                   VBG1216
                    BEGIN                                                VBG1216
                    FTFP[0] = EOI;                                       AFB0222
                    T1 = EC100; 
                    GOTO SKIPMESS;  #ISSUE ERROR MESG AND RETURN#        VBG1216
                    END                                                  VBG1216
                  ELSE                                                   VBG1216
                    BEGIN                                                VBG1216
                                                                         VBG1216
                      POST$IS;
                                                                         ISISMOD
SKPLP1:               IF FTSKP[0] LQ 0 OR QEI NQ 0  THEN GOTO SKPDN1;    ISISMOD
                                                                         ISISMOD
                      SKPF$AA;                                           ISISMOD
                      FTSKP[0] = FTSKP[0] - 1;                           ISISMOD
                      GOTO SKPLP1;                                       ISISMOD
                                                                         ISISMOD
SKPDN1:                                                                  AFB0222
                      IF FTSKP[0] EQ 0                                   GETNR
                      THEN                                               AFB0222
                          BEGIN                                          AFB0222
                          FILPOS (EOR) ;                                 AFB0222
                          XFER = QEI ;                                   GETNR
                          END                                            AFB0222
                      ELSE                                               AFB0222
                          BEGIN                                          AFB0222
                          FILPOS (EOI) ;                                 AFB0222
                          END                                            AFB0222
                    END                                                  ISISIS 
                END                                                      ISISIS 
                ELSE BEGIN                                               ISISIS 
                  IF FAFP[0] EQ BOI                                      AFB0222
                  THEN                                                   AFB0222
                      BEGIN                                              AFB0222
                      FTFP[0] = BOI;                                     AFB0222
                      T1 = EC100; 
                      GOTO SKIPMESS;                                     AFB0222
                      END                                                AFB0222
                  IF FTSKP EQ 0                                          JJJ0307
                  THEN                                                   JJJ0307
                      BEGIN                                              JJJ0307
                      GOTO SKPDN3;  #GET OUT QUICKLY#                    JJJ0307
                      END                                                JJJ0307
                  IF FAFP[0] EQ EOI                                      AFB0222
                    THEN BEGIN                                           ISISIS 
                      GOENDFILE ;                                        ISISIS 
                      IF RECCNT NQ 0                                     ISISIS 
                      THEN                                               AFB0222
                          BEGIN                                          AFB0222
                          QLR = 1;                                       AFB0928
                          GOTO ISKIPC;                                   AFB0928
                          END                                            AFB0928
                      ELSE                                               AFB0222
                          BEGIN                                          AFB0222
                          FILPOS (BOI) ;                                 AFB0222
                          END                                            AFB0222
                    END                                                  ISISIS 
                    ELSE BEGIN                                           ISISIS 
                      IF PTCUREC[CURPTR] EQ 0                            CY211
                        THEN BEGIN  #COULD HAPPPEN THROUGH GTNR$IS#      CY211
                          FAALTPOS[0] = 1 ;                              CY211
                        END                                              CY211
                      IF FTSKP[0] - XFER EQ 0                            JJJ1116
                        AND FAALTPOS[0] EQ 0 AND FASKLAST[0] EQ 0        GETNR
                        THEN BEGIN                                       ISISIS 
                          XFER = 0 ;                                     ISISIS 
                          FTSKP[0] = 0;                                  ISISMOD
                          FTFP[0] = EOR ;                                AFB0517
                          FAFP[0] = EOR ;                                AFB0517
                          RETURN ;                                       ISISIS 
                        END                                              ISISIS 
                      POST$IS;
ISKIPC:                                                                  AFB0928
                      XFER = 0 ;                                         AFB0517
                      IF QEI NQ 0                                        JJJ0307
                      THEN         #POSITION AT EOI, RESET IT#           JJJ0307
                          BEGIN                                          JJJ0307
                          QEI = 0;                                       JJJ0307
                          IF RECCNT NQ 0 THEN QLR = 1;
                          IF RECCNT EQ 1 THEN QFR = 1;
                          FTSKP = FTSKP - 1;                             JJJ0307
                          END                                            JJJ0307
ISKIPA:               IF FTSKP[0] LQ 0 OR QFR NQ 0   THEN GOTO SKPDN2;   JJJ1116
                                                                         ISISMOD
                      BACK$AA;                                           ISISMOD
                      FTSKP[0] = FTSKP[0] - 1;                           JJJ1116
                      GOTO ISKIPA;                                       ISISMOD
                                                                         ISISMOD
SKPDN2:                                                                  ISISMOD
                      CURR$AA ;                                          AFB0517
                      IF FTSKP[0] NQ 0                                   AFB0222
                      THEN                                               AFB0222
                          BEGIN                                          AFB0222
                          FILPOS (BOI) ;                                 AFB0222
                          END                                            AFB0222
                      ELSE                                               AFB0222
                          BEGIN                                          AFB0222
                          FILPOS (EOR) ;                                 AFB0222
                          END                                            AFB0222
                    END                                                  ISISIS 
                END                                                      ISISIS 
            END                                                          ISISIS 
SKPDN3:                                                                  AFB0222
          IF FTSKP NQ 0                                                  VBG1216
          THEN                                                           VBG1216
            BEGIN                                                        VBG1216
            T1 = NOTE012;                                                VBG1216
SKIPMESS:   MSGZ$AA (T1);                                                VBG1216
            END                                                          VBG1216
          END                                                            ISISIS 
CONTROL EJECT;
#         START OF SEEK$IS# 
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   SEEK$IS - DO A SEEK IN AN I-S FILE                        PAGE 1   ID0913 
* *   A.F.R.BROWN                                                        ID0913 
* 1DC SEEK$IS                                                            ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO CARRY OUT NEARLY ALL THE WORK OF A SEEK BY PRIMARY OR ALTERNATE ID0913 
*     KEY ON AN I-S FILE.                                                ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     THE FILE IS SPECIFIED BY P<FIT$AA>. THE DATA FILE, AND ITS         ID0913 
*     ASSOCIATED MIP FILE IF THE SEEK IS BY ALTERNATE KEY, MUST HAVE     ID0913 
*     BEEN OPENED.                                                       ID0913 
*                                                                        ID0913 
*     THE KEY IS LOCATED BY FTKA[0] AND FTKP[0] IN THE FIT, WHILE        ID0913 
*     FTKL[0], FTRKP[0], AND FTRKW[0] GIVE ITS POSITION WITHIN ANY       ID0913 
*     RECORD AND DETERMINE WHETHER PRIMARY OR ALTERNATE.                 ID0913 
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     IF CURPTR = NLEV AND PTBLKIN[CURPTR] = 1, WE ARE NOW POSITIONED    ID0913 
*     AT THE RIGHT RECORD, AND IT IS IN CORE.                            CY211
*                                                                        ID0913 
*     IF CURPTR = NLEV AND PTBLKIN[CURPTR] = 0, WE ARE JUST ONE CYCLE    ID0913 
*     SHORT OF BEING AT THE RIGHT RECORD, AND IT WOULD BE REASONABLE     ID0913 
*     FOR THE CALLER TO MAKE HIS NEXT ACTION THE REAL ((GET)), ((PUT))   ID0913 
*     OR WHATEVER THAT THE ((SEEK)) LOOKS TOWARD.                        ID0913 
*                                                                        ID0913 
*     FTFP[0] IN THE FIT = EOR (OCTAL 20) AS A SIGNAL TO THE USER, IN    ID0913 
*     EITHER OF THE ABOVE CASES. THIS FIELD IS 0 OTHERWISE, IN THE       ID0913 
*     CASE GIVEN BELOW.                                                  ID0913 
*                                                                        CY211
*     NOTE THAT WE DO NOT SET FAFP[0] IN THIS SUBROUTINE,                CY211
*     BECAUSE IT SHOULD CONTINUE TO REFLECT THE FILE                     CY211
*     POSITION AS DEFINED FOR A GETNEXT OR A SKIP. THEREFORE             CY211
*     WE DO NOT CALL FILP$AA TO SET FTFP[0], BECAUSE IT WOULD            CY211
*     ALSO SET FAFP[0] AND MIGHT SAVE A PRIMARY KEY VALUE                CY211
*     AND CLEAR FAALTPOS[0] AND FASKLAST[0].                             CY211
*                                                                        ID0913 
*     IF CURPTR IS NOT EQUAL TO NLEV, WE HAVE NOT YET STARTED LOOKING    ID0913 
*     FOR THE DATA BLOCK THAT IS THE ULTIMATE DESTINATION, SO ANOTHER    ID0913 
*     ((SEEK)) WOULD BE APPROPRIATE AS THE NEXT ACTION ON THE FILE IF    ID0913 
*     MAXIMUM OVERLAPPING IS THE GOAL.                                   ID0913 
*                                                                        ID0913 
*     IN ANY CASE, THE GIVEN KEY HAS BEEN STORED IN THE AREA TO WHICH    ID0913 
*     FASKY3ADR[0] (IF PRIMARY KEY) OR FASKY2ADR[0] (IF ALTERNATE KEY)   JJJ1009
*     POINTS, AND ITS DESCRIPTION IN FIELDS OF THE WORD FASEEKEY1[0].    ID0913 
*       KEY LENGTH IN FASKRKL[0]                                         ID0913 
*       KEY STARTING POSITION IN FASKRKW[0] AND FASKRKP[0]               ID0913 
*         THESE 3 TOGETHER DETERMINE WHICH OF THE KNOWN KEYS.            ID0913 
*         FOR A SEEK BY PRIMARY KEY, HOWEVER, THEY ARE ALL 0.            ID0913 
*       ((MAJOR KEY LENGTH)) IN FASKLENG[0]                              ID0913 
*         (EQUAL TO OR LESS THAN FASKRKL[0]. IT TELLS HOW MANY           ID0913 
*         CHARACTERS OF THE SPECIFIED KEY TO MATCH ON.)                  ID0913 
*       ((STAGE)) WE ARE AT, IN FASKSTGE[0].                             ID0913 
*         THIS IS 0 FOR A SEEK BY PRIMARY KEY.                           ID0913 
*         ON A SEEK BY ALTERNATE KEY, IT IS 0 AS LONG AS WE ARE          ID0913 
*         SEEKING THAT ALTERNATE KEY IN THE MIP FILE. ONCE THE PRIMARY   ID0913 
*         KEY HAS BEEN FOUND, AND STORED IN THE AREA FASKY3ADR[0]        ID0913 
*         POINTS TO, THE FLAG IS SET TO 1 TO INDICATE THAT FUTURE        ID0913 
*         STAGES WILL BE AIMING AT THAT PRIMARY KEY IN THE MAIN FILE.    ID0913 
*                                                                        CY211
*     IN ONE PLACE,FTPOP[0] IS SET TO OP"GET". THIS IS INTENDED TO       CY211
*     MAKE IT LOOK TO THE NEXT OPERATION ON THIS FIT AS THOUGH THIS      CY211
*     OPERATION HAD BEEN A GET RATHER THAN A SEEK, WHICH IN EFFECT       CY211
*     NEGATES THE CONSEQUENCES IT WOULD HAVE HAD AS A SEEK. THE REASON   CY211
*     IS SIMILAR TO THE REASON WHY EZKY$IS OR GOKY$IS HAS TO BE          CY211
*     CALLED WITH A SPECIAL PARAMETER ( -3 ) AT ONE POINT IN             CY211
*     SUBROUTINE GTNR$IS - TO PREVENT GOKY$IS FROM DECLARING A           CY211
*     FATAL ERROR WHEN IT FINDS ITSELF WITH A KEY THAT IS TOO LOW        CY211
*     FOR THE FIRST RECORD OF THE CURRENT BLOCK, BUT THE CURRENT BLOCK   CY211
*     IS NOT THE PRIMARY INDEX BLOCK.                                    CY211
*                                                                        CY211
*     THE DIFFICULTY ARISES IF A SEEK BY PRIMARY KEY IS DONE, WITH A     CY211
*     KEY VALUE LOWER THAN ANYTHING IN THE FILE. GOKY$IS IS CALLED,      CY211
*     EITHER DIRECTLY OR THROUGH EZKY$IS, AND FINDS OUT THAT THE KEY     CY211
*     IS TOO LOW, AS SOON AS THE PRIMARY INDEX BLOCK IS EXAMINED.        CY211
*     FOR SIMPLICITY, GOKY$IS THEN CALLS GOSTARTFILE AND SETS QFR=1,     CY211
*     POSITIONING US ON THE FIRST RECORD OF THE FILE, BUT LEAVING        CY211
*     QMF=0 TO SHOW THERE WAS NO MATCH. NOW IF THE NEXT OPERATION        CY211
*     WERE EITHER A SEEK OR A GET, BY THE SAME KEY, AND IT RELIED        CY211
*     ON INFORMATION LEFT BEHIND BY THIS SEEK, IT WOULD BE DIRECTED      CY211
*     TO LOOK AT THE CURRENT BLOCK AT THE DATA BLOCK LEVEL OF THE PTREE, CY211
*     WOULD FIND THAT THE GIVEN KEY WAS LOWER THAN ANYTHING THERE, AND   CY211
*     WOULD DECLARE A FATAL ERROR. TO AVOID THIS, WE SET FTPOP[0]=       CY211
*     OP"GET". FTFP[0] HAS BEEN SET TO EOR, SO THE CALLER SHOULD SEE     CY211
*     THAT IT IS TIME TO FOLLOW UP HIS SEEK WITH A GET. THUS THERE       CY211
*     SHOULD NOT BE USELESS LOOPING. IF THE NEXT OPERATION IS A GET,     CY211
*     IT WILL START FROM SCRATCH BECAUSE IT THINKS THE PRECEDING         CY211
*     OPERATION WAS A GET NOT A SEEK. IF THE NEXT OPERATION IS A SEEK    CY211
*     THIS IS A WASTE OF TIME, BUT AT ANY RATE IT WILL START FROM        CY211
*     SCRATCH AND GOKY$IS WILL NOT FIND AN ERROR.                        CY211
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     QUMP$AA - TO DECIDE WHETHER THE CALL IS BY PRIMARY OR ALTERNATE    ID0913 
*       KEY.                                                             ID0913 
*     SEEK$MP - TO DO MOST OF THE WORK IF THIS IS SEEK BY ALTERNATE KEY  ID0913 
*     KPTR$IS - TO SET KEYFWA, KEYOFF, QREL AND MAJKEY.                  JJJ1116
*     CEEK$IS - TO DECIDE WHETHER WE ARE CONTINUING A PREVIOUS SEEK ON   CY211
*       THE SAME KEY, AND IF NOT, TO STORE THE NEW KEY AND ITS           ID0913 
*       DESCRIPTION.                                                     ID0913 
*     EZKY$IS - TO START LOCATING BY PRIMARY KEY, IF THIS IS NOT A       ID0913 
*       CONTINUED OLD SEEK.                                              ID0913 
*     GOKY$IS - TO CONTINUE LOCATING BY PRIMARY KEY, IF THIS IS A        ID0913 
*       CONTINUED OLD SEEK.                                              ID0913 
*                                                                        ID0913 
*     NOTE THAT THESE LAST TWO ARE                                       CY211
*     CALLED WITH A NEGATIVE PARAMETER. THE NEGATIVE PARAMETER TELLS     ID0913 
*     THE LOCATE-BY-KEY TO TELL OTHER ROUTINES, IN TURN, TO DO ANY       ID0913 
*     NECESSARY BLOCK READING WITHOUT RECALL, AND TO EXIT AFTER          ID0913 
*     INITIATING SUCH I-O. LOCATE-BY-KEY, IN TURN, EXITS WITHOUT         ID0913 
*     COMPLETING WHENEVER IT FINDS, RIGHT AFTER CALLING ANOTHER ROUTINE  ID0913 
*     TO LOCATE A BLOCK, THAT PTBLKIN[CURPTR] IS STILL 0, INDICATING     ID0913 
*     BLOCK NOT IN CORE.                                                 ID0913 
*                                                                        CY211
*     -2 AS PARAMETER MEANS THAT IF GOKY$IS COMES DOWN THROUGH THE INDEX CY211
*     TREE TO A DATA BLOCK, IT SHOULD EXIT WITHOUT LOOKING INTO THE DATA CY211
*     BLOCK TO MATCH THE KEY WITH A PARTICULAR RECORD. SINCE THE         CY211
*     OPERATION IS ONLY A SEEK, THIS WOULD BE A WASTE OF TIME.           CY211
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     MIPMODE - THIS IS 0 AS LONG AS A NON-MIP FILE IS CURRENT, AND      CY211
*     NON-ZERO WHEN A MIP FILE IS CURRENT.                               CY211
*                                                                        ID0913 
 #                                                                       ID0913 
                             #START OF SEEK$IS CODE#                     JJJ0916
          ITEM S ; #SCRATCH#                                             AFB0222
                                                                         AFB0222
          IF QUMP$AA ( 0 ) NQ 0                                          ISISIS 
          THEN                                                           JJJ1116
              BEGIN                                                      JJJ1116
              IF FTNDX[0] NQ 0
              THEN
                  BEGIN 
                  RETURN ;
                  END 
              S = SEEKSTAGE ;                                            AFB0222
              SEEK$MP;                                                   JJJ1116
              IF SEEKSTAGE NQ 0                                          JJJ1116
              THEN                                                       JJJ1116
                  BEGIN                                                  JJJ1116
                  IF S EQ 0                                              AFB0222
                  THEN                                                   JJJ1116
                      BEGIN                                              JJJ1116
                      EZKY$IS ( -2 ) ;                                   AFB0531
                      END                                                JJJ1116
                  ELSE                                                   JJJ1116
                      BEGIN                                              JJJ1116
                      GOKY$IS ( -2 ) ;                                   AFB0531
                      END                                                JJJ1116
                  END                                                    JJJ1116
              END                                                        JJJ1116
                                                                         JJJ0916
            ELSE BEGIN                                                   ISISIS 
              KPTR$IS ( 0 ) ;                                            JJJ1116
              IF CEEK$IS NQ 0 
                THEN BEGIN                                               ISISIS 
                  FASEEKEY1[0] = 0 ;                                     ISISIS 
                  MOVC$AA ( KEYFWA,KEYOFF , FASKY3ADR[0],0 , MAJKEY ) ;  AFB0214
                  SEEKLENG = MAJKEY ;                                    ISISIS 
                  EZKY$IS ( -2 ) ;                                       AFB0531
                END                                                      ISISIS 
                ELSE GOKY$IS ( -2 ) ;                                    AFB0531
            END                                                          ISISIS 
          FASKLAST[0] = 1 ;                                              AFB0517
          FAALTPOS[0] = 0 ;                                              AFB0517
          IF MIPMODE EQ 0 AND CURPTR EQ NLEV                             ISISIS 
          THEN                                                           JJJ0523
              BEGIN                                                      JJJ0523
              FTFP[0] = EOR;                                             JJJ0523
              IF PTBLKIN[CURPTR] NQ 0 AND QFR NQ 0                       JJJ0523
              THEN                                                       JJJ0523
                  BEGIN                                                  JJJ0523
                  FTPOP = OP"GET";  #THE SEEK DIDNT DO MUCH#             JJJ0523
                  END                                                    JJJ0523
              END                                                        JJJ0523
            ELSE FTFP[0] = FPNULL ;                                      AFB0222
          CONTROL IFEQ STATS,1 ;
          FSSEEKCNT = FSSEEKCNT + 1 ;  # INCREMENT SEEK COUNT # 
          CONTROL ENDIF ; 
          END                                                            ISISIS 
      END 
      TERM
