*COMDECK CLCAT                                                          133700
CONTROL EJECT;  # S T A R T   O F   C O M D E C K   C L C A T          #133800
#----------------------------------------------------------------------#133900
#                                                                      #134000
#     C L C A T                                                        #134100
#                                                                      #134200
#     THE OBJECTIVE OF THIS ROUTINE IS TO ENSURE FILE INTEGRITY OF THE #134300
# CATALOG FILE. IT IS CALLED DURING CLEANUP FROM ABNORMAL TERMINATION, #134400
# DURING THE PROCESSING OF THE *VERSION* DIRECTIVE, AND WHEN A NEW     #134500
# PRIMARY OVERLAY IS TO BE LOADED ON TOP OF THE SYNTAX PRIMARY (1,0).  #134600
# ALL THESE CALLS COME THROUGH ROUTINE *AUTOPSY*. THE PROCESSING IS A  #134700
# SERIES OF *IF* TESTS WHICH ATTEMPT TO  HANDLE ALL THE CASES BY       #134800
# REPEATED REMOVAL OF SPECIAL CASES, LEAVING US WITH THE CASES WHICH   #134900
# REQUIRE NO ACTION AT ALL. THERE IS A TEST OF *FITORG* WHICH WOULD    #135000
# SAVE US A *CLOSE* ON THE CATALOG, BUT ONLY IF *FLUSH* IS AVAILABLE.  #135100
# THE *FLUSH* FUNCTION IS AVAILABLE ONLY ON CRM2.0, AND AS WE ARE TO   #135200
# INTERFACE WITH BOTH CRM1.5 AND CRM2.0, WE CANNOT  ASSUME THAT *FLUSH*#135300
# CAN BE USED. IN THIS CASE, *CLOSE* HAS BEEN USED, AND *FLUSH* CAN BE #135400
# SUBSTITITED FOR THE *CLOSE* AT SUCH TIME AS WE KNOW THAT OUR ENVIRON-#135500
# MENT INCLUDES ORG=NEW *IS* (CRM2.0).                                 #135600
                                                                        135700
      PROC CLCAT;                                                       135800
      BEGIN                                                             135900
      XREF ITEM  ABORTED B;        # TRUE IF PROC *ABORT* WAS ENTERED  #136000
      XREF ITEM  SLOPERF B;        # TRUE IF SLOW PERFORM              #136100
                                                                        136200
      P<FIT> = LOC(CATAFIT);       # FIT OF THE CATALOG FILE           #136300
      IF FITOC NQ OC$OPEN          # IF CATALOG FILE NOT OPEN          #136400
      THEN                                                              136500
        BEGIN                                                           136600
        RETURN;                    # NO WORK IF NOT OPEN               #136700
        END                                                             136800
                                                                        136900
      IF ABORTED                   # IF DOING ABNORMAL CLEANUP         #137000
        OR SLOPERF                 # OR AVOIDING EXTRA FL OF FAST PERF #137100
      THEN                                                              137200
        BEGIN                                                           137300
        CLOSEM(FIT, RA0);          # CATALOG FILE MUST BE CLOSED       #137400
        RETURN;                                                         137500
        END                                                             137600
                                                                        137700
      IF NOT PERFLG                # IF NOT DOING A *PERFORM*          #137800
        AND NOT (PRIMARY EQ 2)     # AND NOT DOING A *PREPARE*         #137900
      THEN                                                              138000
        BEGIN                                                           138100
        CLOSEM(FIT, RA0);          # CLOSE FOR FL REDUCTION            #138200
        RETURN;                                                         138300
        END                                                             138400
                                                                        138500
      IF MODCAT                    # IF CATALOG MODIFIED SINCE CLOSE   #138600
      THEN                                                              138700
        BEGIN                                                           138800
        IF FITORG                  # IF ORG = NEW *IS* FILE            #138900
        THEN                                                            139000
          BEGIN                                                         139100
                                   # FOLLOWING CLOSE SHOULD BE A FLUSH #139200
          CLOSEM(FIT, RA0);        # ENSURE FILE INTEGRITY BY CLOSING  #139300
          END                                                           139400
                                                                        139500
        ELSE                                                            139600
          BEGIN                                                         139700
          CLOSEM(FIT, RA0);        # CLOSE FOR FILE INTEGRITY          #139800
          END                                                           139900
                                                                        140000
        RETURN;                                                         140100
        END                                                             140200
                                                                        140300
      IF NOT PERFLG                # IF NOT A *PERFORM*, THEN MUST BE  #140400
                                   # A *PREPARE*                       #140500
        AND (LVL EQ RPTCTR)        # AND RETURNING TO USER INPUT AFTER #140600
                                   # THIS *PREPARE* IS FINISHED        #140700
      THEN                                                              140800
        BEGIN                                                           140900
        CLOSEM(FIT, RA0);          # CLOSE FOR FL REDUCTION            #141000
        RETURN;                                                         141100
        END                                                             141200
                                                                        141300
      IF TARGETAREA NQ 0           # IF ABOUT TO UPDATE AN AREA        #141400
        AND NOT FITORG             # AND CATALOG IS *ORG=OLD* *IS*     #141500
      THEN                                                              141600
        BEGIN                                                           141700
        P<AREA$TABLE> = TARGETAREA;                                     141800
        P<FIT> = LOC(AT$AFITPOS);  # POINT TO THIS AREAS FIT           #141900
        IF FITFO EQ FOIS           # IF AN *IS* FILE                   #142000
          AND NOT FITORG           # AND IT IS ALSO *ORG=OLD* *IS*     #142100
        THEN                                                            142200
          BEGIN                                                         142300
          P<FIT> = LOC(CATAFIT);   # LOCATE FIT OF CATALOG FILE AGAIN  #142400
          CLOSEM(FIT, RA0);        # CLOSE CATALOG FILE SO DONT HAVE   #142500
                                   # AN ATTEMPT TO LOAD *OLD* *IS*     #142600
                                   # WHILE *OLD* *READ-ONLY* *IS* IS IN#142700
          RETURN;                                                       142800
          END                                                           142900
                                                                        143000
        P<FIT> = LOC(CATAFIT);     # REPOINT TO CATALOG FILE FIT       #143100
        END                                                             143200
                                                                        143300
      RETURN;                      # ALL OTHER CASES, LEAVE IT ALONE   #143400
      END                                                               143500
                                                                        143600
                # E N D   O F   C O M D E C K   C L C A T              #143700
