*DECK,ISDIS 
*CALL COMUSETXT 
PROC IS$IS; 
      BEGIN 
                                                                         ISISIS 
     XREF BEGIN                                                          ISISIS 
          FUNC MXPR$AA ;
          FUNC CEEK$IS; 
          PROC MOVC$AA ;                                                 ISISIS 
          PROC LKEY$AA ;
          PROC CPCH$AA ;                                                 ISISIS 
          PROC BNCH$AA;                                                  AM2A089
          PROC MOVW$AA ;                                                 ISISIS 
          PROC IMPR$AA; 
          PROC GET$MP;                                                   JJJ0916
          PROC RWIN$MP;                                                  JJJ0916
          PROC GETN$MP;                                                  JJJ0916
          PROC CPKY$AA ;                                                 ISISIS 
          PROC FRLR$AA ;                                                 ISISIS 
          PROC BACK$AA ;                                                 ISISIS 
          PROC RDRC$AA ;                                                 ISISIS 
          FUNC UUCC$AA ;                                                 ISISIS 
          FUNC QUMP$AA ;                                                 ISISIS 
          PROC SEBL$AA ;                                                 ISISIS 
          PROC LOCR$AA ;                                                 ISISIS 
          PROC TRN2$IS ;                                                 JJJ1116
          PROC SETR$AA ;                                                 ISISIS 
          PROC GOFI$AA ;                                                 ISISIS 
          PROC SKPF$AA ;                                                 ISISIS 
          PROC STPF$AA ;                                                 ISISIS 
          PROC STMD$AA ;                                                 ISISIS 
          PROC SPKY$AA ;                                                 AFB0517
          PROC FILP$AA ;                                                 AFB0517
          PROC RJUV$AA ;                                                 ISISIS 
          PROC DABL$AA ;                                                 ISISIS 
          PROC CURR$AA ;                                                 ISISIS 
          PROC WTIO$AA;                                                  RPN0127
          PROC VOKG$AA;                                                  CIM0214
          PROC MSGF$AA ;                                                 DABBLE 
          PROC MSGZ$AA;      #MESSAGES#                                  JJJ1001
          LABEL EXIT$AA;     #ERROR EXIT#                                JJJ1001
          END                                                            ISISIS 
                                                                         ISISIS 
CONTROL WEAK CEEK$IS,GETN$MP,GET$MP,RWIN$MP;
                                                                         JJJ0724
     XDEF BEGIN                                                          ISISIS 
          FUNC SIKH$IS ;                                                 ISISIS 
          PROC GET$IS ;                                                  ISISIS 
          PROC GETN$IS ;                                                 ISISIS 
          PROC REW$IS;                                                   JJJ0724
          PROC KPTR$IS ;                                                 JJJ1116
          PROC OPOS$IS; 
          PROC POST$IS; 
          PROC STDN$IS ;                                                 ISISIS 
          PROC WKKY$IS ;                                                 ISISIS 
          PROC STUP$IS ;                                                 ISISIS 
          PROC BACK$IS ;                                                 ISISIS 
          PROC EZKY$IS ;                                                 ISISIS 
          PROC GOKY$IS ;                                                 ISISIS 
          END                                                            ISISIS 
                                                                         ISISIS 
                                                                         ISISMOD
          ITEM IX;           #ITEM USED FOR INDUCTION VARIABLE#          ISISMOD
          ITEM T1;           #ITEM USED AS TEMPORARY VARIABLE#           ISISMOD
CONTROL EJECT ;                                                          JJJ1116
 #                                                                       JJJ1116
* *   SIKH$IS - ARE WE IN THE MIDST OF A SEEK ON THIS KEY   PAGE 1       JJJ1116
* *   A.F.R.BROWN                                                        JJJ1116
* 1DC SIKH$IS                                                            JJJ1116
*                                                                        JJJ1116
* DC  FUNCTION                                                           JJJ1116
*                                                                        JJJ1116
*     FOR FUNCTION, ETC., SEE THE COMMENTS TO CEEK$IS, IN CAPSULE        CY210
*     SEEK$IS. SIKH$IS IS LITTLE MORE THAN A CALL TO CEEK$IS IF          CY210
*     THIS IS A SEEK OR FOLLOWS A SEEK. IF THE JOB IS NOT DOING          JJJ1116
*     ANY SEEKS, IT CAN GET AWAY WITHOUT LOADING THE CAPSULE THAT        JJJ1116
*     CONTAINS THE BULK OF THE CODE.                                     JJJ1116
*                                                                        JJJ1116
 #                                                                       JJJ1116
     FUNC SIKH$IS ; BEGIN                                                AFB0214
          IF FTCOP[0] EQ OP"SEK"                                         JJJ1116
           OR ( FAALTPOS[0] EQ 0 AND PREVOP EQ OP"SEK" )                 GETNR
            THEN SIKH$IS = CEEK$IS ;                                     AFB0214
            ELSE SIKH$IS = 1 ;                                           JJJ1116
          END                                                            JJJ1116
                                                                         JJJ1116
CONTROL EJECT;                                                           JJJ0209
PROC BACK$IS;                                                            ISISMOD
          BEGIN                                                          ISISMOD
                                                                         ID0913 
 #                                                                       ID0913 
* *   BACK$IS - BACKSPACE ACROSS BLOCK BOUNDARY    PAGE  1               JJJ0916
* *   A.F.R.BROWN                                                        ID0913 
* 1DC BACK$IS                                                            ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     THIS IS CALLED WHEN WE NEED TO BACKSPACE ONE RECORD IN AN I-S      ID0913 
*     FILE OR SUBFILE, AND THE STARTING POSITION IS THE FIRST LIVE       ID0913 
*     RECORD IN ITS BLOCK. HENCE THE BACKSPACE MUST CROSS A BLOCK        ID0913 
*     BOUNDARY, BUT BLOCKS DO NOT HAVE BACKWARD POINTERS. SO IT IS       ID0913 
*     NECESSARY TO USE THE INDEX TO FIND THE PRECEDING DATA BLOCK.       ID0913 
*     BACK$IS IS CALLED TO LOOK UP THE PTREE, USING STUP$IS TO REBUILD   ID0913 
*     IT IF NECESSARY, UNTIL AN INDEX RECORD THAT IS NOT FIRST IN ITS    ID0913 
*     BLOCK IS REACHED. THE PTREE LEVEL NUMBER IS PASSED BACK TO THE     ID0913 
*     CALLING ROUTINE, WHICH CAN THEN REDUCE THE RECORD NUMBER BY 1 AT   ID0913 
*     THAT POINT, SET CURPTR TO POINT TO IT, AND THEN CALL STDN$IS       ID0913 
*     REPEATEDLY.                                                        ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     THE PTREE SHOULD MARK AS CURRENT A DATA RECORD THAT IS THE         CY210
*     FIRST LIVE ONE IN ITS BLOCK, AND RECFWA ETC. MUST LOCATE           CY210
*     THE RECORD. THE BLOCK MUST NOT BE THE FIRST DATA BLOCK.            CY210
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     THE PTREE SHOWS US POSITIONED ON THE LAST RECORD OF THE            CY210
*     PRECEDING BLOCK. HOWEVER, RECFWA, RNO ETC. HAVE NOT BEEN SET.      CY210
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     STUP$IS -- TO GO UP EACH STEP IN THE PTREE.                        ID0913 
*     STDN$IS -- TO MOVE DOWN A LEVEL IN THE PTREE.                      JJJ0203
*     SEBL$AA -- TO LOCATE THE BLOCK NAMED IN A GIVEN PTREE WORD.        JJJ0203
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     NONE                                                               JJJ0916
*                                                                        ID0913 
 #                                                                       ID0913 
                             #START OF BACK$IS CODE#                     JJJ0209
BACKISA:  STUP$IS;                                                       JJJ0916
          IF PTCUREC[CURPTR] EQ 1   THEN GOTO BACKISA;                   JJJ0916
                                                                         JJJ0916
          SEBL$AA (CURPTR,1);                                            JJJ0916
          PTCUREC[CURPTR] = PTCUREC[CURPTR] - 1;                         JJJ0916
          ASLONGAS CURPTR LS NLEV                                        JJJ0916
            DO                                                           JJJ0916
            BEGIN                                                        JJJ0916
            STDN$IS (1);                                                 JJJ0916
            PTCUREC[CURPTR] = RC;                                        JJJ0916
            END                                                          JJJ0916
          PTCUREC[CURPTR] = RC;                                          JJJ0916
          END                                                            JJJ0916
CONTROL EJECT;                                                           ISISMOD
          CONTROL IFEQ 1,2 ;                                             AM2A089
PROC BNCH$AA;                                                            JJJ0916
          BEGIN                                                          ISISMOD
                                                                         JJJ0907
 #                                                                       JJJ0907
* *   BNCH$AA - DO A BINARY SEARCH OF A BLOCK BY KEY       PAGE  1       JJJ0916
* *   A.F.R.BROWN                                                        JJJ0907
* 1DC BNCH$AA                                                            JJJ0907
*                                                                        JJJ0907
* DC  FUNCTION                                                           JJJ0907
*                                                                        JJJ0907
*     TO SEARCH THE CURRENT BLOCK, BY KEY, USING A BINARY SEARCH         JJJ0907
*                                                                        JJJ0907
* DC  ENTRY CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     THE BLOCK MUST BE IN CORE, AND SEBL$AA MUST JUST HAVE BEEN DONE    JJJ0907
*     FOR IT.                                                            JJJ0907
*                                                                        JJJ0907
*     THE KEY BEGINS IN THE WORD KEYFWA POINTS TO, KEYPOS CHARACTERS     JJJ0907
*     FROM THE LEFT END. IT IS MAJKEY CHARACTERS LONG, WHICH MAY BE      JJJ0907
*     THE SAME AS OR LESS THAN THE FULL LENGTH OF A KEY FOR THE CURRENT  JJJ0907
*     FILE OR SUBFILE (KLENG).                                           JJJ0907
*                                                                        CY210
*     TEMPLOFF IS THE NUMBER OF WORDS TO BE ADDED TO THE FWA OF ANY      CY210
*     RECORD, TO GET THE FWA OF ITS PRIMARY KEY.                         CY210
*                                                                        CY210
*     TEMPOS IS THE CHARACTER POSITION AT WHICH THE PRIMARY KEY OF       CY210
*     ANY RECORD BEGINS.                                                 CY210
*                                                                        JJJ0907
* DC  EXIT CONDITIONS                                                    JJJ0907
*                                                                        JJJ0907
*     1. IF MATRESL IS NOT 0, IT IS THE NUMBER OF A RECORD IN THE BLOCK  JJJ0907
*        WHOSE KEY MATCHES THE GIVEN KEY, AND THE GIVEN KEY IS FULL      JJJ0907
*        LENGTH (MAJKEY=KLENG).                                          JJJ0907
*                                                                        JJJ1009
*     2. IF MATRESL IS 0, SMALREC GIVES THE NUMBER                       JJJ1009
*        OF THE LAST RECORD IN THE BLOCK WHOSE KEY IS SMALLER THAN       JJJ0907
*        THE GIVEN ONE. IF SMALREC=0, THIS MEANS THE FIRST RECORD IN     JJJ0907
*        THE BLOCK WAS TOO HIGH. IF SMALREC=RC (THE COUNT OF RECORDS     JJJ0907
*        IN THE BLOCK), THIS MEANS THE LAST RECORD IN THE BLOCK WAS      JJJ0907
*        TOO LOW. OTHERWISE, RECORDS SMALREC AND SMALREC+1 STRADDLE      JJJ0907
*        THE GIVEN KEY.                                                  JJJ0907
*                                                                        JJJ1009
*     NOTE THAT ((MACNAB)) COUNTS AS GREATER THAN ((MAC)) EXCEPT WHEN    JJJ1009
*     WE ARE SEARCHING FOR GREATER-THAN, WHEN IT COUNTS AS LESS.         JJJ1009
*     E.G. ((MAC)) COULD BE STRADDLED BY ((MABLES)) AND ((MACNAB)) OR    JJJ1009
*     BY ((MABLES)) AND ((MARBLE)), WHEN SEARCHING FOR EQUAL, OR FOR     JJJ1009
*     EQUAL-OR-GREATER.  BUT WHEN SEARCHING FOR GREATER-THAN, ((MAC))    JJJ1009
*     COULD BE STRADDLED BY ((MACNAB)) AND ((MADDER)) OR BY              JJJ1009
*     ((MABLES)) AND ((MADDER)).  IN ALL THESE CASES, IT IS THE SECOND   JJJ1009
*     OF THE TWO RECORDS THAT WE WOULD FINALLY POSITION ON.              JJJ1009
*                                                                        JJJ1009
*     NOTE THAT MATRESL AND SMALREC CAN POINT TO A LIVE                  JJJ1009
*     RECORD OR A DEAD ONE. THE ROUTINE THAT CALLED BNCH$AA IS           JJJ0907
*     RESPONSIBLE FOR DEALING WITH A DEAD RECORD.                        JJJ0907
*                                                                        JJJ0907
* DC  ERROR CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     NONE.                                                              JJJ0907
*                                                                        JJJ0907
* DC  CALLED ROUTINES                                                    JJJ0907
*                                                                        JJJ0907
*     CPKY$AA -- TO COMPARE THE PRIMARY KEY OF ANY RECORD IN THE         JJJ0907
*        CURRENT BLOCK, NOT NECESSARILY THE CURRENT RECORD, WITH THE     JJJ0907
*        KEY LOCATED BY KEYFWA AND KEYOFF, UP TO THE FIRST MAJKEY        JJJ0907
*        CHARACTERS                                                      JJJ0907
*                                                                        JJJ0907
* DC  NON-LOCAL VARIABLES                                                JJJ0907
*                                                                        JJJ0907
*     COND IS SET BY CPKY$AA .                                           JJJ0907
*                                                                        JJJ0907
 #                                                                       JJJ0907
                                                                         JJJ0907
          ITEM HIRC;         #HIGH RECORD NUM#                           ISISMOD
          ITEM MID;          #MID RECORD NUM#                            ISISMOD
                                                                         ISISMOD
                             #START OF BNCH$AA CODE#                     ID0913 
          MATRESL = 0 ;                                                  ISISIS 
          SMALREC = 0 ;                                                  ISISIS 
          HIRC = RC + 1;                                                 ISISMOD
          ASLONGAS HIRC GR SMALREC + 1                                   ISISMOD
            DO                                                           ISISMOD
            BEGIN                                                        ISISMOD
            MID = (SMALREC + HIRC) / 2 ;                                 ISISMOD
            CPKY$AA (MID);                                               ISISMOD
            IF COND EQ 0                                                 ISISMOD
            THEN                                                         ISISMOD
              BEGIN                                                      ISISMOD
              MATRESL = MID;                                             JJJ1009
              RETURN;        #DONE#                                      JJJ1009
              END                                                        ISISMOD
            ELSE                                                         ISISMOD
              BEGIN                                                      ISISMOD
              IF COND LS 0                                               ISISMOD
                THEN   HIRC = MID;                                       ISISMOD
                ELSE   SMALREC = MID;                                    ISISMOD
              END                                                        ISISMOD
            END                                                          ISISMOD
          END                                                            ISISMOD
          CONTROL ENDIF ;                                                AM2A089
CONTROL EJECT;                                                           ISISMOD
PROC EZKY$IS ( HOW ) ;                                                   CY210
      BEGIN                                                              CY210
                                                                         JJJ0907
 #                                                                       JJJ0907
* *   EZKY$IS - LOCATE AN I-S RECORD BY KEY                PAGE  1       JJJ0916
* *   A.F.R.BROWN                                                        JJJ0907
* 1DC EZKY$IS                                                            JJJ0907
*                                                                        JJJ0907
* DC  FUNCTION                                                           JJJ0907
*                                                                        JJJ0907
*     TO LOCATE A RECORD BY KEY, IN AN I-S FILE OR AN I-S SUBFILE OF A   JJJ0907
*     MIP FILE, OR TO POSITION AT THE NEXT HIGHER KEY, IF THERE IS NO    JJJ0907
*     MATCH. THE LATTER IS THE NECESSARY PRELIMINARY TO A PUT-BY-KEY.    JJJ0907
*                                                                        JJJ0907
* DC  ENTRY CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     1. A SINGLE PARAMETER IS ACCEPTED FROM A STANDARD LIST.            JJJ0907
*     THIS CAN BE GREATER THAN, EQUAL TO, OR LESS THAN ZERO.             JJJ0907
*     (A) LESS THAN ZERO IF THIS CALL IS PART OF A ((SEEK)) OPERATION    JJJ0907
*     AND IF ANY READING IS NECESSARY, IT SHOULD BE WITHOUT RECALL,      JJJ0907
*     AND EZKY$IS SHOULD EXIT RIGHT AFTER INITIATING ANY SUCH READ.      JJJ0907
*     SEE COMMENTS TO GOKY$IS FOR MORE DETAILS.                          CY210
*     (B) GREATER THAN ZERO IF THE CALL IS PART OF A ((PUT)) OPERATION.  JJJ0907
*     (C) ZERO OTHERWISE.                                                JJJ0907
*                                                                        JJJ0907
*     THE DIFFERENCE BETWEEN (B) AND (C) IS THAT IF THERE IS NO          JJJ0907
*     MATCHING RECORD, WE WANT EZKY$IS TO LEAVE US POSITIONED ON THE     JJJ0907
*     NEXT HIGHER RECORD, EXCEPT WHEN, DURING A PUT, THIS WOULD BE THE   JJJ0907
*     FIRST RECORD OF A BLOCK, OTHER THAN THE FIRST RECORD IN THE        JJJ0907
*     FILE. IN THE EXCEPTIONAL CASE, WE WANT TO BE POSITIONED ON THE     JJJ0907
*     LAST RECORD OF THE PRECEDING BLOCK (THE RECORD WITH THE HIGHEST    JJJ0907
*     LOWER KEY), WITH A SPECIAL FLAG SET.                               JJJ0907
*                                                                        JJJ0907
*     2. KEYFWA IS THE FWA OF THE KEY. IF THIS IS A CHARACTER KEY IN AN  JJJ0907
*     I-S FILE OR SUBFILE, IT MUST HAVE BEEN ALREADY COLLATED.           JJJ0907
*     THAT IS, NEITHER EZKY$IS NOR ANYTHING CALLED BY IT IS GOING TO     JJJ0907
*     USE THE COLLATE TABLE.                                             JJJ0907
*                                                                        JJJ0907
*     3.KEYOFF IS THE NUMBER OF CHARACTERS OFFSET FROM THE LEFT, AT      JJJ0907
*     WHICH THE KEY BEGINS IN THE WORD AT KEYFWA.                        JJJ0907
*                                                                        JJJ0907
*     4. MAJKEY IS THE NUMBER OF CHARACTERS IN THE KEY. THE MAXIMUM      JJJ0907
*     IS THE FULL LENGTH OF A KEY IN THE CURRENT FILE OR SUBFILE.        JJJ0907
*                                                                        JJJ0907
*     5. QREL HAS ONE OF THE VALUES REL"EQ", REL"GE" OR                  CY210
*     REL"GT". REL"GE" MEANS THAT THE RECORD                             CY210
*     TO BE SOUGHT WILL BE THE FIRST WITH A KEY EQUAL TO THE GIVEN ONE   JJJ0907
*     OR IF THERE IS NONE SUCH, THE FIRST WITH A GREATER KEY.            JJJ0907
*                                                                        JJJ0907
*     6. P<FINF$AA> MUST IDENTIFY THE FILE OR SUBFILE BY LOCATING ITS    CY210
*     FILE DESCRIPTOR. IF THE FILE IS NOT A MIP FILE, P<FSTT$AA> MUST    JJJ0907
*     LOCATE ITS FSTT.                                                   JJJ0907
*                                                                        JJJ0907
*     7. P<PTRE$AA> MUST LOCATE THE PTREE FOR THE FILE OR SUBFILE.       JJJ0907
*                                                                        JJJ0907
*     8. IF FAALTPOS[0]=0 AND PTCUREC[0] IS NOT 0,
*     IT MEANS THE PTREE FROM THE TOP DOWN TO THE CURRENT LEVEL 
*     IS ((AUTHENTIC)), I.E. ITS CONTENTS POINT COHERENTLY TO 
*     ONE RECORD. OTHERWISE, IF WE HAVE TO LOOK BEYOND THE CURRENT
*     DATA BLOCK, THEN THE PTREE CONTENTS HAVE TO BE GENERATED
*     ANEW FROM THE TOP DOWN. 
*                                                                        JJJ0907
* DC  EXIT CONDITIONS                                                    JJJ0907
*                                                                        JJJ0907
*     1. QMF = 1 IF A MATCH WAS FOUND.                                   JJJ0907
*          THEN QNE = 1 IF QREL IS REL"GE" AND THE MATCH IS ONE          CY210
*     OF INEQUALITY. IF QREL IS REL"GE" AND THE MATCH                    CY210
*     IS ONE OF EQUALITY, QNE = 0. UNDER ANY OTHER CONDITIONS, QNE       JJJ0907
*     IS NOT PREDICTABLE.                                                JJJ0907
*                                                                        JJJ0907
*     2. IF THERE IS A MATCH, THE PTREE WILL POINT TO THE MATCHING       JJJ0907
*     RECORD.                                                            JJJ0907
*     ALSO, VARIABLES RECFWA, RECLWA, AND RECLNG WILL CONTAN THE FWA,    JJJ0907
*     LWA+1, AND LENGTH IN WORDS OF THE RECORD, AS IT SITS IN ITS        JJJ0907
*     BLOCK IMAGE. THE RECORD BEGINS WITH THE FIRST CHARACTER AT         JJJ0907
*     RECFWA, BUT SOME OF THE CHARACTERS AT THE END OF THE               JJJ0907
*     WORD AT RECLWA-1 MAY BE GARBAGE. THE NUMBER OF UNUSED CHARACTERS   JJJ0907
*     IS CONTAINED IN BITS 26-29 OF THE ONE-WORD VARIABLE RECPTR.        JJJ0907
*     NOTE THAT THE RECORD HAS NOT BEEN DECOMPRESSED, AND THE KEY HAS    JJJ0907
*     NOT BEEN DECOLLATED.                                               JJJ0907
*                                                                        CY210
*     TEMPLOC AND TEMPOS GIVE THE FWA AND STARTING CHARACTER             CY210
*     POSITION OF THE KEY, IF EMBEDDED, IN THE MATCHING RECORD.          CY210
*                                                                        JJJ0907
*     IF MAJKEY IS LESS THAN THE FULL LENGTH OF A KEY IN THIS FILE OR    JJJ0907
*     SUBFILE, THERE MAY BE MORE THAN ONE RECORD WHOSE KEY PROVIDES AN   JJJ0907
*     EXACT MATCH. IF SO, THE MATCHING RECORDS WILL ALL BE TOGETHER IN   JJJ0907
*     THE FILE, AND THE FIRST OF THEM WILL BE COUNTED AS THE MATCHING    JJJ0907
*     RECORD. BUT IF QREL = REL"GT", THE WANTED RECORD IS THE            JJJ1009
*     FIRST AFTER THE GROUP.                                             JJJ1009
*                                                                        JJJ0907
*     3. IF QMF = 0, A MATCH HAS NOT BEEN FOUND, BUT THE INTERPRETATION  JJJ0907
*     DEPENDS ON WHETHER THE INCOMING PARAMETER (NUMBER 1 UNDER ((ENTRY  JJJ0907
*     CONDITIONS)) ABOVE) WAS NEGATIVE OR NON-NEGATIVE. IF NEGATIVE,     JJJ0907
*     EZKY$IS HAS NOT COMPLETED ITS WORK UNLESS TWO CONDITIONS ARE       JJJ0907
*     FULFILLED -- CURPTR NOW = THE NUMBER                               JJJ0907
*     OF INDEX LEVELS IN THE FILE OR SUBFILE, AND PTBLKIN[CURPTR] IS 1,  CY210
*     INDICATING THAT THE DATA BLOCK IS ACTUALLY IN CORE.                JJJ0907
*     IF NON-NEGATIVE, EZKY$IS WILL HAVE COMPLETED ITS WORK AND CURPTR   JJJ0907
*     AND PTBLKIN[CURPTR] WILL HAVE THOSE VALUES.                        CY210
*                                                                        JJJ0907
*     IF, THEN, EZKY$IS HAS COMPLETED ITS WORK AND QMF = 0, THE FILE     JJJ0907
*     OR SUBFILE WILL BE POSITIONED AT THE EARLIEST RECORD WHOSE KEY     JJJ0907
*     IS TOO GREAT, OR AT EOI IF THERE IS NO SUCH RECORD.                JJJ0907
*                                                                        JJJ0907
*     4. WHATEVER QMF IS, IF EZKY$IS HAS COMPLETED ITS WORK AS           JJJ0907
*     EXPLAINED ABOVE, THE QFR, QLR, AND QEI FLAGS IN THE PTREE WILL     JJJ0907
*     BE SET CORRECTLY -- QFR = 1 ONLY IF POSITIONED ON THE FIRST        JJJ0907
*     LIVE RECORD IN THE FILE OR SUBFILE, QLR = 1 ONLY IF POSITIONED     JJJ0907
*     ON THE LAST, AND QEI = 1 ONLY IF POSITIONED AT EOI.                JJJ0907
*     NOTE THAT IF QEI = 1, QFR = QLR = 0. WHEN THE FILE CONTAINS NO     JJJ0907
*     RECORDS, THE POSITION WILL ALWAYS BE EOI.                          JJJ0907
*                                                                        JJJ0907
*     5. WHATEVER QMF IS, RNO = RECORD NUMBER AT WHICH POSITIONED.       JJJ0907
*     --EXCEPT IN THE EXCEPTIONAL CASE NOTED ABOVE FOR ((PUT)). IF       JJJ0907
*     THE INCOMING PARAMETER IS GREATER THAN ZERO, AND THERE IS NO       JJJ0907
*     MATCHING RECORD, AND THE FIRST HIGHER RECORD IS THE FIRST IN       JJJ0907
*     A BLOCK, WE ARE LEFT POSITIONED, ACCORDING TO THE PTREE, ON        JJJ0907
*     THE LAST RECORD IN THE PRECEDING BLOCK, BUT RNO = -1.              JJJ0907
*                                                                        JJJ0907
* DC  ERROR CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     NONE DETECTED BY EZKY$IS ITSELF.                                   JJJ0907
*                                                                        JJJ0907
* DC  CALLED ROUTINES                                                    JJJ0907
*                                                                        JJJ0907
*     GOKY$IS -- DOES THE FULL SEARCH FOR THE GIVEN KEY THROUGH THE      JJJ0203
*        INDEX, STARTING WITH THE PRIMARY INDEX BLOCK.                   JJJ0907
*     CURR$AA -- MAKES SURE THE RECORD POINTED TO BY THE CURRRENT PTREE  JJJ0907
*        WORD IS IN CORE, AND LOCATES IT.                                JJJ0907
*     SKPF$AA -- MOVES FORWARD ONE RECORD.                               JJJ0907
*     CPKY$AA -- COMPARES THE GIVEN KEY WITH SOME RECORD IN THE CURRENT  JJJ0907
*        DATA BLOCK.                                                     JJJ0907
*     GOFI$AA -- CALLED BY THE MACROS GOSTARTFILE AND GOENDFILE, TO      JJJ0907
*        POSITION THE FILE OR SUBFILE AT THE FIRST RECORD OR AT EOI.     JJJ0907
*     FRLR$AA -- TO SET QFR AND QLR WHEN A POSITION HAS BEEN REACHED.    JJJ0907
*                                                                        JJJ0907
* DC  NON-LOCAL VARIABLES                                                JJJ0907
*                                                                        JJJ0907
*     MATRESL, SMALREC, AND COND, BESIDES THE RESULT VARIABLES           CY210
*     MENTIONED UNDER ((EXIT CONDITIONS)) ABOVE.                         CY210
*                                                                        JJJ0907
 #                                                                       JJJ0907
                                                                         JJJ0907
CONTROL EJECT;               #START OF EZKY$IS CODE#                     ID0913 
      ITEM HOW ;                                                         CY210
                                                                         CY210
      IF FAALTPOS[0] NQ 0 THEN PTCUREC[0] = 0 ; 
      IF MAJKEY EQ KLENG AND RECCNT NQ 0                                 CY210
        AND CURPTR EQ NLEV AND PTBLKIN[CURPTR] NQ 0                      CY210
      THEN                                                               CY210
          BEGIN                                                          CY210
          QFR = 0 ;                                                      CY210
          QLR = 0 ;                                                      CY210
          QEI = 0 ;                                                      CY210
          QNE = 1 ;                                                      CY210
          QMF = 0 ;                                                      CY210
          P<BLOK$AA> = PTCURBADR[CURPTR] ;                               CY210
          LKEY$AA ;                                                      CY210
          IF UUCC$AA ( 1 ) EQ DEAD
          THEN
              BEGIN 
              GOTO QUICKOUT ; 
              END 
          MATRESL = 0 ;                                                  CY210
          CPKY$AA ( 1 ) ;                                                CY210
          IF COND EQ 0                                                   CY210
          THEN                                                           CY210
              BEGIN                                                      CY210
              MATRESL = 1 ;                                              CY210
              GOTO EASYPZ ;                                              CY210
              END                                                        CY210
          IF COND LS 0                                                   CY210
          THEN                                                           CY210
              BEGIN                                                      CY210
              IF BLOCKID[0] EQ FIRDAT                                    CY210
              THEN                                                       CY210
                  BEGIN                                                  CY210
                  GOSTARTFILE ;                                          CY210
                  GOTO EASYKEW ;                                         CY210
                  END                                                    CY210
              ELSE                                                       CY210
                  BEGIN                                                  CY210
                  GOTO QUICKOUT ;                                        CY210
                  END                                                    CY210
              END                                                        CY210
          ELSE                                                           CY210
              BEGIN                                                      CY210
              IF RC NQ 1                                                 CY210
              THEN                                                       CY210
                  BEGIN                                                  CY210
                  CPKY$AA ( RC ) ;                                       CY210
                  END                                                    CY210
              IF COND EQ 0                                               CY210
              THEN                                                       CY210
                  BEGIN                                                  CY210
                  MATRESL = RC ;                                         CY210
                  GOTO EASYPZ ;                                          CY210
                  END                                                    CY210
              ELSE                                                       CY210
                  BEGIN                                                  CY210
                  IF COND GR 0                                           CY210
                  THEN                                                   CY210
                      BEGIN                                              CY210
                      IF FWD EQ 0                                        CY210
                      THEN                                               CY210
                          BEGIN                                          CY210
                          GOENDFILE ;                                    CY210
                          GOTO EASYKEW ;                                 CY210
                          END                                            CY210
                      ELSE                                               CY210
                          BEGIN                                          CY210
                          IF HOW GR 0 AND PTBLKIN[CURPTR-1] NQ 0         AM2A089
                                  AND PTCUREC[0] NQ 0 
                          THEN                                           AM2A089
                              BEGIN                                      AM2A089
                              SEBL$AA ( CURPTR-1 , 1 ) ;                 AM2A089
                              RNO = PTCUREC[CURPTR-1] ;                  AM2A089
                              IF RNO NQ 0 AND RNO LS RC                  AM2A089
                              THEN                                       AM2A089
                                  BEGIN                                  AM2A089
                                  CPKY$AA ( RNO ) ;                      AM2A089
                                  IF COND GR 0                           AM2A089
                                  THEN                                   AM2A089
                                      BEGIN                              AM2A089
                                      CPKY$AA ( RNO+1 ) ;                AM2A089
                                      IF COND LS 0                       AM2A089
                                      THEN                               AM2A089
                                          BEGIN                          AM2A089
                                          SEBL$AA ( CURPTR , 1 ) ;       AM2A089
                                          PTCUREC[CURPTR] = RC ;         AM2A089
                                          FRLR$AA ;                      AM2A089
                                          RNO = -1 ;                     AM2A089
                                          RETURN ;                       AM2A089
                                          END                            AM2A089
                                      END                                AM2A089
                                  END                                    AM2A089
                              END                                        AM2A089
                          GOTO QUICKOUT ;                                CY210
                          END                                            CY210
                      END                                                CY210
                  ELSE                                                   CY210
                      BEGIN                                              CY210
                      BNCH$AA ;                                          CY210
                      END                                                CY210
                  END                                                    CY210
              END                                                        CY210
          IF MATRESL EQ 0                                                CY210
          THEN                                                           CY210
              BEGIN                                                      CY210
              PTCUREC[CURPTR] = SMALREC ;                                CY210
              END                                                        CY210
          ELSE                                                           CY210
              BEGIN                                                      CY210
 EASYPZ:                                                                 CY210
              PTCUREC[CURPTR] = MATRESL ;                                CY210
              END                                                        CY210
          CURR$AA ;                                                      CY210
          IF MATRESL EQ 0 OR UCCFIELD EQ DEAD                            CY210
          THEN                                                           CY210
              BEGIN                                                      CY210
              SKPF$AA ;                                                  CY210
              END                                                        CY210
          ELSE                                                           CY210
              BEGIN                                                      CY210
              QNE = 0 ;                                                  CY210
              QMF = 1 ;                                                  CY210
              END                                                        CY210
          FRLR$AA ;                                                      CY210
 EASYKEW:                                                                CY210
          IF QREL EQ REL"GT"                                             CY210
          THEN                                                           CY210
              BEGIN                                                      CY210
              IF QMF NQ 0                                                CY210
              THEN                                                       CY210
                  BEGIN                                                  CY210
                  SKPF$AA ;                                              CY210
                  END                                                    CY210
              QMF = 1 - QEI ;                                            CY210
              QNE = 1 ;                                                  CY210
              END                                                        CY210
          ELSE                                                           CY210
              BEGIN                                                      CY210
              IF QREL EQ REL"GE"                                         CY210
              THEN                                                       CY210
                  BEGIN                                                  CY210
                  QMF = 1 - QEI ;                                        CY210
                  END                                                    CY210
              END                                                        CY210
          RETURN ;                                                       CY210
          END                                                            CY210
 QUICKOUT:                                                               CY210
      CURPTR = 0 ;                                                       CY210
      GOKY$IS ( HOW ) ;                                                  CY210
      END                                                                CY210
CONTROL EJECT;                                                           ID0913 
PROC GET$IS;                                                             ID0913 
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   GET$IS - GET A RECORD FROM AN I-S FILE                   PAGE 1    ID0913 
* *   A.F.R.BROWN                                                        ID0913 
* *   VB GODDARD                                 DATE  76/09/16          JJJ1001
* 1DC GET$IS                                                             ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO GET A RECORD, BY PRIMARY OR ALTERNATE KEY, AND SAVE THE         ID0913 
*     POSITION FOR THE BENEFIT OF LATER GETNEXT OR SKIP OPERATIONS.      ID0913 
*     OR TO DO A START.                                                  CY210
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     FIT$AA, FSTT$AA, FIAT$AA, PTRE$AA, AND FINF$AA ARE POINTING TO THE JJJ1001
*     PROPER TABLES FOR THE DATA FILE.                                   JJJ1001
*     FTKA[0] AND FTKP[0] LOCATE THE START OF THE KEY PROPOSED BY THE    ID0913 
*       CALLER.                                                          ID0913 
*     FTKL[0], FTRKW[0], AND FTRKP[0] GIVE THE LENGTH OF THE KEY AND     ID0913 
*       ITS RELATIVE STARTING POSITION IN A RECORD. IF THESE ARE THE     ID0913 
*       SAME AS THE FSTT GIVES FOR PRIMARY KEYS, THE GET IS BY           ID0913 
*       PRIMARY KEY. OTHERWISE BY ALTERNATE KEY.                         ID0913 
*     MKEYLNG CONTAINS THE ((MAJOR KEY LENGTH)), I.E. THE NUMBER OF      ID0913 
*       CHARACTERS OF KEY TO BE ACTUALLY MATCHED. THIS IS A COPY OF      ID0913 
*       THE ORIGINAL FTMKL[0] FIELD OF THE FIT. IF IT IS 0, THE FULL     ID0913 
*       LENGTH OF THE KEY IS TO BE USED.                                 ID0913 
*     FTREL[0] IN THE FIT DEFINES THE KIND OF RELATION SOUGHT BETWEEN    ID0913 
*       THE GIVEN KEY AND A KEY IN A RECORD. SEE THE COMMENTS ON         ID0913 
*       GOKY$IS FOR DETAILS.                                             ID0913 
*     FTWSA[0] IS THE FWA OF THE AREA INTO WHICH THE RECORD IS TO BE     ID0913 
*       COPIED, BEGINNING AT THE LEFTMOST CHARACTER.                     ID0913 
*     FTMRL[0] IS THE MAXIMUM LENGTH, IN CHARACTERS, OF THE RECORD       CY210
*       THAT CAN BE ACCEPTED IN THE FTWSA[0] AREA. IF THE ACTUAL         CY210
*       RECORD IS TOO LONG, THERE WILL BE A NON-FATAL ERROR, KEY         CY210
*       VALUE(S) WILL BE RETURNED IF CALLED FOR, BUT THE RECORD          CY210
*       WILL NOT BE RETURNED. HOWEVER, IF THE OPERATION IS A             CY210
*       START, NO ERROR.                                                 CY210
*     FTNDX[0] IS NORMALLY 0, BUT IS 1 FOR AN INDEX-ONLY MIP OPERATION.  CY210
*       SEE THE COMMENTS TO GET$MP FOR THIS.                             CY210
*     IF MKEYLNG IS NOT 0, THE FULL-LENGTH KEY VALUE WILL BE RETURNED    CY210
*       WHERE FTKA[0] AND FTKP[0] POINT.                                 CY210
*     FTPKA[0], IF NOT 0, AND IF THE OPERATION IS BY ALTERNATE KEY,      CY210
*       CAUSES THE PRIMARY KEY OF THE LOCATED RECORD TO BE RETURNED,     CY210
*       BEGINNING IN THE FIRST CHARACTER OF THE WORD FTPKA[0] POINTS TO. CY210
*     FTCOP[0] CONTAINS A CODE TELLING WHETHER THE CURRENT OPERATION     CY210
*       IS A GET OR A START.                                             CY210
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     IF THERE WAS A MATCH, THE RECORD HAS BEEN COPIED, THE FILE         ID0913 
*       IS CONSIDERED POSITIONED ON THAT RECORD, AND THE XFER FLAG IS 1. ID0913 
*     IF THERE WAS NO MATCH, THERE IS A NON-FATAL ERROR, NO RECORD IS    ID0913 
*       COPIED, THE XFER FLAG IS 0, AND THE FILE IS POSITIONED ON THE    ID0913 
*       NEXT-HIGHER RECORD, OR AT EOI IF THE GIVEN KEY WAS TOO HIGH      ID0913 
*       FOR ANY RECORD.                                                  ID0913 
*     XFER = 0 FOR A START, OR 1 FOR A GET (UNLESS NO MATCH), INDICATING CY210
*       THAT START POSITIONS AT THE BEGINNING, AND GET AT THE END, OF    CY210
*       THE RECORD.                                                      CY210
*     FTFP[0] AND FAFP[0] ARE TWO FP FIELDS, THE FIRST IN THE FIT WHERE  CY210
*       THE CALLER IS SUPPOSED TO SEE IT, AND THE SECOND IN THE FIAT     CY210
*       WHERE IT IS SAFER FROM THE USER. IF WE ARE POSITIONED AT EOI,    CY210
*       BECAUSE THE GIVEN KEY WAS TOO HIGH, BOTH FP FIELDS CONTAIN       CY210
*       100B, WHICH IS DEFINED AS ((EOI)). OTHERWISE, THEY CONTAIN       CY210
*       20B, WHICH IS DEFINED AS ((EOR)).                                CY210
*     POSITION INFORMATION IS STORED, NOT ONLY IN THE RELEVANT PTREE(S), ID0913 
*       BUT ALSO IN FAPOSKEY1[0] AND THE AREA POINTED TO BY              ID0913 
*       FAPKY3ADR[0] (PRIMARY KEY) OR FAPKY2ADR[0] (ALTERNATE KEY).      ID0913 
*       IF PRIMARY, FAPOSKEY1[0] = 0. OTHERWISE, IT CONTAINS, IN VARIOUS ID0913 
*       FIELDS, THE CURRENT FTKL[0], FTRKW[0], AND FTRKP[0].             ID0913 
*     FTKNE[0] IS SIGNIFICANT ONLY AFTER A START BY ALTERNATE KEY,       CY210
*       WHEN FTREL[0] IS REL"GE". THEN FTKNE[0] WILL BE 0 IF THERE       CY210
*       WAS AN EQUAL KEY IN THE FILE, OR 1 IF WE POSITIONED ON           CY210
*       THE LOWEST HIGHER KEY.                                           CY210
*     FTRL[0] CONTAINS THE LENGTH OF THE RECORD, IN CHARACTERS.          ID0913 
*       IF THIS IS NOT A MULTIPLE OF 10, THE EXTRA CHARACTERS IN THE     ID0913 
*       LAST WORD OF THE AREA INTO WHICH THE RECORD WAS COPIED WILL      ID0913 
*       NOT HAVE BEEN PRESERVED, BUT OVERLAID WITH GARBAGE FROM THE      ID0913 
*       FILE. BUT NOT BEYOND THE LIMIT SET BY FTMRL[0]. E.G.,IF FTMRL[0] CY210
*       IS 60, AND THE RECORD IS 57 CHARACTERS LONG, 3 CHARACTERS OF     CY210
*       GARBAGE WILL BE MOVED. IF FTMRL[0] IS 55, NONE OF THE RECORD     CY210
*       WILL BE MOVED, NON-FATAL ERROR. BUT IF FTMRL[0] IS BETWEEN 57    CY210
*       AND 59 INCLUSIVE, THEN THE EXTRA 3 CHARACTERS AT THE END OF THE  CY210
*       6TH WORD IN THE DESTINATION AREA WILL BE LEFT UNCHANGED.         CY210
*     THE KEY IS IN KA FOR MAJOR KEY GETS.                               JJJ1001
*     PTOF[0] IS CLEARED TO 0. THIS IS AN OVERRIDING POSITION FIELD IN   CY210
*       THE PTREE, THAT CAN BE SET AT OPEN TIME TO SHOW REWOUND OR EOI   CY210
*       POSITION WITHOUT BOTHERING TO LOOK AT THE FILE ITSELF.           CY210
*     FSGETCNT[0] HAS BEEN INCREMENTED BY 1, IF THE OPERATION IS A       CY210
*       GET AND IS SUCCESSFUL.                                           CY210
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     EC445 - RECORD NOT FOUND                                           JJJ1001
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     QUMP$AA - TO DECIDE IF WE ARE WORKING BY PRIMARY OR ALTERNATE      ID0913 
*       KEY.                                                             ID0913 
*     GET$MP - TO DO MOST OF THE WORK IF BY ALTERNATE KEY.               ID0913 
*     SIKH$IS - TO TAKE ADVANTAGE OF PREVIOUS SEEKS, IF POSSIBLE.        ID0913 
*     GOKY$IS - TO LOCATE BY KEY IF THERE WERE RELEVANT PREVIOUS SEEKS.  ID0913 
*     EZKY$IS - TO LOCATE BY KEY IF NOT.                                 ID0913 
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0], AND TO SAVE THE CY210
*       PRIMARY KEY VALUE FOR POSITION INFORMATION.                      CY210
*     RDRC$AA - TO COPY THE RECORD TO THE USER AREA, AND RETURN KEY      CY210
*       VALUE(S) TO THE USER IF CALLED FOR.                              CY210
*     MSGZ$AA - TO OUTPUT ERROR MESSAGES                                 JJJ1001
*     KPTR$IS - SET KEY POINTERS AND TRANSLATE KEY                       JJJ1116
*     EXIT$AA - TO EXIT FOLLOWING ERROR DETECTION                        JJJ1001
*     VOKG$AA - TO VERIFY OK FOR GET.                                    CIM0214
*     POSTGMP - TO LOCATE A DATA RECORD BY PRIMARY KEY, AFTER THE        DABBLE 
*       MIP ROUTINE HAS EXTRACTED IT FROM THE MIP FILE.                  DABBLE 
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     NONE                                                               CY210
*                                                                        ID0913 
* DC  DESCRIPTION                                                        JJJ1001
                                                                         JJJ1001
*     VOKG$AA IS CALLED TO VERIFY THAT IT IS OK TO DO A GET.             CIM0214
*     IF THE GET IS BY ALTERNATE KEY, GET$MP IS CALLED TO PROCESS THE    JJJ1001
*     GET COMPLETELY.                                                    JJJ1001
*     FAPOSKEY1 IS ZEROED.                                               JJJ1001
*     IF THE KEY IS SYMBOLIC, IT IS TRANSLATED AND CHECKED FOR MAJOR     JJJ1001
*     KEY GET.                                                           JJJ1001
*     KEY DESCRIPTOR FIELDS IN GCOM$AA ARE SET UP FOR THE SEARCH         JJJ1001
*     ROUTINES.                                                          JJJ1001
*     THE SEARCH ROUTINES ARE CALLED TO LOCATE THE RECORD.               JJJ1001
*     THE PRIMARY KEY IS SAVED IF NOT AT EOI.                            JJJ1001
*     IF THE SEARCH FAILED, THE GET IS REJECTED.                         JJJ1001
*     IF THE GET WAS MAJOR KEY, MAMF$AA IS CALLED TO MOVE THE            JJJ1001
*     COMPLETE KEY TO KA.                                                JJJ1001
*     RDRC$AA IS CALLED TO MOVE THE LOCATED RECORD TO WSA,               JJJ1001
*     DECOMPRESSING IF NECESSARY.                                        JJJ1001
*     STAT$AA IS CALLED TO SET FILE POSITIONING IN THE FIT.              JJJ1001
*     THE FSTT GET COUNT IS INCREMENTED BY 1.                            JJJ1001
                                                                         JJJ1001
 #                                                                       ID0913 
CONTROL EJECT;                                                           JJJ1001
                             #START OF GET$IS CODE#                      JJJ0916
      VOKG$AA;    #VERIFY OK TO GET#                                     CIM0214
      XFER=0;                                                            JJJ1001
      PTOF = 0;              #CLEAR FILE NOT POSITIONED FLAG#            JJJ0203
      IF QUMP$AA(0) NQ 0                                                 JJJ1001
      THEN                   #GET BY ALTERNATE KEY#                      JJJ1001
          BEGIN                                                          JJJ1001
          GET$MP;                                                        JJJ1001
          IF FTNDX[0] NQ 0 OR FTCOP[0] NQ OP"GET"                        AFB0801
          THEN                                                           DABBLE 
              BEGIN                                                      DABBLE 
              RETURN ;                                                   DABBLE 
              END                                                        DABBLE 
          ELSE                                                           DABBLE 
              BEGIN                                                      DABBLE 
              POSTGMP ;                                                  DABBLE 
              END                                                        DABBLE 
          END                                                            JJJ1001
      ELSE                   #GET BY PRIMARY KEY#                        JJJ1001
          BEGIN                                                          JJJ1001
          KPTR$IS ( 0 ) ;                                                JJJ1116
          FAPOSKEY1[0]=0;                                                JJJ1001
              IF SIKH$IS EQ 0                                            AFB0214
          THEN               #GET AFTER SEEK#                            JJJ1001
              BEGIN                                                      JJJ1001
              GOKY$IS(0);                                                JJJ1001
              END                                                        JJJ1001
          ELSE               #NORMAL GET#                                JJJ1001
              BEGIN                                                      JJJ1001
              EZKY$IS(0);                                                JJJ1001
              END                                                        JJJ1001
          IF QEI EQ 0                                                    JJJ1001
          THEN                                                           JJJ1001
              BEGIN                                                      JJJ1001
              FILPOS ( EOR ) ;                                           AFB0517
              END                                                        AFB0517
          ELSE                                                           AFB0517
              BEGIN                                                      AFB0517
              FILPOS ( EOI ) ;                                           AFB0517
              END                                                        AFB0517
          END                                                            JJJ0413
      IF QMF EQ 0            #ERROR IF KEY NOT FOUND#                    CY210
      THEN                                                               CY210
          BEGIN                                                          CY210
          MSGZ$AA (EC445);                                               CY210
          GOTO EXIT$AA;                                                  CY210
          END                                                            CY210
                                                                         CY210
      IF FTFP[0] NQ EOI THEN RDRC$AA ;                                   AFB0517
      IF FTCOP[0] EQ OP"GET"                                             JJJ0413
      THEN                                                               JJJ0413
          BEGIN                                                          JJJ0413
          FSGETCNT[0]=FSGETCNT[0]+1;   #INCREMENT GET COUNT#             JJJ1001
          END                                                            JJJ1001
      END                                                                JJJ1001
CONTROL EJECT;                                                           ID0913 
PROC GETN$IS;                                                            ID0913 
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   GETN$IS - GET NEXT RECORD IN AN I-S FILE                 PAGE 1    ID0913 
* *   A.F.R.BROWN                                                        ID0913 
* *   VB GODDARD                                 DATE  76/09/24          JJJ1001
* 1DC GETN$IS                                                            ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO GET A RECORD FROM AN I-S FILE, RATHER AS GET$IS DOES. BUT       ID0913 
*     INSTEAD OF CHOOSING THE RECORD BY KEY, WE SIMPLY TAKE THE          ID0913 
*     ((NEXT)) RECORD. THIS IS INDEED THE NEXT IN KEY SEQUENCE, IF       ID0913 
*     THE LAST RELEVANT OPERATION WAS A GET OR GETNEXT, OR ELSE THE      ID0913 
*     CURRENT RECORD IF THE LAST RELEVANT OPERATION WAS A SKIP OR        ID0913 
*     REWIND. OPEN COUNTS AS REWIND BY PRIMARY KEY. PUT, DELETE, AND     ID0913 
*     REPLACE DO NOT AFFECT POSITION IN THIS SENSE, SO DO NOT COUNT      ID0913 
*     AS ((RELEVANT)) (EXCEPT WHERE DELETE REMOVES THE RECORD THAT       ID0913 
*     WOULD HAVE BEEN CALLED CURRENT AT THIS POINT, AND FORCES THE       ID0913 
*     NEXT RECORD TO BE TAKEN BY GETNEXT.)                               ID0913 
*                                                                        ID0913 
*     THE KEY CHOICE OF THE LAST RELEVANT OPERATION, PRIMARY OR          ID0913 
*     ALTERNATE, AND IF ALTERNATE WHICH ONE, DETERMINES THE KEY          ID0913 
*     CHOICE FOR GETNEXT. THIS IS WHY A REWIND BY ALTERNATE KEY IS       ID0913 
*     PROVIDED. AN OPEN, HOWEVER, ALWAYS COUNTS AS A REWIND BY PRIMARY   ID0913 
*     KEY.                                                               ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     FIT$AA, FSTT$AA, FIAT$AA, PTRE$AA, AND FINF$AA ARE POINTING TO THE JJJ1001
*     IF PTOF[0]=1, THE FILE IS CONSIDERED REWOUND THOUGH IT MAY NOT     CY210
*       REALLY HAVE BEEN LOOKED AT. IF PTOF[0]=2, THE FILE IS            CY210
*       CONSIDERED TO BE AT EOI, THOUGH NOT YET LOOKED AT.               CY210
*       ONCE THE FILE HAS BEEN ACCESSED IN SOME POSITIONAL WAY (RATHER   CY210
*       THAN BY AN UPDATE OPERATION) AFTER OPEN, PTOF[0] IS 0.           CY210
*     IF FAFP[0]=100B (CALLED EOI) WE ARE AT EOI.                        CY210
*     OTHERWISE, POSITION IS RECORDED IN FAPOSKEY1[0] AND IN THE         CY210
*       AREA FAPKY3ADR[0] OR FAPKY2ADR[0] POINTS TO. THIS IS DESCRIBED   ID0913 
*       IN THE ((EXIT CONDITIONS)) TO GET$IS.                            ID0913 
*     FTKA[0] AND FTKP[0] DO NOT NORMALLY POINT TO A KEY THAT            CY210
*       IDENTIFIES THE WANTED RECORD. HOWEVER, IF FTNDX[0]=1,            CY210
*       A PECULIAR OPERATION IS BEING PERFORMED, AND FTKA[0]             CY210
*       AND FTKP[0] DO POINT TO A KEY. SEE THE COMMENTS TO               CY210
*       GETN$MP.                                                         CY210
*     FOR THE REST, THE ENTRY CONDITIONS ARE THE SAME AS FOR             CY210
*       SUBROUTINE GET$IS.                                               CY210
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     ESSENTIALLY THE SAME AS FOR GET$IS.                                CY210
*     FSGTNCNT[0] HAS BEEN INCREASED BY 1.                               CY210
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     EC100 - GETN AT EOI, FP WAS=EOI AT ENTRY.                          CY210
*     NOTE011 - POSITIONED ON LAST RECORD AT ENTRY, NOW AT EOI.          CY210
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     GETN$MP - TO DO MOST OF THE WORK IF THE ACCESS IS BY               CY210
*       ALTERNATE KEY.                                                   CY210
*     MSGZ$AA - TO OUTPUT ERROR MESSAGES.                                JJJ1001
*     POST$IS - TO RECOVER OUR POSITION ACCORDING TO THE MOST RECENT     CY210
*       RELEVANT OPERATION.                                              ID0913 
*     RDRC$AA - TO COPY THE RECORD TO THE USER AREA, AND RETURN          CY210
*       ONE OR TWO KEYS TO THE USER IF CALLED FOR.                       CY210
*     OPOS$IS - TO TRANSLATE A NON-ZERO IN PTOF[0] INTO A ((REAL))       CY210
*       POSITION AT BEGINNING OR EOI.                                    CY210
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0], AND TO          CY210
*       SAVE THE PRIMARY KEY VALUE FOR POSITION INFORMATION.             CY210
*     VOKG$AA - TO VERIFY OK FOR GETN.                                   CIM0214
*     POSTGMP - TO LOCATE THE DATA RECORD BY PRIMARY KEY, AFTER          DABBLE 
*       THE MIP ROUTINE HAS FOUND THE PRIMARY KEY IN THE MIP FILE.       DABBLE 
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
* DC  DESCRIPTION                                                        JJJ1001
                                                                         JJJ1001
*     VOKG$AA IS CALLED TO VERIFY THAT IT IS OK TO DO A GETN.            CIM0214
*     ATTEMPTING TO READ PAST EOI IS AN ERROR CONDITION.                 JJJ1001
*     A MESSAGE IS GENERATED IF THIS REQUEST REACHED EOI.                JJJ1001
*     GETN BY ALTERNATE KEY IS PROCESSED BY PROC GETN$MP.                JJJ1001
*     GETN BY PRIMARY KEY ARE PROCESSED BY PROCS ISPOSIT, MAMF$AA,       JJJ1001
*     RDRC$AA,AND STAT$AA.                                               JJJ1001
*     THE FSTT GETN COUNT IS INCREMENTED BY 1.
                                                                         JJJ1001
 #                                                                       JJJ1001
CONTROL EJECT;                                                           JJJ1001
                             #START OF GETN$IS CODE#                     JJJ0916
      VOKG$AA;     #VERIFY OK TO GETN#                                   CIM0214
      IF PTOF NQ 0                                                       AFB1208
      THEN                                                               AFB1208
          BEGIN                                                          AFB1208
          OPOS$IS;           #DO OPEN POSITIONING#                       AFB1208
          END                                                            AFB1208
      IF FAFP[0] EQ EOI                                                  AFB0222
      THEN                                                               AFB0222
          BEGIN                                                          AFB0222
          FTFP[0] = EOI ;                                                AFB0222
          MSGZ$AA(EC100); 
          GOTO EXIT$AA ;                                                 AFB0222
          END                                                            AFB0222
      IF FAPOSKEY1[0] NQ 0   #PRIMARY OR ALTERNATE KEY#                  JJJ1001
      THEN                   #ALTERNATE#                                 JJJ1001
          BEGIN                                                          JJJ1001
          GETN$MP;                                                       JJJ1001
          IF FTNDX[0] NQ 0                                               DABBLE 
          THEN                                                           DABBLE 
              BEGIN                                                      DABBLE 
              RETURN ;                                                   DABBLE 
              END                                                        DABBLE 
          ELSE                                                           DABBLE 
              BEGIN                                                      DABBLE 
              POSTGMP ;                                                  DABBLE 
              END                                                        DABBLE 
          END                                                            JJJ1001
      ELSE                   #PRIMARY#                                   JJJ1001
          BEGIN                                                          JJJ1001
          POST$IS;           #POSN TO NEXT RECORD FROM CURRENT# 
          IF QEI EQ 0        #WAS END OF FILE REACHED#                   JJJ1001
          THEN               #NO#                                        JJJ1001
              BEGIN                                                      JJJ1001
                  FILPOS(EOR) ;                                          AFB0222
              END                                                        JJJ1001
          END                                                            JJJ1001
      IF QEI NQ 0            #PRIMARY OR ALTERNATE KEY EOI#              JJJ1001
      THEN                   #AT EOI#                                    JJJ1001
          BEGIN                                                          JJJ1001
          FILPOS(EOI) ;                                                  AFB0222
          MSGZ$AA(NOTE011);  #AT END MESSAGE#                            JJJ1001
          END                                                            JJJ1001
      ELSE                   #NOT AT"EOI#                                JJJ1001
          BEGIN                                                          JJJ1001
              RDRC$AA ;                                                  AFB0222
          FSGTNCNT = FSGTNCNT + 1 ;    # INCREMENT GETN COUNT # 
          END                                                            JJJ1001
      END                                                                JJJ1001
CONTROL EJECT;                                                           ISISMOD
     PROC GOKY$IS ( HOW ) ; BEGIN ITEM HOW , WHY ;                       ISISIS 
                                                                         JJJ0907
 #                                                                       JJJ0907
* *   GOKY$IS - LOCATE AN I-S RECORD BY KEY                PAGE  1       JJJ0203
* *   A.F.R.BROWN                                                        JJJ0907
* 1DC GOKY$IS                                                            JJJ0203
*                                                                        JJJ0907
* DC  FUNCTION                                                           JJJ0907
*                                                                        JJJ0907
*     TO LOCATE A RECORD BY KEY, IN AN I-S FILE OR AN I-S SUBFILE        JJJ0907
*     OF A MIP FILE, OR TO POSITION TO THE NEXT HIGHER KEY, IF THERE     JJJ0907
*     IS NO MATCH. THE LATTER IS THE NECESSARY PRELIMINARY TO A          JJJ0907
*     PUT-BY-KEY.                                                        JJJ0907
*                                                                        JJJ0907
*     THE DIFFERENCE BETWEEN GOKY$IS AND EZKY$IS IS THAT EZKY$IS         JJJ0907
*     IGNORES ANY PROGRESS THROUGH LEVELS OF INDEXING THAT MAY HAVE      JJJ0907
*     BEEN MADE BY EARLIER ((SEEKS)). GOKY$IS ASSUMES THAT THE           JJJ0907
*     CURRENT POSITION INDICATED BY THE PTREE IS AUTHENTIC, AND          JJJ0907
*     STARTS FROM THERE.                                                 JJJ0907
*                                                                        JJJ0907
* DC  ENTRY CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     THESE ARE EXACTLY THE SAME AS FOR EZKY$IS, PLUS AN ADDITION        JJJ0907
*     TO THE REQUIREMENTS ON THE PTREE --                                JJJ0907
*                                                                        JJJ0907
*     1. IF CURPTR = 0, THE ADDITIONAL CONDITION IS SATISFIED,           JJJ0907
*     BECAUSE THAT DENOTES THE PRIMARY INDEX BLOCK, WHICH IS VALID       JJJ0907
*     FOR ALL RECORDS.                                                   JJJ0907
*     2. OTHERWISE, CURPTR INDICATES A PTREE WORD, WHICH POINTS TO       JJJ0907
*     A BLOCK, AND THAT BLOCK MUST BE IN THE CHAIN OF BLOCKS LEADING     JJJ0907
*     FROM THE PRIMARY INDEX TO THE WANTED DATA BLOCK. IF NOT,           JJJ0907
*     GOKY$IS MAY GIVE AN ERRONEOUS RESULT. THERE IS ONE                 CY210
*     EXCEPTION, IF THE INCOMING PARAMETER ((HOW)) IS -3,                CY210
*     WHICH WILL BE EXPLAINED SHORTLY.                                   CY210
*                                                                        JJJ0907
*     SO GOKY$IS IS ONLY CALLED THROUGH EZKY$AA, WHICH ALWAYS SETS       JJJ0907
*     CURPTR = 0 FIRST, OR ELSE AFTER CHECKING THROUGH SIKH$AA TO        JJJ0907
*     SEE WHETHER WE ARE CURRENTLY IN A SERIES OF SEEKS, ALL USING       JJJ0907
*     THE SAME KEY, AND UNINTERRUPTED BY ANYTHING THAT WOULD ALTER       JJJ0907
*     THE FILE.                                                          JJJ0907
*                                                                        CY210
*     THE INCOMING PARAMETER ((HOW)) IS THE SAME ONE THAT EZKY$IS        CY210
*     IS CALLED WITH, BUT THE MEANING OF ITS POSSIBLE NEGATIVE           CY210
*     VALUES, -1, -2, AND -3, IS NOT EXPLAINED THERE.                    CY210
*                                                                        CY210
*     -1 MIGHT BE CALLED THE ((STANDARD)) VALUE, MEANING SIMPLY          CY210
*     THAT IF A BLOCK HAS TO BE READ, IT SHOULD BE READ WITHOUT          CY210
*     RECALL, AND THEN GOKY$IS SHOULD EXIT AFTER PUTTING THE BLOCK       CY210
*     PRU NUMBER INTO THE RELEVANT PTREE WORD.                           CY210
*                                                                        CY210
*     -2 MEANS IN ADDITION THAT WHEN THE CURRENT BLOCK IS A DATA         CY210
*     BLOCK, PRESUMABLY THE ONE THAT CONTAINS THE WANTED RECORD,         CY210
*     GOKY$IS SHOULD NOT DO A BINARY SEARCH FOR THE RECORD.              CY210
*     THIS IS USED BY SEEK$IS, SO THAT THE CP TIME INVOLVED IN           CY210
*     THE BINARY SEARCH IS NOT EXPENDED TILL THE CALLER SHIFTS           CY210
*     FROM SEEK TO GET. AT ALL OTHER LEVELS OF THE FILE, THE             CY210
*     BINARY SEARCH WAS NECESSARY EVEN FOR PURSUING THE SEEK.            CY210
*                                                                        CY210
*     -3 WORKS LIKE -1, ALMOST. ON A GETNEXT-WITHOUT-RECALL, OR          CY210
*     SEEKNEXT, BY PRIMARY KEY, THE FIRST THING WE DO, EVER SO           CY210
*     GENTLY, IS TO FIND THE CURRENT RECORD. ONCE IT IS FOUND,           CY210
*     IF THE NEXT ONE IS IN THE SAME BLOCK, ALL IS SIMPLE.               CY210
*     BUT IF THE NEXT ONE IS AT THE START OF THE NEXT BLOCK, WE          CY210
*     HAVE TO READ THE NEXT BLOCK WITHOUT RECALL AND THEN GO AWAY.       CY210
*     HOW TO RECORD THE SITUATION IN THE PTREE SO AS TO BE               CY210
*     UNDERSTANDABLE WHEN WE COME BACK (QUERY). WE SET THE PTREE         CY210
*     WORD TO THE 0TH RECORD OF THE NEXT BLOCK, WITH THE BLOCK           CY210
*     NOT YET IN CORE. NOW ON THE NEXT GETNEXT-WITHOUT-RECALL,           CY210
*     ASSUMING THE FILE HAS NOT BEEN DISTURBED BY AN UPDATE OR           CY210
*     A SEEK, AND THAT THE NEXT BLOCK IS NOW IN CORE, WE FIND            CY210
*     IT AND BEGIN IN THE REGULAR GOKY$IS WAY TO SEARCH IT BY            CY210
*     KEY, AS THOUGH WE HAD REACHED THE BLOCK BY A PROPER VERTICAL       CY210
*     ROUTE THROUGH THE INDEX. THE TROUBLE IS THAT GOKY$IS IS            CY210
*     THE ONLY ROUTINE CONVENIENTLY SET UP FOR READING                   CY210
*     WITHOUT RECALL YET EVENTUALLY REACHING A GOAL, BUT IT IS           CY210
*     SET UP FOR A VERTICAL PATH WHILE GETNEXT-WITHOUT-RECALL            CY210
*     MAY HAVE A HORIZONTAL STEP. WHAT HAPPENS IS THAT GOKY$IS           CY210
*     FINDS ITSELF WITH A KEY THAT IS TOO LOW FOR THE WHOLE              CY210
*     CURRENT BLOCK, THE BLOCK NOT BEING THE PRIMARY INDEX BLOCK.        CY210
*     UNDER ANY OTHER CIRCUMSTANCES IT WOULD BE A GROSS ERROR,           CY210
*     BUT IF HOW = -3, IT MEANS THE CALL TO GOKY$IS CAME FROM            CY210
*     GETNEXT-WITHOUT-RECALL-BY-PRIMARY-KEY. IF CURPTR SHOWS WE ARE NOT  CY210
*     AT A DATA BLOCK, IT IS STILL A GROSS ERROR. BUT IF AT A DATA BLOCK CY210
*     THE OVERWHELMING PROBABILITY IS THAT THIS IS CONNECTED WITH THE    CY210
*     FORWARD STEP, SO IT IS NOT AN ERROR, AND THE FIRST LIVE RECORD OF  CY210
*     THE BLOCK IS THE WANTED ONE.                                       CY210
*                                                                        JJJ0907
* DC  EXIT CONDITIONS                                                    JJJ0907
*                                                                        JJJ0907
*     SAME AS FOR EZKY$IS                                                JJJ0907
*                                                                        JJJ0907
* DC  ERROR CONDITIONS                                                   JJJ0907
*                                                                        JJJ0907
*     ONE CONDITION DISCOVERED BY GOKY$IS ITSELF.                        JJJ0907
*     EITHER THE FILE IS ILL-STRUCTURED, OR THERE IS A FLAW IN OUR       JJJ0907
*     PROGRAM LOGIC, IF THE GIVEN KEY IS FOUND TO BE LOWER THAN THE      JJJ0907
*     LOWEST KEY IN THE CURRENT BLOCK, AND THE BLOCK IS NOT THE          JJJ0907
*     PRIMARY INDEX. IF THE BLOCK IS THE PRIMARY INDEX, WE GO            JJJ0907
*     IMMEDIATELY TO THE BEGINNING OF THE FILE AND AVOID FURTHER         JJJ0907
*     COMPARISONS. OTHERWISE, WE SHOULD HAVE GONE THROUH A CHAIN OF      JJJ0907
*     INDEX BLOCKS TO A DATA BLOCK, IN ALL OF WHICH THE KEY OF THE       JJJ0907
*     FIRST RECORD WAS EQUAL TO OR LOWER THAN THE GIVEN KEY.             JJJ0907
*     (BUT NOT IF HOW=-3 AND WE ARE AT A DATA BLOCK -- SEE THE           CY210
*     DIGRESSION ABOVE.                                                  CY210
*                                                                        JJJ0907
* DC  CALLED ROUTINES                                                    JJJ0907
*                                                                        JJJ0907
*     SEBL$AA -- TO READ IF NECESSARY, AND LOCATE, THE BLOCK POINTED     JJJ0907
*        TO BY THE CURRENT WORD IN THE PTREE.                            JJJ0907
*     BNCH$AA -- TO DO A BINARY SEARCH FOR THE WANTED KEY IN THE         JJJ0907
*        CURRENT BLOCK.                                                  JJJ0907
*     STDN$IS -- TO MOVE DOWN ONE LEVEL IN THE PTREE, GENERATING         JJJ0907
*        THE PTREE WORD AT THE NEW POSITION.                             JJJ0907
*     FRLR$AA -- TO SET THE QFR AND QLR FLAGS ON OR OFF IN THE PTREE     JJJ0907
*        ACCORDING TO CURRENT POSITION IN THE FILE.                      JJJ0907
*     SKPF$AA -- TO STEP FORWARD ONE LIVE RECORD IN THE FILE OR SUBFILE. JJJ0907
*        OUR SEARCH LOGIC PUTS US, IF NO MATCH, ON THE NEXT LOWER        JJJ0907
*        RECORD, BUT WE WANT TO LEAVE THE NEXT HIGHER RECORD CURRENT.    JJJ0907
*     LOCR$AA -- TO LOCATE A GIVEN RECORD IN THE CURRENT BLOCK,WITHOUT   JJJ0907
*        CHANGING THE CURRENT RECORD NUMBER IN THE PTREE.                JJJ0907
*     STPF$AA -- TO STEP FORWARD ONE LIVE RECORD IN THE BLOCK. IF THE    JJJ0907
*        CURRENT POSITION IS NOT AT THE LAST RECORD OF A BLOCK,          JJJ0907
*        STPF$AA MUST BE POSSIBLE, AND IT IS QUICKER THAN CALLING        JJJ0907
*        SKPF$AA. ACTUALLY STPF$AA IS USED WHEN THE SEARCH LOGIC LANDS   JJJ0907
*        US ON A DEAD RECORD -- THERE MUST BE AT LEAST ONE LIVE RECORD   JJJ0907
*        FOLLOWING IT IN THE SAME BLOCK, AND THAT IS THE PLACE TO BE.    JJJ0907
*     GOFI$AA -- THROUGH THE MACRO GOSTARTFILE, TO GO TO THE FIRST       JJJ0907
*        RECORD OF THE FILE OR SUBFILE WHEN THE GIVEN KEY IS LOWER THAN  JJJ0907
*        THE LOWEST KEY IN THE PRIMARY INDEX BLOCK, HENCE LOWER THAN     JJJ0907
*        ALL IN THE FILE OR SUBFILE.                                     JJJ0907
*     UUCC$AA -- TO SEE IF THE DATA RECORD WE FIRST LAND ON IS DEAD.     JJJ0907
*     CPCH$AA - TO DO AN EXTRA MAJOR-KEY COMPARE TO SEE WHETHER TO SET   JJJ1009
*        QNE = 0 OR NOT.                                                 JJJ1009
*                                                                        JJJ0907
* DC  NON-LOCAL VARIABLES                                                JJJ0907
*                                                                        JJJ0907
*     MATRESL -- SET BY BNCH$AA                                          JJJ0907
*     SMALREC -- SET BY BNCH$AA                                          JJJ0907
*                                                                        JJJ0907
 #                                                                       JJJ0907
                                                                         JJJ0907
CONTROL EJECT;                                                           JJJ0907
          IF HOW LS 0                                                    ISISIS 
            THEN WHY = 0 ;                                               ISISIS 
            ELSE WHY = 1 ;                                               ISISIS 
          IF PTBLKIN[0] EQ 0 THEN PTCURBLK[0] = PRBK LAN ( 2**24-1 ) ;
          QNE = 1 ;                                                      ISISIS 
          QMF = 0 ;                                                      ISISIS 
          QLR = 0 ;                                                      ISISIS 
          QFR = 0 ;                                                      ISISIS 
          QEI = 0 ;                                                      ISISIS 
          IF RECCNT EQ 0                                                 ISISIS 
            THEN BEGIN                                                   ISISIS 
               GOSTARTFILE;  #DO IMPLICIT REWIND#                        AM2A089
              RETURN ;                                                   ISISIS 
            END                                                          ISISIS 
          SEBL$AA ( CURPTR , WHY ) ;                                     ISISIS 
                                                                         ISISIS 
       GOTOLA:                                                           ISISIS 
          IF PTBLKIN[CURPTR] EQ 0 THEN RETURN ;                          ISISIS 
          IF HOW EQ -2 AND INDEXFLAG EQ 0                                AFB0531
          THEN                                                           AFB0531
              BEGIN    #DONT PRESS SEEK TO THE END#                      AFB0531
              RETURN ;                                                   AFB0531
              END                                                        AFB0531
          BNCH$AA ;                                                      JJJ0916
          IF MATRESL NQ 0 THEN GOTO GOTOLB ;                             ISISIS 
          IF SMALREC EQ 0                                                JJJ1009
          THEN                                                           JJJ1009
              BEGIN                                                      JJJ1009
              IF CURPTR EQ 0                                             AM2A024
              THEN                                                       AM2A024
                  BEGIN                                                  AM2A024
                  GOSTARTFILE;                                           AM2A024
                  GOTO GOTOLD;                                           AM2A024
                  END                                                    AM2A024
              ELSE                                                       AM2A024
                  BEGIN                                                  AM2A024
                  IF HOW NQ -3 OR CURPTR NQ NLEV                         AM2A024
                  THEN                                                   AM2A024
                      BEGIN                                              AM2A024
                      IMPOSSIBLE(INTHI); #TURN OFF AAM# 
                      END                                                AM2A024
                  END                                                    AM2A024
              END                                                        JJJ1009
          PTCUREC[CURPTR] = SMALREC ;                                    ISISIS 
          IF INDEXFLAG NQ 0                                              ISISIS 
            THEN BEGIN                                                   ISISIS 
              STDN$IS ( WHY ) ;                                          ISISIS 
              GOTO GOTOLA ;                                              ISISIS 
            END                                                          ISISIS 
                                                                         ISISIS 
          FRLR$AA ;                                                      ISISIS 
          IF HOW GR 0 AND QLR EQ 0 AND SMALREC EQ RC                     ISISIS 
            THEN BEGIN                                                   ISISIS 
              RNO = -1 ; #ONLY TIME RNO IS NEG#                          ISISIS 
              RETURN ;                                                   ISISIS 
            END                                                          ISISIS 
            #HOW GR 0 ONLY ON PUTS, HERE WE STAY AT END OF BLOCK         ISISIS 
             ON LOWER REC INSTEAD OF SKIPPING TO NEXT BLOCK AND          ISISIS 
              FIRST HIGHER REC#                                          ISISIS 
          GOTO GOTOSK;                                                   JJJ1009
                                                                         ISISIS 
     GOTOLB: PTCUREC[CURPTR] = MATRESL ;                                 ISISIS 
          ASLONGAS INDEXFLAG NQ 0                                        ISISIS 
            DO BEGIN                                                     ISISIS 
              STDN$IS ( WHY ) ;                                          ISISIS 
              PTCUREC[CURPTR] = 1 ;                                      ISISIS 
              IF PTBLKIN[CURPTR] EQ 0 THEN RETURN ;                      ISISIS 
              MATRESL = 0 ; #SHOW THAT AN INDEX REC HAS MATCHED#         ISISIS 
            END                                                          ISISIS 
          LOCR$AA ( PTCUREC[CURPTR] ) ;                                  ISISIS 
          IF UUCC$AA ( RNO ) EQ DEAD                                     ISISIS 
            THEN STPF$AA ;                                               ISISIS 
            ELSE MATRESL = 0 ; #SHOW PERFECT MATCH#                      ISISIS 
          FRLR$AA ;                                                      ISISIS 
          IF MATRESL EQ 0                                                JJJ1009
          THEN                                                           JJJ1009
              BEGIN                                                      JJJ1009
              IF QREL NQ REL"GT"                                         JJJ1009
              THEN                                                       JJJ1009
                  BEGIN                                                  JJJ1009
                  GOTO GOTOKC;                                           JJJ1009
                  END                                                    JJJ1009
              ELSE                                                       JJJ1009
                  BEGIN                                                  JJJ1009
GOTOSK:           SKPF$AA;                                               JJJ1009
                  END                                                    JJJ1009
              END                                                        JJJ1009
GOTOLD:   IF QEI EQ 0                                                    JJJ1009
          THEN                                                           JJJ1009
              BEGIN                                                      JJJ1009
              IF QREL NQ REL"GT"                                         JJJ1009
              THEN                                                       JJJ1009
                  BEGIN                                                  JJJ1009
                  IF MAJKEY NQ KLENG                                     JJJ1009
                  THEN                                                   JJJ1009
                      BEGIN                                              JJJ1009
                      CPCH$AA ( KEYFWA,KEYOFF,TEMPLOC,TEMPOS,            AFB0528
                                           MAJKEY,KTYPE);                JJJ1009
                      IF COND EQ 0                                       JJJ1009
                      THEN                                               JJJ1009
                          BEGIN                                          JJJ1009
GOTOKC:                   QNE = 0;                                       JJJ1009
                          QMF = 1;                                       JJJ1009
                          RETURN;                                        JJJ1009
                                                                         JJJ1009
                          END                                            JJJ1009
                      END                                                JJJ1009
                  IF QREL EQ REL"EQ"    THEN  RETURN;                    JJJ1009
                                                                         JJJ1009
                  END                                                    JJJ1009
              QMF = 1;                                                   JJJ1009
              END                                                        JJJ1009
                                                                         ISISIS 
          END                                                            ISISIS 
CONTROL EJECT;                                                           ID0913 
PROC POST$IS; 
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   POST$IS - POSITION IN I-S FILE BEFORE GETNEXT OR SKIP   PAGE 1     CY210
* *   A.F.R.BROWN                                                        ID0913 
* 1DC POST$IS                                                            CY210
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO RESTORE THE CURRENT IS FILE TO THE POSITION AS IT WAS AT THE    ID0913 
*     END OF THE MOST RECENT GET, GETNEXT, REWIND, OR SKIP. INITIAL      ID0913 
*     OPEN WOULD HAVE COUNTED AS REWIND. GET OR GETNEXT LEAVES XFER=1,   ID0913 
*     INDICATING WE SHOULD NOW MOVE TO THE NEXT RECORD. REWIND OR SKIP   ID0913 
*     LEAVES XFER=0, INDICATING THAT THE RECORD ON WHICH WE STOPPED IS   ID0913 
*     THE WANTED ONE. EITHER WAY, ISPOSIT WILL LEAVE XFER=0 .            ID0913 
*     AN UPDATE OF THE FILE SINCE THE LAST GET, GETNEXT, REWIND OR       ID0913 
*     SKIP SHOULD NOT HAVE ALTERED THE SAVED POSITION, EXCEPT THAT A     ID0913 
*     DELETE OF THE POSITION RECORD WILL FORCE ISPOSIT TO RESTORE        ID0913 
*     A POSITION AT THE FIRST OF THE REMAINING RECORDS THAT FOLLOW.      ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     THE XFER FLAG, FAALTPOS[0] AND FASKLAST[0] MUST BE CORRECT.        JJJ1116
*                                                                        ID0913 
*     THE FAPOSKEY3 AREA OF THE FIAT, POINTED TO BY FAPKY3ADR[0], MUST   ID0913 
*     CONTAIN THE PRIMARY KEY OF THE RECORD THAT WAS CURRENT AT THE END  ID0913 
*     OF THE LAST GET,GETNEXT,REWIND,OR SKIP BY PRIMARY KEY.             ID0913 
*                                                                        ID0913 
*     IF FAALTPOS[0] SHOWS THAT THE PRECEDING OPERATION DID NOT          JJJ1116
*     ALTER THE                                                          JJJ1116
*     FILE, THE PTREE MUST NOT HAVE BEEN DISTURBED SINCE THEN.           ID0913 
*     OTHERWISE, THE PTREE NEED ONLY BE ACCEPTABLE TO EZKY$IS (SEE ITS   ID0913 
*     IMS DESCRIPTION.) HOWEVER THERE IS NO REASON WHY THE PTREE SHOULD  ID0913 
*     HAVE BEEN IMPROPERLY ALTERED.                                      ID0913 
*                                                                        CY210
*     IF FAFP[0] HAS THE VALUE NAMED ((FPRWMT)) IT MEANS THAT THE LAST   CY210
*     TIME THE FILE WAS ACCESSED IN A POSITIONAL WAY, IT WAS FOUND TO    CY210
*     CONTAIN NO RECORDS. IF ANY RECORDS HAVE BEEN ADDED TO THE FILE     CY210
*     SINCE THEN,IT SEEMS LOGICAL THAT THE CURRENT POSITION SHOULD BE    CY210
*     CONSIDERED TO BE REWOUND.                                          CY210
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     THE PTREE SHOWS THE FILE POSITIONED TO THE SAME RECORD AS          ID0913 
*     AT THE END OF THE LAST GET,GETNEXT,REWIND OR SKIP, IF THAT WAS     ID0913 
*     REWIND OR SKIP AND THE RECORD HAS NOT BEEN DELETED IN BETWEEN      ID0913 
*     TIMES. OTHERWISE AT THE NEXT RECORD, OR THE NEXT FOLLOWING         ID0913 
*     SURVIVING RECORD.                                                  ID0913 
*                                                                        ID0913 
*     THE XFER FLAG IS 0.                                                ID0913 
*                                                                        ID0913 
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     GOFI$AA ALIAS GOSTARTFILE - TO REWIND THE FILE.                    CY210
*     WKKY$IS -- TO LOCATE A POSITION IN THE FILE BY KEY, LOOKING FOR    ID0913 
*        EXACT MATCH ON A FULL-LENGTH KEY.                               ID0913 
*     CURR$AA -- TO LOCATE, AFTER READING THE BLOCK IF NECESSARY, THE    ID0913 
*        CURRENT RECORD ACCORDING TO THE PTREE.                          ID0913 
*     SKPF$AA -- TO MOVE AHEAD ONE RECORD, IN EXCHANGE FOR RESETTING     ID0913 
*        THE XFER FLAG FROM 1 TO 0.                                      ID0913 
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     QMF - USED INTERNALLY, NOT MEANT TO HAVE MEANING FOR THE           CY210
*       ROUTINE THAT CALLED POST$IS.                                     CY210
*                                                                        ID0913 
 #                                                                       ID0913 
                                                                         ID0913 
                             #START OF ISPOSIT CODE#                     ID0913 
          IF FAFP[0] EQ FPRWMT                                           RPN0323
          THEN                                                           RPN0323
              BEGIN                                                      RPN0323
              GOSTARTFILE;                                               RPN0323
              QMF = 0 ; # FAKE FOR CALLER #                              AFB0517
              RETURN ;                                                   AFB0517
              END                                                        AFB0517
          IF FAALTPOS[0] NQ 0 OR FASKLAST[0] NQ 0                        JJJ1116
            THEN BEGIN                                                   ISISIS 
              KEYFWA = FAPKY3ADR[0] ;                                    ISISIS 
              WKKY$IS ( 0 ) ;                                            ISISIS 
            END                                                          ISISIS 
            ELSE BEGIN                                                   AFB0517
              CURR$AA ;                                                  AFB0517
              QMF = 1 ;                                                  AFB0517
            END                                                          AFB0517
          IF XFER NQ 0 AND QMF NQ 0 THEN SKPF$AA ;                       ISISIS 
          END                                                            ISISIS 
CONTROL EJECT ;                                                          JJJ1116
PROC KPTR$IS (N);                                                        JJJ1118
          BEGIN                                                          JJJ1118
 #                                                                       CY210
* *   KPTR$IS - SET KEY POINTERS FOR AN IS OPERATION  PAGE  1            AM2A077
* *   A.F.R.BROWN                                                        CY210
* 1DC KPTR$IS                                                            CY210
*                                                                        CY210
* DC  FUNCTION                                                           CY210
*     TO SET, ACCORDING TO FIT FIELDS, KEYFWA, KEYOFF, MAJKEY            CY210
*     AND QREL, AND TO COLLATE IF NECESSARY, THE KEY SUPPLIED BY         CY210
*     THE CALLER.                                                        CY210
*                                                                        CY210
* DC  ENTRY CONDITIONS                                                   CY210
*                                                                        CY210
*     ONE PARAMETER, PASSED IN THE NORMAL WAY. THIS IS 1 FOR A PUT       CY210
*     OR REPLACE, INDICATING THAT THE CALLER IS SUPPLYING A RECORD       CY210
*     INSTEAD OF OR AS WELL AS A KEY, AND 0 FOR ANY OTHER FUNCTION,      CY210
*     INDICATING ONLY A KEY.                                             CY210
*                                                                        CY210
*     IF THERE IS A RECORD, IT BEGINS IN THE FIRST CHARACTER OF THE      CY210
*     WORD FTWSA[0] POINTS TO, AND FSKEYLOC[0], IN THE FIT, IS THE       CY210
*     CHARACTER POSITION WITHIN SOME WORD OF THE RECORD, AT WHICH        CY210
*     THE KEY BEGINS. BUT IF FSKEYLOC[0] IS GREATER THAN 9, THIS IS      CY210
*     A NONSENSE VALUE AND INDICATES THAT THE KEY IS NON-EMBEDDED,       CY210
*     AND TO BE FOUND IN THE SAME WAY AS FOR A ((GET)).                  CY210
*     OTHERWISE, FSKEYPOS[0] FROM THE FSTT, ADDED TO FTWSA[0], GIVES     CY210
*     THE ADDRESS OF THE WORD IN WHICH THE EMBEDDED KEY BEGINS           CY210
*                                                                        CY210
*     IF THERE IS NO RECORD, THEN THE BEGINNING OF THE KEY IS IN         CY210
*     CHARACTER POSITION FTKP[0] OF THE WORD FTKA[0] POINTS TO.          CY210
*     HOWEVER, IF THE KEY TYPE, AS FOUND IN THE FSTT, IS SIGNED,         CY210
*     FTKP[0] CAN BE DISREGARDED BECAUSE THE KEY MUST ALWAYS BEGIN       CY210
*     ON A WORD BOUNDARY.                                                CY210
*                                                                        CY210
*     MKEYLNG HAS ALREADY BEEN SET BY EXEC$IS TO WHAT THE CALLER         CY210
*     HAD PUT IN FTMKL[0]. (FTMKL[0] WAS ZEROED AT THAT TIME.)           CY210
*     THIS IS THE ((MAJOR KEY LENGTH)), APPLICABLE ONLY TO               CY210
*     SYMBOLIC KEYS.                                                     CY210
*                                                                        CY210
*     FTREL[0] IS SIGNIFICANT ONLY FOR A ((START)) OPERATION.            CY210
*     IT CAN BE ((EQ)), ((GT)), OR ((GE)). ((EQ)) OR ((GE)) MEANS        CY210
*     THE CALLER WANTS TO BE POSITIONED ON AN EQUAL KEY, OR THE          CY210
*     LOWEST HIGHER ONE IF NO EQUAL -- BUT ((EQ)) WILL GENERATE          CY210
*     A NON-FATAL ERROR IF THERE IS NO EQUAL. ((GT)) MEANS THE           CY210
*     CALLER WANTS TO BE POSITIONED ON THE LOWEST HIGHER RECORD.         CY210
*                                                                        CY210
*     FTCOP[0] CONTAINS A CODE INDICATING WHICH OPERATION --             CY210
*     GET, START, PUT OR WHATEVER.                                       CY210
*                                                                        CY210
* DC  EXIT CONDITIONS                                                    CY210
*                                                                        CY210
*     KEYFWA HAS BEEN SET TO THE ADDRESS AT WHICH THE KEY BEGINS         CY210
*     AND KEYOFF TO THE CHARACTER POSITION. IF THE KEY TYPE IS           CY210
*     SYMBOLIC THIS WILL BE, NOT THE KEY DIRECTLY SUPPLIED BY            CY210
*     THE CALLER, BUT A COLLATED COPY OF IT.                             CY210
*                                                                        CY210
*     MAJKEY IS, IN GENERAL THE LENGTH IN CHARACTERS OF A PRIMARY        CY210
*     KEY IN THE FILE. BUT IF MKEYLNG WAS NOT ZERO AND THE KEY IS        CY210
*     SYMBOLIC, THEN MAJKEY=MKEYLNG, THE MAJOR-KEY LENGTH.               CY210
*                                                                        CY210
*     QREL = ((EQ)), EXCEPT THAT IF THE OPERATION IS A START,            CY210
*     QREL = WHAT THE CALLER PUT IN FTREL[0].                            CY210
*                                                                        CY210
* DC  ERROR CONDITIONS                                                   CY210
*                                                                        CY210
*     NONE                                                               CY210
*                                                                        CY210
* DC  CALLED ROUTINES                                                    CY210
*                                                                        CY210
*     TRN2$IS - TO MAKE A COLLATED COPY OF THE KEY TO WHICH              CY210
*       KEYFWA AND KEYOFF POINT, USING THE COLLATE TABLE AT              CY210
*       FSDICOTAB[0]. THIS IS NOT A COLLATION IN PLACE. THE              CY210
*       COLLATED COPY BEGINS IN THE FIRST CHARACTER OF A                 CY210
*       FIXED ARRAY CALLED TRKY$IS, RESERVED FOR THIS PURPOSE.           CY210
*                                                                        CY210
* DC  NON-LOCAL VARIABLES                                                CY210
*                                                                        CY210
*     NONE EXCEPT THOSE MENTIONED UNDER ((ENTRY CONDITIONS))             CY210
*     AND ((EXIT CONDITIONS)).                                           CY210
*                                                                        CY210
 #                                                                       CY210
CONTROL EJECT ;                                                          CY210
# START OF KPTR$IS CODE #                                                CY210
          ITEM N;            #FORMAL PARAMETER#                          JJJ1118
                                                                         JJJ1118
                                                                         JJJ1118
          IF N NQ 0 AND FSKEYPOS[0] LQ 9                                 JJJ1118
            THEN BEGIN                                                   JJJ1116
              KEYFWA = FTWSA[0] + FSKEYLOC[0] ;                          JJJ1116
              KEYOFF = FSKEYPOS[0] ;                                     JJJ1116
            END                                                          JJJ1116
            ELSE BEGIN                                                   JJJ1116
              KEYFWA = FTKA[0] ;                                         JJJ1116
              IF KTYPE EQ KT"SIGNED"                                     AFB0721
                THEN BEGIN                                               AFB0721
                  KEYOFF = 0 ;                                           AFB0721
                END                                                      AFB0214
                ELSE KEYOFF = FTKP[0] ;                                  AFB0214
            END                                                          JJJ1116
          MAJKEY = KLENG ;                                               JJJ1116
          IF KTYPE EQ KT"SYMBOLIC"                                       JJJ1116
            THEN BEGIN                                                   JJJ1116
              TRN2$IS ;                                                  JJJ1116
              KEYFWA = LOC(TRKY$IS) ;                                    JJJ1116
              KEYOFF = 0 ;                                               JJJ1116
              IF MKEYLNG NQ 0 THEN MAJKEY = MKEYLNG ;                    JJJ1116
            END                                                          JJJ1116
          IF FTREL EQ REL"LE" OR FTREL EQ REL"LT" OR FTREL EQ REL"NE"    CY210
          THEN                                                           CY210
              BEGIN                                                      CY210
              MSGZ$AA( EC551 ) ;   #REL VALUE INVALID#                   CY210
              GOTO EXIT$AA ;                                             CY210
              END                                                        CY210
          IF FTCOP[0] EQ OP"STR" AND FTREL[0] NQ REL"ZR"
            THEN QREL = FTREL[0] ;                                       JJJ1116
            ELSE QREL = REL"EQ" ;                                        JJJ1116
          END                                                            JJJ1116
CONTROL EJECT;                                                           AFB1208
 #                                                                       CY210
* *   OPOS$IS - REALIZE A FILE POSITION SET AT OPEN   PAGE  1            AM2A077
* 1DC OPOS$IS                                                            CY210
*                                                                        CY210
* DC  FUNCTION                                                           CY210
*                                                                        CY210
*     AT OPEN-OLD TIME, WE MUST SET A FILE TO EITHER REWOUND OR          CY210
*     EOI POSITION. TO DO EITHER OF THESE COMPLETELY WOULD REQUIRE       CY210
*     READING SOMETHING FROM THE FILE ON DISK, AND THIS WOULD BE         CY210
*     A WASTE OF TIME IF THE ONLY OPERATIONS BETWEEN THE OPEN AND        CY210
*     THE NEXT CLOSE WERE, SAY, RANDOM PUTS. SO AT OPEN-OLD TIME         CY210
*     WE JUST SET PTOF[0] IN THE PTREE TO 1 FOR REWOUND, OR 2 FOR        CY210
*     EOI. THE NEXT TIME A ROUTINE NEEDS TO KNOW THE POSITION OF         CY210
*     THE FILE (A PUT WOULD NOT NEED TO DO THIS) IT CHECKS PTOF[0]       CY210
*     FIRST, AND IF THIS IS NON-ZERO, OPOS$IS IS CALLED TO DO THE        CY210
*     FILE POSITIONING THAT WAS SCAMPED AT OPEN TIME.                    CY210
*                                                                        CY210
* DC  ENTRY CONDITIONS                                                   CY210
*                                                                        CY210
*     PTOF[0] IS 1 OR GREATER. IF 1, THE FILE IS LOGICALLY REWOUND.      CY210
*       IF GREATER THAN 1 (2 IN PRACTICE), THE FILE IS LOGICALLY AT      CY210
*       EOI.                                                             CY210
*                                                                        CY210
*     P<FSTT$AA> MUST POINT TO THE FSTT OF A DATA FILE, I.E. NOT TO      CY210
*       THAT OF THE MIP FILE.                                            CY210
*                                                                        CY210
* DC  EXIT CONDITIONS                                                    CY210
*                                                                        CY210
*     THE FILE HAS BEEN FULLY REWOUND OR POSITIONED AT EOI. IF THE       CY210
*     FILE IS A MIPPED FILE, THIS POSITIONING IS BY PRIMARY KEY.         CY210
*                                                                        CY210
* DC  ERROR CONDITIONS                                                   CY210
*                                                                        CY210
*     NONE                                                               CY210
*                                                                        CY210
* DC  CALLED ROUTINES                                                    CY210
*                                                                        CY210
*     REW$IS - DOES ALL THE WORK OF POSITIONING THE FILE AT THE START,   CY210
*       INCLUDING CLEARING PTOF[0] AND SETTING THE FP FIELDS.            CY210
*     GOFI$AA ALIAS GOENDFILE - TO POSITION THE FILE AT EOI.             CY210
*     FILP$AA ALIAS FILPOS - TO SET THE FTFP[0] AND FAFP[0] FIELDS.      CY210
*                                                                        CY210
* DC  NON-LOCAL VARIABLES                                                CY210
*                                                                        CY210
*     NONE                                                               CY210
*                                                                        CY210
 #                                                                       CY210
PROC OPOS$IS;                #POSITION TO END OF FILE SPECIFIED AT OPEN# AFB1208
          BEGIN                                                          AFB1208
          IF FAPOSKEY1[0] EQ 0                                           AFB0801
          THEN                                                           AFB0801
          BEGIN                                                          AFB0801
          IF PTOF EQ 1                                                   AFB1208
          THEN                                                           AFB1208
              BEGIN          #POSITION TO BOI#                           AFB1208
              REW$IS;                                                    JJJ0724
              END                                                        AFB1208
          ELSE                                                           AFB1208
              BEGIN          #POSITION AT EOI#                           AFB1208
              GOENDFILE;                                                 AFB1208
              FILPOS(EOI) ;                                              AFB0222
              END                                                        AFB1208
          END                                                            AFB0801
          PTOF[0] = 0 ;                                                  AFB0801
          END                                                            AFB1208
CONTROL EJECT ;                                                          DABBLE 
 #                                                                       DABBLE 
* *   POSTGMP - LOCATE BY PRIMARY KEY FOUND IN MIP FILE   PAGE 1         DABBLE 
* *   A.F.R.BROWN                                                        DABBLE 
* 1DC POSTGMP                                                            DABBLE 
*                                                                        DABBLE 
* DC  FUNCTION                                                           DABBLE 
*                                                                        DABBLE 
*     AFTER CALLING GETN$MP OR GET$MP WE HAVE A PRIMARY KEY VALUE        DABBLE 
*     WHOSE RECORD MUST BT SOUGHT IN THE DATA FILE. POSTGMP              DABBLE 
*     DOES THIS.                                                         DABBLE 
*                                                                        DABBLE 
* DC  ENTRY CONDITIONS                                                   DABBLE 
*                                                                        DABBLE 
*     QEI = 1 IF GETN$MP REACHED EOI, SO THAT POSTGMP CAN DO NOTHING.    DABBLE 
*                                                                        DABBLE 
*     QEI = 0 OTHERWISE, AND -----                                       DABBLE 
*                                                                        DABBLE 
*     KEYFWA POINTS TO THE PRIMARY KEY VALUE, WHICH IS LEFT JUSTIFIED.   DABBLE 
*                                                                        DABBLE 
*     STMD$AA(0) HAS BEEN CALLED, TO MAKE POINTERS POINT TO THE          DABBLE 
*       DATA FILE.                                                       DABBLE 
*                                                                        DABBLE 
* DC  EXIT CONDITIONS                                                    DABBLE 
*                                                                        DABBLE 
*     RECFWA, RECLWA, RECLNG LOCATE THE RECORD, AND THE DATA FILE        DABBLE 
*       PTREE HAS IT CURRENT.                                            DABBLE 
*                                                                        DABBLE 
* DC  ERROR CONDITIONS                                                   DABBLE 
*                                                                        DABBLE 
*     FATAL ERROR (EC546) IF THE PRIMARY KEY IS NOT FOUND. THIS MEANS    DABBLE 
*       THAT THE MIP FILE AND THE DATA FILE DO NOT AGREE.                DABBLE 
*                                                                        DABBLE 
* DC  CALLED ROUTINES                                                    DABBLE 
*                                                                        DABBLE 
*     MSGF$AA - TO DECLARE FATAL ERROR.                                  DABBLE 
*     WKKY$IS - TO SET KEYOFF AND QREL AND CALL EZKY$IS TO LOOK UP       DABBLE 
*       THE KEY IN THE DATA FILE.                                        DABBLE 
*                                                                        DABBLE 
* DC  NON-LOCAL VARIABLES                                                DABBLE 
*                                                                        DABBLE 
*     QMF - RESULT SET BY WKKY$IS, 0 IF NO MATCH FOUND.                  DABBLE 
*                                                                        DABBLE 
 #                                                                       DABBLE 
                                                                         DABBLE 
      PROC POSTGMP ;                                                     DABBLE 
          BEGIN                                                          DABBLE 
          IF QEI EQ 0                                                    DABBLE 
          THEN                                                           DABBLE 
              BEGIN                                                      DABBLE 
              WKKY$IS ( 0 ) ;                                            DABBLE 
              IF QMF EQ 0                                                DABBLE 
              THEN                                                       DABBLE 
                  BEGIN                                                  DABBLE 
                  MSGF$AA ( EC546 ) ; #PRIMARY KEY NOT FOUND#            DABBLE 
                  GOTO EXIT$AA ;                                         DABBLE 
                  END                                                    DABBLE 
              END                                                        DABBLE 
          END                                                            DABBLE 
CONTROL EJECT;                                                           ID0913 
PROC REW$IS;                                                             JJJ0724
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   REW$IS - REWIND AN IS FILE                 PAGE  1                 JJJ0724
* *   A.F.R.BROWN                                                        ID0913 
* 1DC REW$IS                                                             JJJ0724
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO REWIND AN I-S FILE, WHETHER BY PRIMARY OR BY A SPECIFIED        ID0913 
*     ALTERNATE KEY, I.E. TO POSITION IT SO THAT IF THE NEXT CALL IS     ID0913 
*     A GETNEXT, IT WILL FETCH THE FIRST RECORD WITH THE LOWEST KNOWN    ID0913 
*     VALUE OF THAT KEY.                                                 ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     P<FIT$AA> SPECIFIES THE FILE. THE MAIN FILE, AND ITS ASSOCIATED    ID0913 
*     MIP FILE IF THE REWIND IS BY ALTERNATE KEY, MUST ALREADY BE OPEN.  ID0913 
*                                                                        ID0913 
*     FTKL[0], FTRKW[0] AND FTRKP[0] TELL THE LENGTH OF THE KEY, AND     ID0913 
*       WHERE IN A RECORD IT BEGINS. IF THESE ARE THE SAME AS FOR A      ID0913 
*       PRIMARY KEY IN THE FILE, ACCORDING TO ITS FSTT, THE REWIND IS    ID0913 
*       BY PRIMARY KEY. OTHERWISE BY ALTERNATE KEY.                      ID0913 
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     THE DATA FILE IS POSITIONED AT ITS FIRST RECORD (WHATEVER KEY      ID0913 
*     DEFINES FIRSTNESS) AND THE BLOCK THAT INCLUDES THAT RECORD         ID0913 
*     IS IN CORE.                                                        ID0913 
*                                                                        ID0913 
*     THIS POSITION IS SHOWN IN THE PTREE, AND ALSO BY THE KEY BEING     ID0913 
*     STORED IN THE AREA POINTED TO BY FAPKYADR3[0] (IF PRIMARY)         ID0913 
*     OR FAPKYADR2[0] (IF ALTERNATE).                                    ID0913 
*                                                                        ID0913 
*     THE KEY SPECIFICATION HAS BEEN STORED IN THE WORD FAPOSKEY1[0].    ID0913 
*                                                                        ID0913 
*     SEEK INFORMATION HAS NOT BEEN DISTURBED.                           ID0913 
*                                                                        ID0913 
*     PTOF[0] = 0.                                                       CY210
*                                                                        CY210
*     XFER = 0.                                                          CY210
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     QUMP$AA - TO DECIDE WHETHER PRIMARY OR ALTERNATE KEY.              ID0913 
*     RWIN$MP - TO DO MOST OF THE WORK IF ALTERNATE KEY.                 ID0913 
*     GOFI$AA - TO REWIND THE FILE BY PRIMARY KEY.                       ID0913 
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0], AND TO          CY210
*       SAVE THE PRIMARY KEY VALUE OF THE FIRST RECORD AS                CY210
*       POSITION INFORMATION.                                            CY210
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
 #                                                                       ID0913 
                             #START OF RWIN$IS CODE#                     JJJ0916
          FAPOSKEY1[0] = 0;                                              ISISMOD
          PTOF = 0;          #CLEAR FILE NOT POSITIONED FLAG#            JJJ0203
          IF QUMP$AA ( 0 ) NQ 0 AND FTCOP[0] EQ OP"REW"                  AFB0801
           #CHECK OP=REW  BECAUSE OTHERWISE OPEN, GETN COULD             AFB0801
            CAUSE A SHIFT INTO MIP#                                      AFB0801
            THEN RWIN$MP ;                                               JJJ0916
            ELSE BEGIN                                                   ISISIS 
              GOSTARTFILE ;                                              AFRB030
              FILPOS (EOR);                                              JJJ0307
              IF QEI NQ 0 THEN FAFP[0] = FPRWMT ;                        AFB0517
            END                                                          ISISIS 
          XFER = 0 ;                                                     AFRB030
          END                                                            ISISIS 
CONTROL EJECT;                                                           ID0913 
PROC STDN$IS ( RECALL );                                                 ID0913 
          BEGIN                                                          ID0913 
                                                                         ID0913 
 #                                                                       ID0913 
* *   STDN$IS - MOVE DOWN ONE LEVEL IN THE PTREE     PAGE  1             JJJ0916
* *   A.F.R.BROWN                                                        JJJ0916
* 1DC STDN$IS                                                            ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*                                                                        ID0913 
*     TO MOVE DOWN ONE LEVEL IN THE PTREE, AND HENCE IN THE INDEX        ID0913 
*     STRUCTURE OF THE I-S FILE ITSELF, GENERATING A NEW PTREE WORD      ID0913 
*     AND GETTING THE BLOCK IT POINTS TO INTO CORE IF NOT ALREADY THERE, ID0913 
*     BUT NOT LOCATING ANY PARTICULAR RECORD.                            ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     A SINGLE PARAMETER IS RECEIVED IN THE NORMAL SYMPL WAY.            ID0913 
*     THIS IS THE RECALL PARAMETER, AND IS 0 IF I-O IS TO BE DONE        ID0913 
*     WITHOUT RECALL, OR NON-ZERO IF WITH RECALL. THE PARAMETER IS       ID0913 
*     PASSED ON TO SUBROUTINE DABL$AA, WITH THIS MEANING. IF DABL$AA     ID0913 
*     HAD TO READ THE BLOCK, THIS MAY NOT HAVE BEEN COMPLETED WHEN       ID0913 
*     WE EXIT FROM STDN$AA, IF THE PARAMETER IS 0.                       ID0913 
*                                                                        ID0913 
*     THE CURRENT WORD OF THE PTREE MUST POINT TO AN INDEX RECORD NOW    ID0913 
*     IN CORE.                                                           ID0913 
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     AS DESCRIBED IN ((FUNCTION)) ABOVE. WE WILL ALSO HAVE SET THE      ID0913 
*     PARENT-NUMBER FIELD OF THE NEWLY-REFERENCED BLOCK CORRECTLY,       ID0913 
*     IF THE RECALL PARAMETER IS NON-ZERO                                ID0913 
*     BUT THIS WILL NOT REALLY GET RECORDED ON DISK UNLESS SOME OTHER    ID0913 
*     CHANGE IN THE BLOCK IMAGE IS MADE.                                 ID0913 
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     NONE - HOWEVER, IF A DATA BLOCK WERE CURRENT WHEN STDN$AA          ID0913 
*     WAS CALLED, THERE WOULD BE A BOMB SOON. THE ERROR IS               ID0913 
*     SO EASY TO GUARD AGAINST THAT NO EXTRA CHECK IS DONE HERE.         ID0913 
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     LOCR$AA -- TO LOCATE THE CURRENT INDEX RECORD. RECFWA NEED NOT     ID0913 
*        POINT TO IT ALREADY, THOUGH THE BLOCK MUST ALREADY BE IN        ID0913 
*        CORE.                                                           ID0913 
*     DABL$AA -- TO GET THE DAUGHTER BLOCK INTO CORE AND LOCATED.        ID0913 
*        WE CALL THIS INSTEAD OF USING SEBL$AA, SO THAT IF THIS          ID0913 
*        REPRESENTS A SHIFT FROM ONE DATA BLOCK TO ANOTHER IN THE SAME   ID0913 
*        FILE, THE OLD ONE IS MOVED IN THE KICK-OUT CHAIN.               ID0913 
*     RJUV$AA -- TO MOVE THE PRIMARY INDEX BLOCK, IF KNOWN TO BE IN      ID0913 
*        CORE, UP TO THE HEAD OF THE KICK-OUT CHAIN. THIS IN ORDER TO    ID0913 
*        MAKE THE PRIMARY INDEX BLOCK LIVE LONGER THAN OTHER INDEX       ID0913 
*        BLOCKS.                                                         ID0913 
*                                                                        ID0913 
*     NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     NONE                                                               ID0913 
*                                                                        ID0913 
 #                                                                       ID0913 
          ITEM RECALL;       #0 IF I/O WITHOUT RECALL#                   ID0913 
          ITEM TBID;         #TEMP BLOCK ID#                             ID0913 
                                                                         ID0913 
                             #START OF STDN$IS CODE#                     JJJ0916
          LOCR$AA ( PTCUREC[CURPTR] ) ;                                  ISISIS 
          TBID = BLOCKID[0];                                             ID0913 
          CURPTR = CURPTR + 1 ;                                          ISISIS 
          DABL$AA ( INDEXPRU , RECALL ) ;                                ISISIS 
          BLPARENT[0] = TBID;                                            ID0913 
          IF PTBLKIN[0] NQ 0    THEN RJUV$AA (PTCURBADR[0]);             JJJ0131
                  #COURTESY TO PRIMARY INDEX BLOCK#                      ISISIS 
          END                                                            ISISIS 
CONTROL EJECT;                                                           JJJ0209
PROC STUP$IS;                                                            ISISMOD
          BEGIN                                                          ISISMOD
                                                                         ID0913 
 #                                                                       ID0913 
* *   STUP$IS - STEP UP A LEVEL IN THE PTREE      PAGE  1                JJJ0916
* *   A.F.R.BROWN                                                        ID0913 
* 1DC STUP$IS                                                            ID0913 
*                                                                        ID0913 
* DC  FUNCTION                                                           ID0913 
*     TO MOVE UP A LEVEL IN THE PTREE, I.E. FROM THE RECORD POINTED TO   ID0913 
*     BY THE CURRENT WORD IN THE PTREE, WHICH MAY BE A DATA RECORD OR    ID0913 
*     AN INDEX RECORD, TO ITS PARENT INDEX RECORD, ALTERING IF NECESSARY ID0913 
*     THE PRECEDING WORD IN THE PTREE.                                   ID0913 
*                                                                        ID0913 
* DC  ENTRY CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     IF FACREATE[0]=1, THIS IS A NEW FILE AND ALL WE HAVE DONE TO       CY210
*     IT SO FAR IS TO ADD RECORDS IN STRICT SEQUENCE, AND MIP IS         CY210
*     NOT BEING USED. SO WE KNOW THE WHOLE PTREE IS IN APPLE-PIE         CY210
*     ORDER.                                                             CY210
*                                                                        CY210
*     IF PTCUREC[0], THE PRIMARY INDEX RECORD NUMBER FIELD IN THE PTREE, CY210
*     IS NOT ZERO, THIS INDICATES THAT THE PTREE IS AUTHENTIC FROM THE   ID0913 
*     TOP DOWN TO THE CURRENT WORD, AND ALL THAT STUP$IS NEEDS TO DO     ID0913 
*     IS REDUCE CURPTR BY 1, AND THEN CALL CURR$AA TO LOCATE THE PARENT  ID0913 
*     RECORD.                                                            ID0913 
*                                                                        ID0913 
*     THAT WOULD ALWAYS BE SO, WERE IT NOT THAT IN SUBROUTINE            CY210
*     GOFI$AA, WE POSITION AT THE START OR END OF A FILE, AND IN STOV$AA CY210
*     GTNR$MP AND GTNR$IS WE MOVE TO A DIFFERENT DATA BLOCK, WITHOUT     CY210
*     ALTERING ALL THE HIGHER WORDS IN THE PTREE -- THOSE THAT LOCATE    CY210
*     INDEX RECORDS. PTCUREC[0] IS SET TO 0 AT THOSE TIMES TO SHOW THAT  CY210
*     THE PTREE IS NO LONGER RELIABLE ABOVE THE CURRENT LEVEL.           CY210
*                                                                        ID0913 
*     IF PTCUREC[0] IS 0, WE CANNOT DEPEND ON ANY PTREE WORD EXCEPT      CY210
*     THE CURRENT ONE. IN ORDER TO FIND THE PARENT RECORD, WE MUST       ID0913 
*     SAVE THE KEY OF THE CURRENT RECORD, GO BACK TO THE PRIMARY INDEX,  ID0913 
*     AND COME BACK DOWN THROUGH THE INDEX UNTIL THE PARENT IS REACHED.  ID0913 
*                                                                        ID0913 
*     THE CURRENT BLOCK MUST BE IN CORE, AND RECFWA MUST POINT TO THE    ID0913 
*     CURRENT RECORD.                                                    ID0913 
*                                                                        ID0913 
*     BLPARENT[0], THE PARENT BLOCK NUMBER FIELD OF THE CURRENT BLOCK    ID0913 
*     HEADER, WILL BE USED IF THE CURRENT OP IS BACKSPACE, AS A 
*     SHORTCUT TO GET TO THE PARENT RECORD. IF IT IS ZERO OR
*     WRONG, WE LOSE TIME BUT CAN STILL USE THE KEY AS DESCRIBED
*     ABOVE.
* 
*     IF THE CURRENT OP IS NOT BACKSPACE, IT IS ALMOST CERTAINLY
*     AN UPDATE, AND IT IS NOT SAFE TO USE THE PARENT POINTER.
*     IT MIGHT BE RIGHT FOR THE FIRST STEP UP, THEN WE MIGHT
*     CHANGE A RECORD IN SUCH A WAY AS TO LOSE SIGHT OF THE 
*     ORIGINAL KEY, THEN WE MIGHT COME INTO STUP$IS AGAIN, ONLY 
*     TO FIND A BAD BLPARENT AND GET LOST BECAUSE WE ARENT SURE 
*     WHAT THE ORIGINAL KEY WAS.
*                                                                        CY210
*     FSUNWFLG[0] IS 0 IF THERE IS NO BLOCK IMAGE IN CORE THAT HAS NO    CY210
*     REPRESENTATION ON DISK, HENCE FSNXTPRU[0] IS THE PRU NUMBER OF     CY210
*     LOGICAL EOI. IF FSUNWFLG[0] IS NOT ZERO, THERE IS SUCH A BLOCK     CY210
*     IMAGE, FSNXTPRU[0] IS ITS PRU NUMBER, AND LOGICAL EOI COMES AFTER. CY210
*                                                                        ID0913 
* DC  EXIT CONDITIONS                                                    ID0913 
*                                                                        ID0913 
*     THE PTREE IS SET UP TO POINT TO THE PARENT INDEX RECORD, WHICH     ID0913 
*     IS NOW IN CORE AND LOCATED BY RECFWA, RECLWA, AND RECLNG.          CY210
*                                                                        ID0913 
* DC  ERROR CONDITIONS                                                   ID0913 
*                                                                        ID0913 
*     THERE IS A FATAL ERROR IF STUP$IS IS CALLED WHEN THE PRIMARY INDEX ID0913 
*     BLOCK (OR THE DATA BLOCK OF A ONE-BLOCK FILE) IS CURRENT.          ID0913 
*     THIS MUST BE A FLAW IN OUR LOGIC.                                  ID0913 
*                                                                        ID0913 
* DC  CALLED ROUTINES                                                    ID0913 
*                                                                        ID0913 
*     SPKY$IS -- TO SAVE THE PRIMARY KEY OF THE STARTING RECORD IN       ID0913 
*        UPHOLD, IF WE HAVE TO COME DOWN FROM THE TOP OF THE INDEX       ID0913 
*        LOOKING FOR THAT KEY. THIS IS IF THE STARTING RECORD IS IN      ID0913 
*        A DATA BLOCK.                                                   ID0913 
*     MOVW$AA -- TO DO THE SAME IF THE STARTING POINT IS AN INDEX RECORD ID0913 
*        BECAUSE THE KEY IS EASIER TO LOCATE, AND MOVW$AA IS QUICKER.    ID0913 
*     CURR$AA -- TO LOCATE, AFTER READING INTO CORE IF NECESSARY, THE    ID0913 
*        CURRENT RECORD ACCORDING TO THE CURRENT WORD OF THE PTREE.      ID0913 
*     SEBL$AA -- TO LOCATE THE BLOCK POINTED TO BY THE CURRENT WORD      ID0913 
*        OF THE PTREE, WHEN WE DO NOT KNOW WHICH RECORD WE SHALL SETTLE  ID0913 
*        ON.                                                             ID0913 
*     SETR$AA -- AFTER DECIDING WHICH RECORD IS TO BE CURRENT, GIVE ITS  ID0913 
*        NUMBER TO SETR$AA TO INSERT IN THE PTREE WORD, AND THEN TO      ID0913 
*       LOCATE THE RECORD AND SET RECFWA, RECLWA, AND RECLNG.            CY210
*     LOCR$AA - THE SAME AS SETR$AA, EXCEPT THAT THE RECORD NUMBER       CY210
*       IS ALREADY IN THE PTREE WORD.                                    CY210
*     BNCH$AA -- TO DO A BINARY SEARCH BY KEY OF THE CURRENT BLOCK.      ID0913 
*     STDN$IS -- TO MOVE DOWN A LEVEL IN THE PTREE.                      ID0913 
*     MXPR$AA -- TO REPORT WHAT IS THE LARGEST POSSIBLE PRU NUMBER. 
*                                                                        ID0913 
*     NOTE THAT WE LOCATE BY KEY USING BNCH$AA AND STDN$IS, RATHER THAN  ID0913 
*     JUST CALLING GOKY$IS TO DO THE WHOLE JOB, BECAUSE WE WANT TO STOP  ID0913 
*     ONE LEVEL UP FROM THE CURRENT POSITION, RATHER THAN GOING RIGHT    ID0913 
*     TO THE DATA BLOCK LEVEL.                                           ID0913 
*                                                                        ID0913 
* DC  NON-LOCAL VARIABLES                                                ID0913 
*                                                                        ID0913 
*     UPHOLD, AN ARRAY BIG ENOUGH TO HOLD THE LARGEST KEY, IS USED       ID0913 
*        ONLY BY THIS ROUTINE.  NONE OF THE                              ID0913 
*        OTHER KEY-SAVING LOCATIONS IS SAFE TO USE HERE BECAUSE          ID0913 
*        STUP$AA GETS CALLED AT ALL SORTS OF INTIMATE MOMENTS.           ID0913 
*                                                                        ID0913 
 #                                                                       ID0913 
CONTROL EJECT;               #START OF STUP$IS CODE#                     ID0913 
          ITEM S, T, U, X;   #LOCAL VARIABLES#                           ISISMOD
                                                                         ID0913 
# *********************************************************#             ID0913 
                                                                         ID0913 
#     THE FOLLOWING ARRAY IS USED ONLY IN STUP$IS   #                    ID0913 
                                                                         ID0913 
          ARRAY [0:25] S(1);  ITEM UPHOLD U(0,0,60);                     ID0913 
                                                                         ID0913 
# *********************************************************#             ID0913 
                                                                         ISISMOD
                                                                         ISISMOD
                                                                         ISISMOD
          IF CURPTR EQ 0
          THEN
              BEGIN 
              IMPOSSIBLE(STUPRIM); #TURN OFF AAM# 
              END 
          CURPTR = CURPTR - 1 ;                                          ISISIS 
          IF FACREATE[0] EQ 0 AND PTCUREC[0] EQ 0                        CREATEM
            THEN BEGIN  #OLD RECFWA STILL OK#                            CREATEM
              U = BLOCKID[0] ;                                           CREATEM
              S = BLPARENT[0] ;                                          CREATEM
              IF S GQ MXPR$AA THEN S = 0 ;
              T = WLG(KLENG+4) ;                                         ISISIS 
              IF CURPTR EQ NLEV-1                                        ISISIS 
                THEN SPKY$AA ( LOC(UPHOLD[0]) ) ;                        AFB0517
                ELSE MOVW$AA ( RECFWA , T , LOC(UPHOLD[0]) ) ;           ISISIS 
              IF PTBLKIN[CURPTR] NQ 0 AND PTCUREC[CURPTR] NQ 0           JJJ0724
                THEN BEGIN                                               ISISIS 
                  CURR$AA;                                               JJJ0916
                  IF INDEXPRU EQ U THEN RETURN ;                         ISISIS 
                END                                                      ISISIS 
              IF S NQ 0 AND FTCOP[0] EQ OP"SKB" 
                THEN BEGIN                                               ISISIS 
                  PTCURBLK[CURPTR] = S ;                                 ISISIS 
                  SEBL$AA ( CURPTR , 1 ) ;                               ISISIS 
                  IF INDEXFLAG NQ 0                                      ISISIS 
                    THEN BEGIN                                           ISISIS 
                      X = BLOCFWA + T - 1 ;                              ISISIS 
                    FOR IX = 1 STEP 1 UNTIL RC                           ISISMOD
                        DO BEGIN                                         ISISIS 
                          IF B<36,24>W[X] EQ U                           ISISIS 
                            THEN BEGIN                                   ISISIS 
                            SETR$AA ((IX));                              ISISMOD
                              RETURN ;                                   ISISIS 
                            END                                          ISISIS 
                            ELSE X = X + T ;                             ISISIS 
                        END                                              ISISIS 
                    END                                                  ISISIS 
                END                                                      ISISIS 
              U = CURPTR ;                                               ISISIS 
              KEYFWA = LOC(UPHOLD[0]) ;                                  ISISIS 
              KEYOFF = 0 ;                                               ISISIS 
              MAJKEY = KLENG ;                                           ISISIS 
              QREL = REL"EQ" ;                                           ISISIS 
              PTCURBLK = PRBK LAN ( 2**24 - 1 ) ;                        AFB0801
              PTCURBLK[0] = PRBK LAN ( 2**24-1 ) ;
              CURPTR = 0 ;                                               ISISIS 
              SEBL$AA ( 0 , 1 ) ;                                        ISISIS 
STEPUPA:      BNCH$AA ;                                                  JJJ0916
              IF MATRESL NQ 0                                            ISISIS 
                THEN BEGIN                                               ISISIS 
STEPUPB:                     #USED IF COMING DOWN THE LEFT SIDE#         JJJ1207
                  PTCUREC[CURPTR] = MATRESL ;                            ISISIS 
                  ASLONGAS CURPTR LS U                                   ISISIS 
                    DO BEGIN                                             ISISIS 
                      STDN$IS ( 1 ) ;                                    ISISIS 
                      PTCUREC[CURPTR] = 1 ;                              ISISIS 
                    END                                                  ISISIS 
                END                                                      ISISIS 
                ELSE BEGIN                                               ISISIS 
                  IF SMALREC EQ 0                                        JJJ1207
                  THEN                                                   JJJ1207
                      BEGIN                                              JJJ1207
                      IF CURPTR NQ 0                                     JJJ1207
                      THEN                                               JJJ1207
                          BEGIN                                          JJJ1207
                          IMPOSSIBLE(INTHI); #TURN OFF AAM# 
                          END                                            JJJ1207
                      ELSE                                               JJJ1207
                          BEGIN                                          JJJ1207
                          MATRESL = 1; #NO MATCH ON LOW SIDE CAN BE #    JJJ1207
                                       #HANDLED AS A LOW MATCH#          JJJ1207
                          GOTO STEPUPB;                                  JJJ1207
                          END                                            JJJ1207
                      END                                                JJJ1207
                  PTCUREC[CURPTR] = SMALREC ;                            ISISIS 
                  IF CURPTR LS U                                         ISISIS 
                    THEN BEGIN                                           ISISIS 
                      STDN$IS ( 1 ) ;                                    ISISIS 
                      GOTO STEPUPA ;                                     ISISIS 
                    END                                                  ISISIS 
                END                                                      ISISIS 
            END                                                          ISISIS 
          SEBL$AA ( CURPTR , 1 ) ;                                       CREATEM
          IF PTBLKIN[CURPTR+1] NQ 0 
          THEN
              BEGIN 
              BLPARENT[PTCURBADR[CURPTR+1]-P<BLOK$AA>] = BLOCKID[0];
              END 
          IF FACREATE[0] NQ 0 THEN PTCUREC[CURPTR] = RC ;                CREATEM
          LOCR$AA ( PTCUREC[CURPTR] ) ;                                  CREATEM
          END                                                            ISISIS 
CONTROL EJECT;                                                           ID0913 
PROC WKKY$IS ( N );                                                      ID0913 
          BEGIN                                                          ID0913 
                                                                         JJJ0907
 #                                                                       JJJ0907
* *   WKKY$IS - LOCATE A RECORD BY KEY, THE SIMPLEST WAY   PAGE  1       JJJ0916
* *   A.F.R.BROWN                                                        JJJ0907
* 1DC WKKY$IS                                                            JJJ0907
*                                                                        JJJ0907
* DC  FUNCTION                                                           JJJ0907
*                                                                        JJJ0907
*     TO SET MAJKEY=KLENG, KEYOFF=0, AND QREL=REL"EQ", THEN TO           JJJ0907
*     CALL EZKY$IS AND PASS ON TO IT, AS PARAMETER, THE ONE PARAMETER    JJJ0907
*     RECEIVED BY WKKY$IS. THE DESCRIPTION OF WKKY$IS CONSISTS OF THE    JJJ0907
*     DESCRIPTION OF EZKY$IS, MODIFIED BY THE THREE GIVEN VALUES, AND    JJJ0907
*     THERE IS REALLY NOTHING MORE TO SAY ABOUT IT. WKKY$IS EXISTS AS    JJJ0907
*     A SUBROUTINE ONLY BECAUSE THE COMBINATION OF FOUR STATEMENTS,      JJJ0907
*     SETTING THOSE THREE VALUES AND THEN CALLING EZKY$IS, WOULD         JJJ0907
*     OTHERWISE OCCUR QUITE OFTEN.                                       JJJ0907
*                                                                        JJJ0907
 #                                                                       JJJ0907
          ITEM N;            #PARAM TO EZKY$IS#                          ID0913 
                                                                         JJJ0907
                                                                         JJJ0907
          KEYOFF = 0; 
          MAJKEY = KLENG; 
          QREL = REL"EQ"; 
          EZKY$IS (N);                                                   AFB0517
          END                                                            AFB0517
          END TERM                                                       ISISIS 
