*COMDECK RELSPACE 
CONTROL EJECT;
#----------------------------------------------------------------------#
#                                                                      #
#     R E L E A S E S P A C E                                          #
#                                                                      #
#     RELEASE MEMORY USED BY THIS DIRECTIVE.                           #
#----------------------------------------------------------------------#
      PROC RELEASESPACE;
      BEGIN 
                                                                         CTL40
      ITEM BC;
      ITEM FINISHED B;         # BASIC TABLE LOOP CONTROL  #
  
      XREF ITEM FRMLFN C(7);       # LFN OF -FROM- OR -KEY IN- FILE    #
      XREF ITEM RECNAM I;          # RECORD DIRECTORY WORD ADDRESS     #
      XREF ITEM UPONLFN C(7);      # LFN OF UPON FILE                  #
  
                                   # FIT FOR SEQUENTIAL FILE CONTAINING#
      XREF ARRAY KEYFLFIT;         # PRIMARY KEY VALUES                #
        BEGIN 
        ITEM KEYFLNAM  I(0,0,42);  # FILE NAME                         #
        END 
  
      XREF PROC RETURNM;           # RETURN CRM FILE                   #
  
      IF INDEX EQ 1                # IF CALLED FROM CREINIT            #
      THEN
        BEGIN 
        RETURN; 
        END 
  
      IF BASTABLOC NQ 0 
      THEN
        BEGIN 
      P<BASICTABLE> = BASTABLOC;
      BASTABIND = -1; 
      FINISHED = FALSE; 
                                                                         CTL40
# LOOP AND RELEASE SPACE ASSOCIATED WITH THE BASIC TABLE   #
                                                                         CTL40
      FOR DUMMY=DUMMY                                                    CTL40
        WHILE NOT FINISHED                                               CTL40
      DO                                                                 CTL40
        BEGIN 
        BASTABIND = BASTABIND + 1;
        BC = BASCODE[BASTABIND];
        IF BC EQ ENDCODE THEN 
          BEGIN 
          FINISHED = TRUE;
          TEST; 
          END 
        IF BC EQ CONTCODE THEN
          BEGIN                #RELEASE FIRST SEGMENT OF BASIC TABLE   #
          J = P<BASICTABLE>;
          P<BASICTABLE> = BASCLAST [BASTABIND];    # LINK TO NEXT PART #
          CMM$FRF (J);
          BASTABIND = -1; 
          TEST; 
          END 
# RELEASE NOT -SAME- -IF- SPACE    #
        IF BASC$GROUPID[BASTABIND] NQ 0  # IF GROUP ID ASSIGNED        #
        THEN
          BEGIN 
          IF BC EQ DISPCODE        # IF DISPLAY                        #
          THEN
            BEGIN 
            IF BASCKEY1[BASTABIND] # IF DISPLAY KEY LITERAL            #
            THEN
              BEGIN 
              P<DTABLE> = BASCADDR[BASTABIND];  # POSITION TO DIS TABLE#
              CMM$FRF(CPFROMADDR[0]);  # RELEASE LITERAL STORAGE       #
              END 
            END 
                                   # FREE CM FOR THIS BASICTABLE ENTRY #
          CMM$FGR (BASC$GROUPID[BASTABIND]);
          END 
        END    # FINISHED  #
      CMM$FRF (P<BASICTABLE>);
        END 
      IF P<SAVDAREA> NQ 0          # IF AREA-IN-USE TABLE EXISTS       #
      THEN
      BEGIN 
      FINISHED = FALSE; 
      FOR DUMMY = 1 STEP 1 WHILE NOT FINISHED DO
        BEGIN                                # FREE WSA AND USER BUFFER#
        IF AREAINUSE[DUMMY] THEN              # SPACE FOR AREAS USED.  #
          BEGIN 
          P<AREA$TABLE> = AREASAVE[DUMMY];
          P<AREAFIT> = LOC(AT$AFITPOS[0]);
          P<FIT> = P<AREAFIT>;                                           CTL40
          IF FITWSA NQ 0           #WSA SPACE EXISTS.                  # CTL40
          THEN                     #AND SHOULD BE RETURNED.            # CTL40
            BEGIN                                                        CTL40
            CMM$FRF(FITWSA);                                             CTL40
            FITWSA = 0;                                                  CTL40
            END 
          IF AT$BGIMAGE NQ 0       # BGIMAGE SPACE EXISTS              #
          THEN
            BEGIN 
            CMM$FRF(AT$BGIMAGE);   # RELEASE BGIMAGE SPACE             #
            AT$BGIMAGE = 0; 
            END 
          END                                # IF REQUIRED.            #
        IF AREASAVE[DUMMY+1] EQ 0 THEN
          BEGIN                              # NO MORE AREAS.          #
          FINISHED = TRUE;                   # EXIT LOOP.              #
          END 
        END                                  # END OF -DUMMY- LOOP     #
      END 
# RELEASE ONE OF A KIND SPACE-S, START WITH -IF-KEY-LOGIC- SPACE   #
      IF IFKEYLOC NQ 0 THEN 
        BEGIN 
        CMM$FRF (IFKEYLOC); 
        IFKEYLOC = 0; 
        END 
# RELEASE -VERIFY- SPACE   #
      IF VERIBUF NQ 0 THEN
        BEGIN 
        CMM$FRF (VERIBUF);
        VERIBUF = 0;
        END 
# RELEASE -DATA- SPACE #
      IF DATALOC NQ 0 THEN
        BEGIN 
        CMM$FRF (DATALOC);
        DATALOC = 0;
        END 
# RELEASE -BEFORE- RECORD IMAGE SPACE  #
      IF P<BIMAGE> NQ 0 THEN       # IF SPACE RESERVED FOR BEFORE-IMAGE#
        BEGIN 
        CMM$FRF (P<BIMAGE>);       # FREE THE BLOCK                    #
        P<BIMAGE> = 0;             # NO LONGER SPACE FOR BEFORE-IMAGE  #
        END 
  
# RELEASE KEY LIST AND KEY FILE # 
      IF KEYLIST NQ 0 THEN
        BEGIN 
        CMM$FRF (KEYLIST);
        KEYLIST = 0;
        END 
  
      IF KEYFILE NQ 0              # IF KEY FILE EXISTS AND IS OPEN    #
        AND KEYFLNAM EQ B<0,42>KEYFILE
      THEN
        BEGIN 
        CLOSEM (KEYFLFIT, $DET$, RA0);   # CLOSE FILES AND RELEASE BUF #
        RETURNM (KEYFLFIT, RA0);
        KEYFILE = 0;
        KEYFLNAM = 0; 
        END 
  
#RELEASE ALTERNATE KEY LOC# 
      IF ALKEYLOC NQ 0 THEN 
        BEGIN 
        CMM$FRF (ALKEYLOC); 
        ALKEYLOC = 0; 
      END 
      IF P<RELENTRIES> NQ 0 THEN
        BEGIN 
        CMM$FRF(P<RELENTRIES>); 
        P<RELENTRIES> = 0;
        END 
      IF P<SAVDAREA> NQ 0 THEN
        BEGIN 
        CMM$FRF(P<SAVDAREA>); 
        P<SAVDAREA> = 0;
        END 
      IF P<ORDSAVE> NQ 0
      THEN
        BEGIN 
        CMM$FRF(P<ORDSAVE>);
        P<ORDSAVE> = 0; 
        END 
      IF P<DKIKEY> NQ 0 
      THEN
        BEGIN 
        CMM$FRF(P<DKIKEY>); 
        P<DKIKEY> = 0;
        END 
      IF P<RUSLIST> NQ 0           # IF RELATION USAGE LIST ALLOCATED  #
      THEN
        BEGIN 
        CMM$FRF (P<RUSLIST>);      # FREE RELATION USAGE LIST          #
        P<RUSLIST> = 0;            # INDICATE NO RELATION USAGE LIST   #
        END 
# LASTLY, CLEAR THE BASIC DIRECTIVE FLAGS  #
          BASTABIND=0;
      BASTABLOC = 0;
      BASCPTR = 0;
      SEARCHFLAG = FALSE; 
      USINGFLAG = FALSE;
      IFFLAG = FALSE; 
      NEXTXMISSN = FALSE; 
      FILEPASS = FALSE; 
      UPDATING = FALSE; 
      DESPASS = FALSE;
      REFERFILE = 0;
      WRTRECD = FALSE;
      KEYLIT = 0; 
      UPDTEMP = FALSE;
      IFFROMFLAG = FALSE; 
      CURRELLOC = 0;
      CURRENTLFPTR = 0; 
      FROMKEYINFIT = 0; 
      FRMLFN = " "; 
      UPONLFN = " ";
      RECNAM = 0; 
      RETURN; 
      END  # RELEASESPACE  #
