*DECK DB$B20B 
USETEXT BRGENTX 
      PROC DB$B20B; 
      BEGIN 
 #
* *   DB$B20B -                                  PAGE  1
* *   CONTROLLING ROUTINE OF THE (2,0) OVERLAY
* *   E. P. JOHNSON                              DATE  01/10/81 
* * 
* 
* DC  DESCRIPTION 
* 
*     TO SUPERVISE THE EXECUTION OF THE BASIC RECOVERY
*     UTILITY DIRECTIVES. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
* 
*     NONE
* 
*     ASSUMPTIONS 
* 
*     THE EXECUTION TABLE LINKED LIST HAS BEEN SET UP WITH
*     THE BEGINNING ENTRY LOCATION STORED IN THE ITEM - 
*     FIRSTEXT. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL - ALL DIRECTIVES THAT ARE IN THE EXECUTION TABLE 
*              HAVE AT LEAST BEEN PARTIALLY EXECUTED. 
*              IF A DIRECTIVE IS PARTIALLY EXECUTED, THEN AN ERROR
*              OCCURRED THAT STOPPED THE EXECUTION OF THAT DIRECTIVE
*              BUT HAS NO AFFECT ON OTHER DIRECTIVES. 
* 
*     ABNORMAL - A FATAL ERROR HAS OCCURRED IN ONE OF THE DIRECTIVES
*                THAT COULD AFFECT OTHER DIRECTIVES THEREFORE, DBREC
*                EXECUTION STOPS. 
* 
* DC  CALLING ROUTINES
* 
*     DBREC       THE CONTROLLING ROUTINE OF THE (0,0) OVERLAY
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$BALL;               # ALLOCATE DIRECTIVE.           #
      XREF PROC DB$BDPF;               # DUMP DIRECTIVE.               #
      XREF PROC DB$BUNS;               # USE NEW SCHEMA - INTERNAL     #
                                       # DIRECTIVE.                    #
      XREF PROC DB$BUNT;               # DBREC INTERNAL ERROR PROCESSOR#
# 
* DC  NON-LOCAL VARIABLE MODIFIED 
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     - SET THE POINTER OF THE EXECUTION TABLE BASED ARRAY
*       TO THE HEAD OF THE LINKED LIST. 
* 
*     - IF THE POINTER TO THE FIRST ENTRY OF THE LINKED LIST
*       IS ZERO, THEN THIS IS A DBREC INTERNAL ERROR, DBREC IS ABORTED. 
* 
*     - LOOP THROUGH THE EXECUTION TABLE LINKED LIST UNDER THE
*       CONDITIONS THAT, THERE ARE REMAINING LIST ENTRIES AND A 
*       FATAL ERROR (FATAL ON A DIRECTIVE THAT COULD AFFECT 
*       OTHER DIRECTIVES) HAS NOT OCCURRED DURING THE EXECUTION 
*       OF A DIRECTIVE. 
* 
*     - SET THE POINTER OF THE EXECUTION TABLE BASED ARRAY
*       TO THE FIRST/NEXT ENTRY IN THE LIST.
* 
*     - LOOP THROUGH THE DIRECTIVES THAT ARE IN THIS ENTRY
*       UNDER THE CONDITIONS THAT, THE INDEX INTO THIS ENTRY
*       DOES NOT EXCEED THE NUMBER OF DIRECTIVES ACTUALLY 
*       PRESENT AND A FATAL ERROR HAS NOT OCCURRED DURING 
*       THE EXECUTION OF A DIRECTIVE. 
* 
*     - VERIFY THAT THE FUNCTION CODE IN THE DIRECTIVE ENTRY
*       IS A LEGAL VALUE. IF IT IS NOT LEGAL, THEN ABORT DBREC
*       BECAUSE OF THIS INTERNAL ERROR. 
* 
*     - GOTO THE LABEL IDENTIFIED BY THE DIRECTIVE FUNCTION 
*       CODE AND CALL THE ROUTINE TO CARRY OUT THE EXECUTION
*       OF THE DESIRED DIRECTIVE. 
* 
 #
  
# LOCAL VARIABLES.                                                     #
  
      ITEM I     I;          # LOOP VARIABLE.                          #
      ITEM INDEX I;          # LOOP VARIABLE.                          #
  
  
      SWITCH DIRECTIVE   ,DIRECTIVE1,DIRECTIVE2,DIRECTIVE3; 
  
  
  
# S T A R T   O F   D B $ B 2 0 B   E X E C U T A B L E   C O D E      #
  
  
# SET THE POINTER OF THE EXECUTION TABLE BASED ARRAY TO THE HEAD       #
# OF THE LINKED LIST.                                                  #
  
      P<EXTABLE> = LOC(FIRSTEXT); 
  
# IF THE POINTER TO THE FIRST ENTRY OF THE LINKED LIST IS ZERO,        #
# THEN THIS IS AN INTERNAL ERROR, DBREC IS ABORTED.                    #
  
      IF EXNEXT[0] EQ 0 
      THEN
         BEGIN
         DB$BUNT(" DB$B20B-1");        # NO RETURN                     #
         END
  
# LOOP THROUGH THE EXECUTION TABLE LINKED LIST UNDER THE CONDITIONS    #
# THAT, THERE ARE REMAINING LIST ENTRIES AND A FATAL ERROR (FATAL ON   #
# A DIRECTIVE THAT COULD AFFECT OTHER DIRECTIVES) HAS NOT OCCURRED     #
# DURING THE EXECUTION OF A DIRECTIVE.                                 #
  
      ABORT = FALSE;                   # INITIALIZE ABORT FLAG TO FALSE#
  
      FOR I=I 
        WHILE EXNEXT[0] NQ 0
          AND NOT ABORT 
        DO
         BEGIN
         P<EXTABLE> = EXNEXT[0];       # SET THE POINTER OF EXECUTION  #
                                       # TABLE BASED ARRAY TO THE FIRST#
                                       # ENTRY IN THE LIST.            #
  
# LOOP THROUGH THE DIRECTIVES THAT ARE IN THIS ENTRY UNDER THE         #
# CONDITIONS THAT, THE INDEX INTO THIS ENTRY DOES NOT EXCEED THE NUMBER#
# OF DIRECTIVES ACTUALLY PRESENT AND A FATAL ERROR HAS NOT OCCURRED    #
# DURING THE EXECUTION OF A DIRECTIVE.                                 #
  
          FOR INDEX = 1 STEP 1
            WHILE INDEX LQ EXNUMENT[0]
              AND NOT ABORT 
            DO
             BEGIN
             IF EXFUNC[INDEX] GQ DFMNFUNC      # VERIFY THAT THE       #
                AND EXFUNC[INDEX] LQ DFMXFUNC  # FUNCTION CODE IS LEGAL#
             THEN 
               BEGIN
  
# GOTO THE LABEL IDENTIFIED BY THE DIRECTIVE FUNCTION CODE AND CALL    #
# THE ROUTINE TO CARRY OUT THE EXECUTION OF THE DESIRED DIRECRIVE.     #
  
               GOTO DIRECTIVE[EXFUNC[INDEX]]; 
  
               DIRECTIVE1:  
                    DB$BUNS(INDEX);    # USE NEW SCHEMA - INTERNAL     #
                                       # DIRECTIVE.                    #
                    TEST; 
  
               DIRECTIVE2:  
                    DB$BDPF(INDEX);    # DUMP DIRECTIVE.               #
                    TEST; 
  
               DIRECTIVE3:  
                    DB$BALL(INDEX);    # ALLOCATE DIRECTIVE.           #
                    TEST; 
               END
             ELSE 
               BEGIN
               DB$BUNT(" DB$B20B-2");  # DBREC INTERNAL ERROR -        #
                                       # ILLEGAL FUNCTION CODE.        #
                                       # NO RETURN.                    #
               END
             END
         END
      END 
      TERM
