*DECK WHERE 
USETEXT TBASCTB 
USETEXT TCMMDEF 
USETEXT TENVIRN 
USETEXT TPSTACK 
USETEXT TRELTBL 
USETEXT TSBASIC 
USETEXT TEXPRES 
USETEXT TXSTD 
USETEXT TDESATT 
USETEXT TOPTION 
      PROC WHERE; 
      BEGIN 
                                                                         CHANGES
      XREF PROC  EXIT10;
      XREF PROC  DIAG;
      XREF PROC RLSBMEM;           # RELEASE BASICTABLE MEMORY         #
  
      XREF PROC STKSCAN;
      XREF PROC GETRELATION;
      XREF PROC SCANRELSTK; 
      XREF PROC DDIAG;             # PRINTS DIAGNOSTIC USING DATA FROM #
                                   # ARRAY FIELDN                      #
  
      XREF PROC SEARCH;            # SEARCHES A LIST OF DEFINE DESCRIBE#
                                   # OR SPECIFY ENTRIES FOR NAME THAT  #
                                   # MATCHES THE NAME IN ARRAY ANAME2  #
  
      XREF BASED ARRAY ANAME2[1:3];;  # SAVES DATANAME FOR SEARCH CALL #
  
      XREF ARRAY FIELDN [1:FIELDNAMEMAX] S(4);
        BEGIN 
        ITEM FN   C( 0, 0,10);     # ITEM NAME                         #
        ITEM FN1  C( 1, 0,10);
        ITEM FN2  C( 2, 0,10);
        ITEM FNLG I( 3,24,18);     # ITEM NAME LENGTH IN CHARACTERS    #
        END 
  
  
      XREF ARRAY AKT$TBL [0:0] S(1);  # DESCRIPTION OF SINGLE ALTERNATE#
                                      # KEY USED FOR RECORD RETRIEVAL  #
        BEGIN 
        ITEM AKT$ITEMORD   U(00,00,15);  # ITEM ORDINAL IF CDCS, ELSE 0#
        ITEM AKT$TYPE      U(00,15,06);  # KEY TYPE:  0 = ALPHANUMERIC #
                                         #            1 = NUMERIC, COMP#
                                         #            2 = INTEGER      #
                                         #            3 = COMP-1       #
                                         #            4 = COMP-2       #
                                         #            5 = DOUBLE       #
                                         #            6 = COMPLEX      #
                                         #            7 = LOGICAL      #
        ITEM AKT$LENGTH    U(00,21,09);  # KEY LENGTH IN CHARACTERS    #
        ITEM AKT$CPOS      U(00,30,06);  # CHAR POSITION OF KEY IN WORD#
                                         # POINTED TO BY AKT$WPOS      #
        ITEM AKT$WPOS      I(00,42,18);  # WORD POSITN OF KEY IN RECORD#
        END 
  
      XREF ITEM DEFLIST;           # POINTER TO FIRST WORD IN A DEFINE #
                                   # LIST                              #
      XREF ITEM FIELDNAMELG;       # LEVEL NO. FOR ARRAY FIELDN        #
      XREF ITEM CDCSDBM B;         # TRUE IF ACCESSING THROUGH CDCS    #
      XREF ITEM IMFDBM B;          # TRUE IF IN IMF DATABASE MODE      #
XREF ITEM FOLLOWON B;              # TRUE IF FOLLOW DIR IN EFFECT      #
      XREF ITEM LOWAREA;           # ORDINAL OF AREA ASSOCIATED WITH   #
                                   # LOWRELATION.                      #
      XREF ITEM SM$GROUPID I;      # CMM GROUP ID                      #
      XREF ITEM UPDTEMP B;
      ITEM LOOPER B;               # LOOP CONTROL.                     #
      ITEM DUMMY1;                 # LOOP INDUCTION.                   #
      ITEM LOOPCON B;              # LOOP CONTROL.                     #
      ITEM RC;                     # RETURN CODE.                      #
      ITEM PREVIOUS;               # USED FOR SUB-EXPRESSION POINTER.  #
      ITEM I;                      # INDUCTION VARIABLE FOR LOOPS      #
      ITEM RT;                     # RETURN CODE FOR CALL TO SEARCH    #
      ITEM ATTRPTR;                # RETURN PARAMETER FROM CALL TO     #
                                   # SEARCH WHICH HOLDS DESATT1 PTR    #
      ARRAY EXPRSTK [9];           # ARRAY FOR HOLDING POINTERS AFTER  #
        BEGIN                      # TRANSFER TO A SUB-EXPRESSION.     #
        ITEM STKPTR  U(0,0,6);
        ITEM STKADDR U(0,42,18);
        END 
      XREF ITEM CURRELLOC;
      XREF ITEM CURRELATION;       # WORD OF ACCUMULATED BIT PATHS.    #
      XREF PROC LEXINIT;
      XREF PROC STD$START;
      XREF BASED ARRAY RESLIST;    # RESTRICT STRING.                  #
        BEGIN 
        ITEM NEXTRES   B(0,0,1);   # TRUE--ANOTHER RESTRICT FOLLOWS.   #
        ITEM RESLENGTH U(0,1,8);   # LENGTH OF STRING IN WORDS.        #
        ITEM RESRANK   U(0,36,6);  # RANK OF RESTRICTED AREA           #
        ITEM RESADDR   U(0,42,18); # ADDRESS OF RESTRICT TABLE.        #
        ITEM RESWORD   C(0,0,10);  # WHOLE WORD.                       #
        END 
      XREF BASED ARRAY RUSLIST;    # RELATION USAGE LIST               #
        BEGIN 
        ITEM RU$OFSTNEXT    U(0, 0,15);    # OFFSET TO NEXT ENTRY      #
        ITEM RU$RELORD      U(0,48,12);    # RELATION ORDINAL          #
        ITEM RU$LENGTH      U(0, 9,15);    # LENGTH OF CHARS OF DATANAM#
        ITEM RU$BCP         U(0,24, 6);    # BEG CHAR POS OF DATANAME  #
        ITEM RU$DNADDR      I(0,42,18);    # ADDRESS OF DATANAME       #
        END 
  
      XREF ITEM DUMMY;                                                   STX00
      XREF ITEM SAVEBASLOC;        # SAVES POINTER TO BASICTABLE.      #
      XREF ITEM SAVECLP I;         # SAVE OF CURRENT LF PTR WHILE      #
                                   # PROCESSING RESTRICTS              #
  
      XREF ITEM CURRENTLFPTR I;    # POINTER TO THE CURRENT LOCAL FILE #
                                   # LFNINFO ENTRY.                    #
  
      XREF ITEM SAVEREFER;         # SAVES VALUE OF REFERFILE.         #
      XREF ITEM RESTRNO;           # NUMBER OF RESTRICTS TO BE DONE.   #
      XREF ITEM RESTARTPTR;        # START OF RESTRICT STRING.         #
      XREF ITEM RESTRICTPROC B;    # TRUE--RESTRICTS ARE BEING DONE.   #
      XREF ITEM SAVEQUIWSA;        # SAVES POINTER TO QUIWSA.          #
      XREF ITEM SAVEQURL;          # SAVES QUIRL.                      #
      XREF ITEM SAVESEP C(10);    # SAVES SEPARATOR.                  # 
      XREF BASED ARRAY SAVDAREA;   # ARRAY USED TO SAVE INFORMATION    #
                                   # ABOUT AREAS.                      #
        BEGIN 
        ITEM AREAINUSE  B(0,0,1);   # TRUE--THIS AREA WILL BE USED.    #
        ITEM RELORD     U(0,6,12);  # ORDINAL OF RELATION ENTRY.       #
        ITEM AREASAVE   U(0,42,18); # ADDRESS OF AREA TABLE.           #
        ITEM AREASAVEWD U(0,0,60);  # THE WHOLE WORD.                  #
        END 
      ITEM PREVAREA;               # HOLDS AREA ORDINAL TO SEE IF MORE #
                                   # THAN ONE AREA IS REFERENCED.      #
  
  
  
  
#----------------------------------------------------------------------#
#                                                                      #
#     C H K 7 7                                                        #
#                                                                      #
#     THIS PROC PROCESSES ALL THE END OF TRANSMISSION CODE BEFORE      #
#     TRANSFERRING TO THE ( 20,0 ), ( 30,0 ), ( 40,0 ), ( 50,0 )       #
#     OR ( 60,0 ) OVERLAY.  IF NO                                      #
#     WORK IS REQUIRED FOR THE OTHER PRIMARIES THEN CONTROL IS         #
#     RETURNED TO STD FOR THE NEXT TRANSMISSION PROCESSING.  IN THE    #
#     CASE RESTRICT PROCESSING IS REQUIRED THIS PROC STARTS UP STD WITH#
#     AN INTERNAL *WHERE* DIRECTIVE.  FOR THIS REASON THIS PROC CANNOT #
#     DO A *STDNO* OR *STDYES* BUT MUST INSTEAD RETURN AND LET THE     #
#     CALLING ROUTINE REENTER SYNTAX PROCESSING.                       #
#----------------------------------------------------------------------#
      XDEF PROC CHK77;
      PROC CHK77; 
      BEGIN 
      STKSCAN (RC);                # GET INFORMATION ABOUT AREAS WHICH #
      IF RC NQ 0 THEN 
        BEGIN 
        RLSBMEM;
        RETURN; 
        END 
                                   # ARE IN USE. ALSO FILL IN ADDRESS  #
                                   # OF WSA LOCATIONS IN PROGSTACK AND #
                                   # DISPLAY TABLE.                    #
                                   # NO RELATION EXISTS IF CURRELATION #
                                   # IS THE ORIGINAL VALUE.  ZERO IT   #
                                   # OUT AND CONTINUE.                 #
      IF CURRELATION EQ O"37777777777777777777" THEN
        BEGIN 
        CURRELATION = 0;
        END 
      IF CURRELATION NQ 0 THEN     # THERE IS A RELATION INVOLVED.     #
        BEGIN 
        GETRELATION (RC);          # ISOLATE THE CORRECT RELATION.     #
        IF RC NQ 0 THEN            # ERROR WAS FOUND.                  #
          BEGIN 
          RLSBMEM;
          RETURN; 
          END 
                                   # NOW SCAN THE SAVDAREA TABLE AND   #
                                   # THE RELATION TABLE PUTTING THE    #
                                   # RELATION ORDINAL INTO THE ARRAY   #
                                   # SAVDAREA.                         #
        SCANRELSTK; 
        END                        # NOW SCAN PROGRAMSTACK, LOOKING FOR#
                                   # A PRIMARY OR ALTERNATE KEY WHICH  #
                                   # IS ASSOCIATED WITH THE LOWAREA AND#
                                   # THE LOWRELATION. IF THERE IS NO   #
                                   # RELATION, CHECK TO MAKE SURE THAT #
                                   # ONLY ONE AREA IS REFERENCED       # QU30296
      AKEY = FALSE;                # INITIAL ASSUMPTION                #
      PKEY = FALSE; 
      ONEAKEY = TRUE; 
      P<BASICTABLE> = BASTABLOC;
      LOOPCON = TRUE; 
      FOR BASTABIND = 0 STEP 1 WHILE LOOPCON DO 
        BEGIN 
        IF BASCODE[BASTABIND] EQ IFCODE THEN  # SEARCH PROGRAMSTACK.   #
          BEGIN 
          PREVIOUS = -1;
          PREVAREA = 0;            # USED TO CHECK AREAS REFERENCED.   #
          P<PROGRAMSTACK> = BASCADDR[BASTABIND];
          LOOPER = TRUE;           # LOOP CONTROL.                     #
          FOR DUMMY1 = DUMMY1 WHILE LOOPER DO 
            BEGIN 
            FOR DUMMY = 0 STEP 1 DO 
              BEGIN 
                                             # IF NOT AN OPERATOR ENTRY#
              IF ENTRYTYPE[DUMMY] NQ 7 THEN  # LOOK AT KEY FLAGS. AREA #
                BEGIN                        # ORDINAL, ETC.           #
                IF ENTRYTYPE[DUMMY] EQ 3 OR    # SUB-EXPRESSION--STACK #
                   ENTRYTYPE[DUMMY] EQ 6 THEN  # CURRENT VALUES AND GO #
                                               # TO SUB-STACK.         #
                  BEGIN 
                  PREVIOUS = PREVIOUS + 1;
                  STKPTR[PREVIOUS] = DUMMY; 
                  STKADDR[PREVIOUS] = P<PROGRAMSTACK>;
                  P<PROGRAMSTACK> = EXPRESSTACK[DUMMY]; 
                  TEST DUMMY1;
                  END 
                ELSE                                                     QU30296
                  BEGIN                                                  QU30296
                  IF AREAORD[DUMMY] EQ LOWAREA  # ITEM WITHIN LOW AREA #
                  THEN                                                   QU30296
                    BEGIN                                                QU30296
                    IF PRKEYENTRY[DUMMY]  # IF PRIMARY KEY             # QU30296
                    THEN                                                 QU30296
                      BEGIN                                              QU30296
                      PKEY = TRUE;                                       QU30296
                      END                                                QU30296
                    IF PRMAJKEY[DUMMY]  # IF MAJOR PRIMARY KEY         #
                      AND NOT AKEY      # ALTERNATE KEY NOT YET FOUND  #
                    THEN
                      BEGIN 
                      PKEY = TRUE;  # ACCESS BY PRIMARY KEY            #
                      END 
                    IF ALKEYENTRY[DUMMY]  # IF ALTERNATE KEY           # QU30296
                      OR ALTMAJKEY[DUMMY]  # IF MAJOR ALTERNATE KEY    # QU30296
                    THEN                                                 QU30296
                      BEGIN                                              QU30296
                      IF ENTRYTYPE[DUMMY] LQ 1  # IF NO CONVERSION     #
                        OR KEYTYPE[DUMMY] EQ DT$CHAR  # IF NO ATTRIB TB#
                        OR KEYTYPE[DUMMY] GQ DT$FLOAT  # NO ATTRIB TBL #
                      THEN
                        BEGIN 
                        I = FROMWORDADDR[DUMMY];  # WORD ADDRESS       #
                        END 
  
                      ELSE
                        BEGIN 
                        P<DESATT1> = FROMWORDADDR[DUMMY];  # ATTRIB TBL#
                        I = DEWPOS;  # WORD ADDRESS                    #
                        END 
  
                      IF ENTRYTYPE[DUMMY] EQ 4  # SUBSCRIPTED ALT KEY  #
                      THEN
                                   # BLP MUST HANDLE REPEATING ALT KEYS#
                                   # BECAUSE SEQUENTIALLY READING BY   #
                                   # A REPEATING ALT KEY COULD CAUSE   #
                                   # THE SAME RECORD TO BE READ MORE   #
                                   # THAN ONCE                         #
                        BEGIN 
                        ONEAKEY = FALSE;
                        END 
  
                      IF NOT AKEY  # IF NO PREVIOUS ALT KEY REFERENCED #
                      THEN
                        BEGIN 
                        AKEY = TRUE;  # ALTERNATE KEY REFERENCED       #
                                   # DESCRIBE ALTERNATE KEY            #
                        AKT$ITEMORD[0] = ITEMORDINAL[DUMMY];
                        AKT$TYPE[0] = KEYTYPE[DUMMY]; 
                        AKT$CPOS[0] = RELFROMCHAR[DUMMY]; 
                        AKT$WPOS[0] = I;  # WORD ADDRESS               #
                        IF ALKEYENTRY[DUMMY]  # IF ALTERNATE KEY       #
                        THEN
                          BEGIN 
                          AKT$LENGTH[0] = NBRCHARS[DUMMY];  # LENGTH   #
                          END 
  
                        ELSE       # IF MAJOR ALT KEY                  #
                          BEGIN 
                                   # SIZE OF FULL ALTERNATE KEY        #
                          AKT$LENGTH[0] = ALTKEYSIZE[DUMMY];
                          END 
                        END 
  
                      ELSE         # IF PREVIOUS ALT KEY REFERENCED    #
                        BEGIN 
                                   # IF DIFFERENT ALTERNATE KEY        #
                        IF RELFROMCHAR[DUMMY] NQ AKT$CPOS[0]
                          OR I NQ AKT$WPOS[0] 
                        THEN
                          BEGIN 
                          ONEAKEY = FALSE;  # MORE THAN ONE KEY        #
                          END 
                        END 
  
                      END                                                QU30296
                    END                                                  QU30296
                  END                                                    QU30296
              IF AREAORD[DUMMY] NQ 0
              THEN
                BEGIN 
                  IF PREVAREA EQ 0 THEN        #SAVE AREA ORDINAL IN   #
                    BEGIN                      # CASE THIS IS NOT A    #
                    PREVAREA = AREAORD[DUMMY]; # RELATIONAL CONDITION. #
                    END 
                                   # CHECK OUT AREA ORDINAL--IF NO REL-#
                  ELSE             # ATION, ONLY 1 AREA MAY BE USED.   #
                    BEGIN 
                    IF AREAORD[DUMMY] NQ 0  # IF AREA USED             #
                    THEN
                      BEGIN 
                      IF CURRELATION EQ 0  # IF NO RELATION            #
                        AND NOT FOLLOWON
                      THEN
                        BEGIN      # IF MORE THAN ONE AREA             #
                        IF PREVAREA NQ AREAORD[DUMMY] 
                        THEN
                          BEGIN 
                          DIAG ( 323 );  # ERROR, NO RELATION          #
                          RLSBMEM;       # RELEASE BASC. TABLE MEMORY  #
                          LOOPCON = FALSE;  # FORCE LOOP EXIT          #
                          TEST BASTABIND; 
                          END 
                        END 
                      END 
                    END 
                  END 
                TEST DUMMY; 
                END 
              ELSE                 # OPERATOR ENTRY.                   #
                BEGIN 
                IF OPCODE[DUMMY] EQ O"70" THEN   # END OF STACK. CHECK #
                  BEGIN                          # IF THERE ARE MORE   #
                  IF PREVIOUS GQ 0 THEN          # ENTRIES IN PREVIOUS #
                    BEGIN                        # STACK.              #
                    P<PROGRAMSTACK> =  STKADDR[PREVIOUS]; 
                    DUMMY = STKPTR[PREVIOUS]; 
                    PREVIOUS = PREVIOUS - 1;
                    TEST DUMMY;                  # CONTINUE LOOPING.   #
                    END 
                  ELSE
                    BEGIN 
                    LOOPER = FALSE;   # STACK IS FINISHED. END LOOP.   #
                    TEST DUMMY1;
                    END 
                  END 
                ELSE
                  BEGIN 
                  TEST DUMMY;      # SKIP OTHER OPERATOR ENTRY.        #
                  END 
                END 
              END                  # END OF -DUMMY- LOOP.              #
            END                    # END OF -DUMMY- LOOP.              #
          END 
        IF BASCODE[BASTABIND] EQ ENDCODE THEN  # END OF BASICTABLE.    #
          BEGIN 
          LOOPCON = FALSE;         # EXIT LOOP.                        #
          TEST BASTABIND; 
          END 
        IF BASCODE[BASTABIND] EQ CONTCODE THEN
          BEGIN 
          P<BASICTABLE> = BASCLAST[BASTABIND];  # CONTINUE TO NEXT     #
          BASTABIND = -1;                       # TABLE IN CHAIN--RE-  #
          TEST BASTABIND;                       # START LOOP.          #
          END 
        END                        # END OF -BASTABIND- LOOP.          #
      IF PKEY                      # IF PRIMARY KEY REFERENCED         #
        OR NOT AKEY                # IF NO ALTERNATE KEY REFERENCED    #
      THEN
        BEGIN 
        ONEAKEY = FALSE;           # RETRIEVAL WILL NOT BE BY ONE      #
                                   # ALTERNATE KEY                     #
        END 
  
      IF CURRELLOC NQ 0 THEN       # RELATION IS IN EFFECT.            #
        BEGIN 
      P<REL$TABLE> = CURRELLOC; 
      IF CDCSDBM                   # IF CDCS DATA BASE MODE            #
      THEN
        BEGIN 
                                   # REQUEST RELATION USAGE LIST       #
                                   # CONTAINING ONE WORD HEADER, ONE   #
                                   # WORD FOR EVERY DEFINED ITEM WITHIN#
                                   # RESTRICTS, AND TERMINATED BY A    #
                                   # WORD OF ZEROES.                   #
        P<RUSLIST> = CMM$ALF (RT$NORESTDBI + 2, 0, 0);
        RU$RELORD = RT$ORDINAL;    # RELATION ORDINAL                  #
        RU$OFSTNEXT = RT$NORESTDBI + 1;  # OFFSET TO ZERO WORD TERM    #
        IF RT$NORESTDBI NQ 0       # IF RESTRICTS ON DEFINED ITEMS     #
        THEN
          BEGIN 
          P<RESDNAMETBL> = RT$RESDNADDR;  # INITIALIZE POINTER TO      #
                                          # RESTRICT DATA NAME TABLE   #
          FIELDNAMELG = 1;         # INITIALIZE LEVEL FOR ARRAY FIELDN #
          FOR I = 0 STEP 1         # LOOP UNTIL ALL DEFINED ITEMS HAVE #
            UNTIL RT$NORESTDBI - 1  #BEEN CHECKED AND PLACED IN RUSLIST#
                                   # OR UNTIL A MATCH ISN-T FOUND      #
          DO
            BEGIN 
            FNLG[FIELDNAMELG] = RD$NAMELGC[I];  # STORE DEF. ITEM NAME #
                                                # LNGTH FOR SEARCH CALL#
            FN[1]  = RD$NAME1[I]; 
            FN1[1] = RD$NAME2[I]; 
            FN2[1] = RD$NAME3[I]; 
            P<ANAME2> = LOC(FN[1]);  # POSN TO NAME FOR -SEARCH- CALL  #
  
            SEARCH (DEFLIST, RT, ATTRPTR);  #SEARCH DEFLIST FOR RD$NAME#
            IF RT EQ 0             # IF NOT FOUND                      #
            THEN
              BEGIN 
              DDIAG(396);          # RESTRICT CLAUSE DATANAME HAS NOT  #
                                   # BEEN DEFINED                      #
              CMM$FRF (P<RUSLIST>);  # FREE RELATION USAGE LIST        #
              RLSBMEM;               # RELEASE BASICTABLE MEMORY       #
              RETURN; 
              END 
  
            P<DESATT1> = ATTRPTR;  # SET DESATT1 POINTER               #
            IF (RD$SIGN[I]                  # IF SIGNS DONT MATCH      #
              AND NOT DOVERPUN) 
              OR RD$DPTLOC[I] NQ DPTLOC     # OR DECIMAL PTS DONT MATCH#
              OR RD$DATATYPE[I] NQ DECLASS  # OR DATA-TYPES DONT MATCH #
              OR RD$USESIZE[I] NQ DECLSLG   # OR DATA LNGTHS DONT MATCH#
            THEN
              BEGIN 
              DDIAG(397);          # RESTRICT DEFINED ITEM AND AREA ITM#
                                   # SPECIFICATIONS DON-T MATCH        #
              CMM$FRF (P<RUSLIST>);  # FREE RELATION USAGE LIST        #
              RLSBMEM;               # RELEASE BASICTABLE MEMORY       #
              RETURN; 
              END 
                                   # A MATCH HAS BEEN FOUND            #
  
                                   # MOVE CHAR LENGTH, BEG. CHAR. POS.,#
                                   # AND ADDRESS OF THE VALUE FOR THE  #
                                   # DEFINED ITEM INTO RUSLIST         #
            RU$LENGTH[I + 1] = DECLSLG; 
            RU$BCP[I + 1] = DBITPOS / 6;
            RU$DNADDR[I + 1] = DEWPOS;
            END 
          END 
        END 
  
      ELSE                         # IF CRM DATA BASE MODE             #
        BEGIN 
      IF RT$NOREST[0] NQ 0 THEN    # THERE ARE RESTRICT STRINGS.       #
        BEGIN 
        IF NOT RT$RESDONE[0] THEN  # RESTRICT STACKS HAVE NOT BEEN     #
                                   # BUILT.                            #
          BEGIN 
          RESTRICTPROC = TRUE;
          SAVEQUIWSA = P<QUIWSA>; 
          SAVEQURL = QUIRL; 
          SAVEBASLOC = BASTABLOC; 
          BASTABLOC = 0;
          SAVECLP = CURRENTLFPTR;  # SAVE POINTER TO CURRENT LF        #
          SAVEREFER = REFERFILE;
          RESTRNO = RT$NOREST[0]; 
          RESTARTPTR = RT$RESTPTR[0]; 
          SAVESEP = SEPARATOR;
          SEPARATOR = O"64";       # SET SEPARATOR TO -"- FOR RESTRICT #
          FOR DUMMY=DUMMY 
          WHILE RESTRNO NQ 0       # UNTIL NO MORE RESTRICTS EXIST     #
          DO
            BEGIN 
            IF P<RESLIST> NQ 0 THEN 
              BEGIN 
              CMM$FRF (P<QUIWSA>);  # FREE PREVIOUS QUIWSA.            #
              RLSBMEM;             # RELEASE UNNEEDED MEMORY.          #
              END 
            P<RESLIST> = RESTARTPTR;
            P<QUIWSA> = CMM$ALF (RESLENGTH[0] + 1, 0, 0); 
            QUIRL = (RESLENGTH[0] + 1) * 10;
            FOR BASTABIND = 1 STEP 1 UNTIL RESLENGTH[0] DO
              BEGIN 
                                   # TRANSFER RESTRICT STRING TO NEW   #
                                   # QUIWSA.                           #
              INWORD[BASTABIND] = RESWORD[BASTABIND]; 
              END 
            BASTABIND = 0;
                                   # PUT KEYWORD -WHERE- IN FIRST WORD #
                                   # OF NEW QUIWSA.                    #
            INWORD[0] = "WHERE";
            SM$GROUPID = RT$GROUPID;  # ALLOCATE RESTRICT PROGSTACK    #
                                      # WITH SAME GROUP ID AS RELATION #
                                      # TABLE                          #
            RESTARTPTR = RESTARTPTR + RESLENGTH[0] + 1; 
            RESTRNO = RESTRNO - 1;
                                   # CALL THE LEXICAL SCANNING ROUTINES#
                                   # TO PROCESS THE RESTRICT STRING.   #
                                   # CONTROL RETURNS TO CHK77          #
            WP = 0; 
            LEXINIT;
            STD$START;
          STKSCAN(RC);
          IF RC NQ 0               # IF AN ERROR HAS OCCURED           #
          THEN
            BEGIN 
            RLSBMEM;               # RELEASE BASIC TABLE MEMORY        #
            END 
          END 
            CMM$FRF (P<QUIWSA>);
            RLSBMEM;               # RELEASE UNNEEDED MEMORY.          #
            QUIRL = SAVEQURL; 
            P<QUIWSA> = SAVEQUIWSA; 
            REFERFILE = SAVEREFER;
            RT$RESDONE[0] = TRUE; 
            RESTRICTPROC = FALSE; 
            SEPARATOR = SAVESEP;
            BASTABLOC = SAVEBASLOC; 
            CURRENTLFPTR = SAVECLP;  # RESTORE CURRENT LF              #
            FILEPASS = TRUE;
            RESTARTPTR = RT$RESTPTR[0];  # ADDRESS OF RESTRICT STRING  #
            LOOPCON = TRUE; 
            FOR BASTABIND = BASTABIND 
              WHILE LOOPCON 
            DO
              BEGIN 
              P<RESLIST> = RESTARTPTR;  # POSITION TO RESTRICT ENTRY   #
              IF RESRANK EQ 1      # IF 1ST AREA IN RANK ENTRIES       #
              THEN
                BEGIN 
                P<REL$RANKINFO> = LOC(RT$RANKPOS);  # ONLY ENTRY REF   #
                                                    # THIS AREA        #
                RR$RESTBLPTR[0] = RESADDR;  # STORE ADDRESS OF PROGRAM #
                                            # STACK IN RANK ENTRY      #
                END 
              ELSE
                BEGIN 
                                   # 1ST ENTRY REFERENCING THIS AREA   #
                P<REL$RANKINFO> = LOC(RT$RANKPOS) + 
                                  ((RESRANK * 2) - 3) * RANKSIZE; 
                RR$RESTBLPTR[0] = RESADDR;  # STORE ADDRESS OF PROGRAM #
                                            # STACK IN RANK ENTRY      #
                IF RESRANK - 1 NQ RT$NORANKS  # IF NOT LAST AREA       #
                THEN
                  BEGIN 
                  RR$RESTBLPTR[1] = RESADDR;
                  END 
                END 
              IF NEXTRES[0]        # IF ANOTHER RESTRICT               #
              THEN
                BEGIN 
                RESTARTPTR = RESTARTPTR + RESLENGTH + 1;  # PTR TO NEXT#
                                                          # RESTRICT   #
                TEST BASTABIND; 
                END 
              ELSE
                BEGIN 
                LOOPCON = FALSE;   # EXIT LOOP                         #
                TEST BASTABIND; 
                END 
              END 
          P<RESLIST> = 0;          # CLEAR RESTRICT STRING POINTER     #
                                   # SO WE DONT TRY TO FREE QUIWSA     #
                                   # IF RESTRICT PROCESSING IS DONE FOR#
                                   # OTHER TRANSMISSION LATER ON       #
          END 
        END                        # END OF RESTRICT PROCESSING.       #
        END 
      END 
# IF AKEY OR PKEY IS TRUE, GO TO (20,00) TO DO KEY PROCESSING. IF      #
# -REFERFILE- IS O77, THEN THE AREA IS TO BE UPDATED. -PREVAREA- WILL  #
# CONTAIN THE ORDINAL OF THE AREA TO BE UPDATED. THIS IS USED TO SET   #
# -AREAORG-, THE FILE ORGANIZATION. IF REFERFILE IS ONE AND THERE      #
# ARE NO KEY REFERENCES, GO TO (30,00) FOR MULTI-FILE QUERY.           #
      INDEX = 0;
      OLDKEY = KEYAREA[0];
      IF IMFDBM                    # IF IN IMF DATABASE MODE           #
      THEN
        BEGIN 
        IF DESPASS                 # IF ACCESSING -FROM- FILE          #
        THEN
          BEGIN 
          PRIMARY = O"30";         # LOAD CRM QUERY OVERLAY            #
          EXIT10; 
          END 
        ELSE                       # IF ACCESSING DATA BASE            #
          BEGIN 
          PRIMARY = O"60";         # LOAD IMF EXECUTION OVERLAY        #
          EXIT10; 
          END 
        END 
      IF KEYLIT EQ 0               # IF NOT UPDATE/DISPLAY KEY         #
        AND (AKEY                  # IF KEY REFERENCE                  #
          OR PKEY)
      THEN
        BEGIN 
        PRIMARY = O"20";
        EXIT10; 
        END 
      ELSE
        BEGIN 
        SCANALLAREA = TRUE;        # NO KEY REFERENCE.                 #
        IF REFERFILE EQ O"77" THEN   # I/O--MUST BE SINGLE AREA.       #
          BEGIN 
          IF CDCSDBM               # IF ACCESSING THROUGH CDCS         #
          THEN
            BEGIN 
            PRIMARY = O"50";       # LOAD CDCS EXECUTION OVERLAY       #
            END 
          ELSE
            BEGIN 
            PRIMARY = O"40";       # LOAD CRM UPDATE OVERLAY           #
            END 
          EXIT10; 
          END 
        ELSE
          BEGIN 
          IF (REFERFILE EQ 0 AND FILEPASS) OR  # NO QUERY ON AREA,     #
                                               # BUT                   #
             UPDTEMP THEN 
                                               # STILL READING FROM    #
                                               # AREA SO GO TO (40,00).#
            BEGIN 
            PRIMARY = O"40";
            EXIT10; 
            END 
          ELSE                     # MUST BE MULTI-FILE QUERY.         #
            BEGIN 
            IF CDCSDBM             # IF ACCESSING THROUGH CDCS         #
              AND NOT DESPASS      # NOT *DISPLAY FROM*                #
            THEN
              BEGIN 
              PRIMARY = O"50";     # LOAD CDCS EXECUTION OVERLAY       #
              END 
            ELSE
              BEGIN 
              PRIMARY = O"30";     # LOAD CRM QUERY OVERLAY            #
              END 
            EXIT10; 
            END 
          END 
        END 
      END 
      END 
      TERM
