*DECK RTNSSCM 
USETEXT TAREATB 
USETEXT TCMMDEF 
USETEXT TCRMDEF 
USETEXT TENVIRN 
USETEXT TFIT
USETEXT TRELTBL 
USETEXT TSBASIC 
  
      PROC RTNSSCM; 
#----------------------------------------------------------------------#
#                                                                      #
#     R T N S S C M                                                    #
#                                                                      #
#     *RTNSSCM* RETURNS THE SUBSCHEMA FILE AND ALL CM USED BY THE      #
#     LAST USE DIRECTIVE AND CLEARS THE CDCS DATABASE MODE FLAG AND    #
#     THE CDCS CATALOG MODE FLAG AFTER CDCS IS TERMINATED ABNORMALLY.  #
#                                                                      #
#----------------------------------------------------------------------#
  
      BEGIN 
      XREF ITEM AREATBLPTR;        # POINTER TO FIRST AREA TABLE       #
      XREF ITEM CDCSCAT B;         # TRUE IF CDCS VERSION              #
      XREF ITEM CDCSDBM B;         # TRUE IF CDCS USE/CREATE           #
      XREF ITEM INVOKED B;         # TRUE IF CDCS INVOKED              #
      XREF ITEM RA0;               # ZERO FOR END OF PARAMETER LIST    #
      XREF ITEM RELATBLPTR;        # POINTER TO FIRST RELATION TABLE   #
      XREF ITEM TARGETAREA;        # P<AREA$TABLE> OF AREA TO BE       #
                                   # UPDATED IF UPDATE AREA IN EFFECT  #
      XREF ITEM UPDATEAREA B;      # TRUE IF UPDATE AREA IN EFFECT     #
      XREF ITEM VIAPOINT I;        # PTR TO RELATION TABLE ENTRY WITH  #
                                   # VIA SPECIFIED NAME                #
  
      XREF BASED ARRAY DBSTAT;;    # DATA BASE STATUS BLOCK            #
  
      XREF PROC CLOSEM;            # ISSUE CIO REQUEST TO CLOSE        #
      XREF PROC DIAG;              # ISSUE ERROR DIAGNOSTIC            #
      XREF PROC LOADOVL;           # LOADS OVERLAYS                    #
      XREF PROC RETURNM;           # ISSUE CIO REQUEST TO RETURN       #
  
      ITEM DUMMY;                  # LOOP COUNTER                      #
      ITEM LASTENTRY;              # BACKWARD LINK                     #
      ITEM THISENTRY;              # FORWARD LINK                      #
  
      IF VERAREATBL NQ 0           # IF ACTIVE VERIFY LIST             #
      THEN
        BEGIN 
        P<AREA$TABLE> = VERAREATBL;  # POSITION AREA TABLE             #
        CMM$FGR (AT$VERGRPID);       # RELEASE VERIFY CM               #
        VERAREATBL = 0;              # INDICATE NO ACTIVE VERIFY LIST  #
        END 
  
      P<AREA$TABLE> = AREATBLPTR;  # POSITION TO SUBSCHEMA TABLE       #
      P<FIT> = LOC(AT$AFITPOS); 
      THISENTRY = AT$FORWARD;      # SAVE FORWARD POINTER              #
  
      IF FITOC EQ OC$OPEN          # IF SUBSCHEMA FILE IS OPEN         #
      THEN
        BEGIN 
        CLOSEM (FIT, $DET$, RA0);  # CLOSE FILE, RELEASE BUFFERS       #
        END 
  
      RETURNM (FIT, RA0);          # RETURN SUBSCHEMA FILE             #
      CMM$FGR (AT$GROUPID);        # RETURN SUBSCHEMA FILE CM          #
      AREATBLPTR = 0;              # CLEAR POINTER TO STRING           #
      UPDATEAREA = FALSE;          # DISCARD LAST UPDATE AREA          #
      TARGETAREA = 0; 
      VIAPOINT = 0;                # DISCARD LAST VIA                  #
  
      FOR DUMMY = 0 STEP 1
        WHILE THISENTRY NQ 0
      DO
        BEGIN 
        P<AREA$TABLE> = THISENTRY;  # POSITION TO NEXT ENTRY           #
        THISENTRY = AT$FORWARD;     # SAVE POINTER TO NEXT ENTRY       #
        CMM$FGR ( AT$GROUPID);      # RETURN AREA TABLE CM             #
        END 
  
                                   # RELEASE CM FROM RELATION TABLES   #
  
      THISENTRY = RELATBLPTR;      # ADDRESS OF FIRST RELATION TABLE   #
      RELATBLPTR = 0;              # CLEAR RELATION TABLE POINTER      #
  
      FOR DUMMY = 0 STEP 1
        WHILE THISENTRY NQ 0
      DO
        BEGIN 
        P<REL$TABLE> = THISENTRY;  # POSITION TO NEXT RELATION TABLE   #
        THISENTRY = RT$FORWARD;    # SAVE THE FORWARD POINTER          #
        LASTENTRY = P<REL$TABLE>;  # SAVE CURRENT BLOCK ADDRESS        #
        CMM$FGR (RT$GROUPID);      # RELEASE ALL RELATION TABLE CM     #
        END 
  
      IF P<DBSTAT> NQ 0            # IF CDCS STATUS BLOCK ALLOCATED    #
      THEN
        BEGIN 
        CMM$FRF (P<DBSTAT>);       # FREE IT                           #
        P<DBSTAT> = 0;             # CLEAR POINTER                     #
        END 
      CDCSDBM = FALSE;             # CLEAR CDCS DATABASE MODE FLAG     #
      CDCSCAT = FALSE;             # CLEAR CDCS CATALOG MODE FLAG      #
      INVOKED = FALSE;             # CDCS NO LONGER INVOKED            #
      END 
      TERM
