*DECK DB$CERM 
USETEXT UTCITTX 
USETEXT UTCDFTX 
      PROC DB$CERM; 
  
 #
  
  *   DB$CERM - ERROR HANDLER FOR CRM ERRORS     PAGE  1
  *   STEVEN P. LEVIN                            DATE  11/24/75 
  
  DC  PURPOSE 
  
      HANDLE ERRORS DETECTED BY THE CYBER RECORD MANAGER (CRM) FOR THE
      MASTER DIRECTORY FILE, SUBSCHEMA FILE, OR SCHEMA DIRECTORY FILE.
  
  DC  ENTRY CONDITIONS
  
      ENTRY POINT DB$CEMD IS CALLED FOR A MASTER DIRECTORY FILE ERROR.
      ENTRY POINT DB$CESB IS CALLED FOR A SUBSCHEMA FILE CRM ERROR. 
      ENTRY POINT DB$CESC IS CALLED FOR A SCHEMA DIRECTORY FILE ERROR.
      IN ANY CASE, THE APPROPRIATE FIT ERROR-STATUS/INVALID-REQUEST 
      FIELD SHOULD CONTAIN A VALUE AS SET BY CRM FOR THE ERROR FOUND. 
  
  DC  EXIT CONDITIONS 
  
      IF THE APPROPRIATE FIT ERROR-STATUS FIELD IS 143 OCTAL (TRIVIAL 
      CRM ERROR CODE FOR INSUFFICIENT DATA IN THE FILE FOR THE LENGTH 
      REQUESTED), THE FIT ERROR-STATUS FIELD WILL BE ZEROED AND A 
      NORMAL RETURN WILL BE TAKEN FROM DB$CERM BACK TO THE CALLER.
      HOWEVER, IF THE APPROPRIATE FIT ERROR-STATUS FIELD IS ANYTHING
      OTHER THAN 143 OCTAL, THERE WILL BE NO NORMAL DB$CERM RETURN. 
      INSTEAD, DB$CERR WILL BE CALLED TO HANDLE THE ERROR MESSAGE AND 
      ABORT RETURN.  BEFORE DB$CERR IS CALLED, THE APPROPRIATE FIT
      ERROR-STATUS FIELD WILL BE ZEROED.  ALSO, THE APPROPRIATE COMMON
      STATUS ITEM (STATMAST, STATSCHE, OR STATSUBS) WILL BE SET TO THE
      CRM ERROR VALUE FOR THAT ITEM (SEE NON-LOCAL VARIABLES BELOW).
  
  DC  CALLING ROUTINES
  
      DB$CNSC - CAN CALL DB$CESC TO HANDLE CRM ERRORS DE$NMSC RETURNS 
      DB$COPN - CAN CALL DB$CESB OR DB$CESC TO HANDLE CRM ERRORS
      DB$CREC - CAN CALL DB$CESC TO HANDLE CRM ERRORS DE$DISC RETURNS 
      IN ADDITION, WHEN THE CYBER RECORD MANAGER (CRM) DETECTS AN 
      ERROR IT CAN CALL ENTRY POINT DB$CEMD, DB$CESB, OR DB$CESC FOR A
      MASTER DIRECTORY, SUBSCHEMA, OR SCHEMA ACCESS, RESPECTIVELY.
      CST BUILDER MODULES PASS THE APPROPRIATE ENTRY POINT AS THE 
      ERROR EXIT PARAMETER WHEN CALLING (INTERFACE ROUTINES TO) CRM.
  
  DC  CALLED ROUTINES 
  
      DB$CERR - ERROR MESSAGE AND RETURN HANDLER FOR FATAL ERRORS 
  
  DC  NON-LOCAL VARIABLES 
  
      STATMAST - DB$CEMD SETS TO 4 FOR CRM ERROR OTHER THAN 143 OCTAL 
      STATSCHE - DB$CESC SETS TO 6 FOR CRM ERROR OTHER THAN 143 OCTAL 
      STATSUBS - DB$CESB SETS TO 6 FOR CRM ERROR OTHER THAN 143 OCTAL 
      IN ADDITION, THE APPROPRIATE FIT ERROR-STATUS FIELD IS ZEROED.
  
  DC  DESCRIPTION 
  
      ZERO THE PROPER FILE INFORMATION TABLE (FIT) ERROR-STATUS FIELD.
      IF THE ERROR-STATUS FIELD HAD A VALUE OTHER THAN 143 OCTAL, SET 
      THE PROPER COMMON STATUS ITEM TO THE CRM ERROR VALUE FOR THAT 
      ITEM, AND CALL MODULE DB$CERR TO HANDLE THE ERROR ABORT RETURN. 
      IF THE FIT ERROR-STATUS FIELD HAD THE VALUE 143 OCTAL, RETURN.
  
 #
        CONTROL EJECT;
  
        BEGIN                # DB$CERM #
  
# THE FOLLOWING ARE EXTERNALLY REFERENCED PROCEDURES AND ARRAYS # 
  
        XREF PROC DB$CERR;             # ERROR HANDLER (FATAL ERRORS)#
        XREF ARRAY DE$FTSB;            # SUBSCHEMA DIRECTORY FIT #
          ITEM DEFTSBES U(13,33,9);    # SUBSCHEMA FIT ERROR STATUS # 
        XREF ARRAY DE$FTSC;            # SCHEMA DIRECTORY FIT # 
          ITEM DEFTSCES U(13,33,9);    # SCHEMA FIT ERROR STATUS #
        XREF ARRAY DB$FTMD;            # MASTER DIRECTORY FIT # 
          ITEM DBFTMDES U(13,33,9);    # MASTER DIR. FIT ERROR STATUS#
  
        CONTROL NOLIST;      # UNLISTED COMDECKS: UTCDFDCLS UTCITDCLS#
        CONTROL LIST;        # RESUME THE LISTING OF THE SOURCE CODE #
  
# THE FOLLOWING ITEM IS LOCAL TO DB$CERM #
  
        ITEM ERRSTAT U;      # ERROR STATUS FIELD SAVED FROM A FIT #
        CONTROL EJECT;
  
# ENTRY POINT DB$CEMD IS CALLED FOR A MASTER DIRECTORY FILE CRM ERROR#
  
        ENTRY PROC DB$CEMD;  # MASTER DIRECTORY FILE CRM ERROR #
  
        ERRSTAT = DBFTMDES[0];         # MASTER DIR. FIT ERROR STATUS#
        DBFTMDES[0] = 0;     # ZERO MASTER DIRECTORY FIT ERROR STATUS#
        IF ERRSTAT NQ O"143" # IF NOT INSUFFICIENT DATA TRIVIAL ERROR#
          THEN               # SET STATUS ITEM TO 4 AND CALL DB$CERR #
            BEGIN 
              STATMAST = 4;  # MASTER DIRECTORY STATUS - CRM ERROR #
              XCALL DB$CERR("7371CEMD",ERRSTAT); # UTILITY RUN ABORT #
            END 
  
        RETURN;              # CRM INSUFFICIENT DATA TRIVIAL ERROR #
  
# ENTRY POINT DB$CESB IS CALLED FOR A SUBSCHEMA FILE CRM ERROR #
  
        ENTRY PROC DB$CESB;  # SUBSCHEMA DIRECTORY FILE CRM ERROR # 
  
        ERRSTAT = DEFTSBES[0];         # SUBSCHEMA FIT ERROR STATUS # 
        DEFTSBES[0] = 0;     # ZERO THE SUBSCHEMA FIT ERROR STATUS #
        IF ERRSTAT NQ O"143" # IF NOT INSUFFICIENT DATA TRIVIAL ERROR#
          THEN               # SET STATUS ITEM TO 6 AND CALL DB$CERR #
            BEGIN 
              STATSUBS = 6;  # SUBSCHEMA FILE STATUS - CRM ERROR #
              XCALL DB$CERR("7372CESB",ERRSTAT); # SUBSCHEMA ABORT #
            END 
  
        RETURN;              # CRM INSUFFICIENT DATA TRIVIAL ERROR #
  
# ENTRY POINT DB$CESC IS CALLED FOR A SCHEMA DIRECTORY FILE CRM ERROR#
  
        ENTRY PROC DB$CESC;  # SCHEMA DIRECTORY FILE CRM ERROR #
  
        ERRSTAT = DEFTSCES[0];         # SCHEMA FIT ERROR STATUS #
        DEFTSCES[0] = 0;     # ZERO SCHEMA DIRECTORY FIT ERROR STATUS#
        IF ERRSTAT NQ O"143" # IF NOT INSUFFICIENT DATA TRIVIAL ERROR#
          THEN               # SET STATUS ITEM TO 6 AND CALL DB$CERR #
            BEGIN 
              STATSCHE = 6;  # SCHEMA DIRECTORY STATUS - CRM ERROR #
              XCALL DB$CERR("7373CESC",ERRSTAT); # SCHEMA-LEVEL ABORT#
            END 
  
        RETURN;              # CRM INSUFFICIENT DATA TRIVIAL ERROR #
  
        END                  # DB$CERM #
  
      TERM
