*DECK DBREC 
USETEXT BRGENTX 
USETEXT SCANTXT 
      PRGM DBREC; 
*CALL COPYRDCLS 
      BEGIN 
 #
* *   DBREC - BASIC RECOVERY UTILITY             PAGE  1
* *   P. A. MURRAY                               DATE  01/20/81 
* 
* DC  PURPOSE 
* 
*     THIS ROUTINE SETS UP FILES AS SPECIFIED ON THE DBREC CONTROL
*     CARD AND CONTROLS THE LOADING OF THE PROPER OVERLAYS. 
* 
* DC  ENTRY CONDITIONS
* 
*     THE CONTROL CARD HAS BEEN CRACKED BY THE OPERATING SYSTEM AND 
*     THE PARAMETERS AND SEPARATORS STORED IN RA+2 THRU RA+53 IN THE
*     NOS/BE FORMAT.  THE MASTER DIRECTORY IS PRESENT AT THE CONTROL
*     POINT UNDER LFN "MSTRDIR".
* 
* DC  EXIT CONDITIONS 
* 
*     EXECUTION OF THE INPUT DIRECTIVES IS COMPLETE.  IF ERRORS 
*     OCCURRED, DBREC IS ABORTED. 
* 
* DC  CALLING ROUTINES
* 
*     CALLED BY CONTROL CARD DBREC. 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$BABT;     # ABORT DBREC RUN                         #
      XREF PROC DB$BCCC;     # CRACK CONTROL CARD                      #
      XREF PROC DB$BOOM;     # OUT OF MEMORY -- CMM OVERFLOW           #
      XREF PROC DB$B10E;     # ENTRY POINT FOR THE (1,0) OVERLAY       #
      XREF PROC DB$B20E;     # ENTRY POINT,FOR THE (2,0) OVERLAY       #
      XREF FUNC DB$CDIS C(10);  # CONVERTS BINARY NUMBER TO DISP CODE  #
      XREF PROC DB$MDER;     # MD ERROR PROCESSOR                      #
      XREF PROC DB$MDOE;     # DELETE CMM OVERFLOW-ACTION STACK ENTRY  #
      XREF FUNC DB$MGSS;     # GET CMM STATS.  USED TO GET MAX FL USED #
      XREF FUNC DB$MPOE U;   # PUSH A CMM OVERFLOW-ACTION STACK ENTRY  #
      XREF PROC DB$MSG;      # ISSUE MESSAGE TO DAYFILE                #
      XREF PROC DB$UCLF;     # CLOSE INPUT AND OUTPUT FILES            #
      XREF PROC DB$UCHD;     # CHANGE OUTPUT FILE HEADER LINE          #
      XREF PROC DB$UOPF;     # OPEN INPUT AND OUTPUT FILES             #
      XREF PROC DB$UPRT;     # PRINT A STRING ON THE OUTPUT FILE       #
      XREF PROC DB$USPN;     # SET PROGRAM NAME IN HEADER LINE         #
      XREF PROC DB$WCLS;     # CLOSE WORD ADDRESSABLE FILE             #
      XREF PROC DB$WOPN;     # OPEN WORD ADDRESSABLE FILE              #
      XREF PROC SECOND;      # FORTRAN OBJ TIME ROUTINE FOR CP TIME    #
# 
* D   INTERNAL PROCS/FUNCS
* 
*     DB$BORS - OUTPUT RUN STATISTICS 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     COMMON ITEMS -
*       CURCMMID             CURRENT CMM OVERFLOW-ACTION STACK ENTRY
*       ERRCNT               NUMBER OF FATAL ERRORS ISSUED
*       INSERTITEMC          SPECIAL CHARACTER INSERTION ITEM USED BY 
*                            THE MESSAGE TEXT FORMATTER.
*       INSERTITEMI          SPECIAL INTEGER INSERTION ITEM USED BY THE 
*                            MESSAGE TEXT FORMATTER.
*       WRNMSGCTR            NUMBER OF WARNING MESSAGES ISSUED
*     DB$TFLG                TRACE FLAG 
# 
      XREF ITEM DB$LNLF;     # LINES LEFT ON PAGE                      #
# 
* 
* DC  DESCRIPTION 
* 
*     GET THE STARTING CP TIME.  INITIALIZE ERROR COUNTERS AND THE TRACE
*     FLAG TO 0.  PUSH THE CMM OVERFLOW ENTRY ONTO THE STACK.  CRACK THE
*     CONTROL CARD PARAMETERS.
* 
*     THE HEADER LINE IS SET UP.  INPUT, OUTPUT, AND MASTER DIRECTORY 
*     FILES ARE OPENED. 
* 
*     THE (1,0) OVERLAY IS LOADED AND EXECUTED.  THIS OVERLAY VALIDATES 
*     THE INPUT TO DBREC AND STORES THE INPUT COMMANDS IN AN EXECUTION
*     TABLE FOR USE BY THE (2,0) OVERLAY. 
* 
*     IF NO ERRORS OCCURRED DURING SYNTAX CRACKING, THE (2,0) OVERLAY IS
*     LOADED AND EXECUTED.  THIS OVERLAY EXECUTES THE INPUT DIRECTIVES
*     IN THE EXECUTION TABLE. 
* 
*     CLOSE THE MASTER DIRECTORY FILE AND DELETE THE CMM OVERFLOW ENTRY.
* 
*     OUTPUT THE RUN STATISTICS.
* 
*     IF ANY ERRORS OCCURRED DURING EITHER SYNTAX CRACKING OR DIRECTIVE 
*     EXECUTION, ABORT THE DBREC RUN. 
* 
*     CLOSE THE INPUT AND OUTPUT FILES AND STOP EXECUTION.
* 
 #
  
  
# EXTERNAL ARRAYS.                                                     #
  
*CALL FITMDDCLS 
  
# LOCAL ITEMS, DEFS AND ARRAYS.                                        #
  
      ITEM ENDTIME R;        # CONTAINS CP TIME AT END OF RUN          #
      ITEM STRTIME R;        # CONTAINS CP TIME AT START OF RUN        #
  
      DEF DFHEADERL #60#;    # LENGTH OF THE HEADER LINE IN CHARS      #
  
      ARRAY EXCOMPMSG P(5);        # DBREC EXECUTION COMPLETE MESSAGE  #
        BEGIN 
        ITEM EXCMSGCC  C(00,00,01); 
        ITEM EXCMSG1   C(00,00,30) = ["     DBREC EXECUTION COMPLETE "];
        ITEM EXCERRCNT C(03,00,05); 
        ITEM EXCMSG2   C(03,30,11) = [" ERRORS    "]; 
        ITEM EXCMSG3   U(04,36,24) = [0]; 
        END 
  
      ARRAY HEADER1 P(6); 
        BEGIN 
        ITEM H1LN1 C(00,00,20)=["DBREC SOURCE LISTING"];
        ITEM H1LN2 C(02,00,40)=[" "]; 
        END 
  
      ARRAY HEADER2 P(6); 
        BEGIN 
        ITEM H2LN1 C(00,00,30)=["DBREC EXECUTION LISTING       "];
        ITEM H2LN2 C(03,00,30)=[" "]; 
        END 
  
      ARRAY SYNCOMPMSG P(6);       # SYNTAX VALIDATION COMPLETE MESSAGE#
        BEGIN 
        ITEM SYNMSGCC  C(00,00,01); 
        ITEM SYNMSG1   C(00,00,40) = ["     DBREC SYNTAX VALIDATION COMP
LETE   "];
        ITEM SYNERRCNT C(04,00,05); 
        ITEM SYNMSG2   C(04,30,11) = [" ERRORS    "]; 
        ITEM SYNMSG3   U(05,36,24) = [0]; 
        END 
  
      ARRAY WARNMSG P(5);          # WARNING MESSAGE                   #
        BEGIN 
        ITEM WRNMSG1   C(00,00,30) = [" "]; 
        ITEM WRNMSGCNT C(03,00,05); 
        ITEM WRNMSG2   C(03,30,10) = [" WARNINGS "];
        END 
      CONTROL EJECT;
      PROC DB$BORS; 
      BEGIN 
 #
* *   DBREC                                      PAGE  1
* *   DB$BORS - OUTPUT RUN STATISTICS 
* *   P. A. MURRAY                               DATE  01/21/81 
* 
* DC  PURPOSE 
* 
*     TO OUTPUT CP TIME AND FIELD LENGTH FOR THE RUN. 
* 
* DC  ENTRY CONDITIONS
* 
*     THE OUTPUT FILE IS OPEN.  STRTIME EQUALS THE CP TIME AT THE 
*     START OF THE JOB. 
* 
* DC  EXIT CONDITIONS 
* 
*     MESSAGES HAVE BEEN PRINTED ON THE OUTPUT FILE AND DAYFILE.
* 
* DC  CALLING ROUTINES
* 
*     DBREC - BASIC RECOVERY UTILITY MAIN ROUTINE 
* 
* DC  CALLED ROUTINES 
* 
*     DB$CDIS - CONVERTS BINARY NUMBER TO DISPLAY CODE
*     DB$MGSS - GET MAX FL USED BY JOB FROM CMM 
*     DB$MSG  - ISSUE MESSAGE TO DAYFILE
*     DB$UPRT - PRINT A STRING ON THE OUTPUT FILE 
*     SECOND  - FORTRAN OBJ TIME ROUTINE FOR CP TIME
* 
* DC  DESCRIPTION 
* 
*     CALL DB$MGSS TO GET FIELD LENGTH STATISTICS OF THE RUN FROM CMM.
*     STORE THE MAXIMUM FL USED IN THE "FL" MESSAGE AND PRINT THE 
*     MESSAGE ON THE OUTPUT FILE. 
* 
*     GET THE ENDING CP TIME.  CALCULATE THE TOTAL CP TIME USED BY THE
*     JOB.  SEND THE "TIME AND FL" MESSAGE TO THE DAYFILE.  PRINT THE 
*     "TIME" MESSAGE ON THE OUTPUT FILE.
* 
*     RETURN TO THE CALLING ROUTINE.
* 
 #
  
  
      BASED ARRAY STATS (6);       # SUMMARY STATISTICS FOR CMM        #
        BEGIN 
        ITEM MAXMM    U(00,00,60);
        ITEM MAXFL    U(01,00,60);
        ITEM NUMCRASH U(02,00,60);
        ITEM NUMINCR  U(03,00,60);
        ITEM NUMDECR  U(04,00,60);
        ITEM NUMOVER  U(05,00,60);
        END 
  
  
      ARRAY FLMSG P(4);      # FIELD LENGTH USED MESSAGE               #
        BEGIN 
        ITEM FLMSG1 C(00,00,40) = 
          ["     REQUIRED        B WORDS SCM  "]; 
        END 
  
  
      ARRAY TIMEFLMSG P(4);  # TIME AND FIELD LENGTH MESSAGE           #
        BEGIN 
        ITEM TIMFL1   C(00,00,09) = ["REQUIRED "];
        ITEM TIMFLFL  C(00,54,06);
        ITEM TIMFL2   C(01,30,11) = ["B WORDS    "];
        ITEM TIMFLSEC C(02,36,04);
        ITEM TIMFL3   C(03,00,01) = ["."];
        ITEM TIMFLMIL C(03,06,03);
        ITEM TIMFL4   C(03,24,04) = [" SEC"]; 
        ITEM TIMFL5   U(03,48,12) = [0];
        END 
  
  
      ARRAY TIMEMSG P(4);    # RUN TIME MESSAGE                        #
        BEGIN 
        ITEM TIMMSG1 C(00,00,40) =
          ["     RUN TIME      .    SECONDS "]; 
        END 
  
  
      ITEM TEMPINT I;        # TEMP STORAGE FOR INTEGER ITEM           #
      CONTROL EJECT;
  
# S T A R T   O F   D B $ B O R S   E X E C U T A B L E   C O D E      #
  
  
# CALL DB$MGSS TO GET FIELD LENGTH STATISTICS OF THE RUN FROM CMM.     #
# STORE THE MAXIMUM FL USED IN THE "FL" MESSAGE AND PRINT THE MESSAGE  #
# ON THE OUTPUT FILE.  ALSO STORE THE FL USED IN THE "TIME AND FL"     #
# MESSAGE TO BE PRINTED ON THE DAYFILE LATER.                          #
  
      P<STATS> = DB$MGSS; 
  
      C<15,6>FLMSG1[0] = DB$CDIS(MAXFL[0],6,8," "); 
      TIMFLFL[0] = C<15,6>FLMSG1[0];
      DB$UPRT(FLMSG,40);
  
# GET THE ENDING CP TIME.  CALCULATE THE TOTAL CP TIME USED BY THE JOB.#
  
      SECOND(ENDTIME);
      ENDTIME = ENDTIME - STRTIME;
  
# CALCULATE THE NUMBER OF SECONDS USED BY THE JOB.  STORE THIS NUMBER  #
# IN THE "TIME" AND IN THE "TIME AND FL" MESSAGES.                     #
  
      TEMPINT = ENDTIME;
      C<15,4>TIMMSG1[0] = DB$CDIS(TEMPINT,4,10," ");
      TIMFLSEC[0] = C<15,4>TIMMSG1[0];
  
# CALCULATE THE NUMBER OF MILLISECONDS USED BY THE JOB.  STORE THIS    #
# NUMBER IN THE "TIME" AND IN THE "TIME AND FL" MESSAGES.              #
  
      TEMPINT = (ENDTIME - TEMPINT) * 1000; 
      C<20,3>TIMMSG1[0] = DB$CDIS(TEMPINT,3,10,"0");
      TIMFLMIL[0] = C<20,3>TIMMSG1[0];
  
# PRINT THE "TIME" MESSAGE ON THE OUTPUT FILE.  SEND THE "TIME AND FL" #
# MESSAGE TO THE DAYFILE.                                              #
  
      DB$UPRT(TIMEMSG,40);
      DB$MSG(TIMEFLMSG);
  
# RETURN TO THE CALLING ROUTINE.                                       #
  
      RETURN; 
  
      END 
      CONTROL EJECT;
  
  
# S T A R T   O F   D B R E C   E X E C U T A B L E   C O D E          #
  
  
# START STATISTICS GATHERING.                                          #
  
      SECOND(STRTIME);
  
# INITIALIZE COMMUNICATION CELLS.  PUSH THE CMM OVERFLOW ENTRY.        #
  
      ERRCNT = 0; 
      WRNMSGCTR = 0;
      DB$TFLG = 0;
      INSERTITEMC = " ";
      INSERTITEMI = 0;
      CURCMMID = DB$MPOE(DFTRIGLV,DFTRIGWD,DB$BOOM);
  
# CALL DB$BCCC TO CRACK THE CONTROL CARD PARAMETERS.                   #
  
      DB$BCCC;
  
# OPEN THE INPUT AND OUTPUT FILES.                                     #
  
      DB$UOPF;
  
# SET UP THE HEADER LINE.                                              #
  
      DB$USPN("   DBREC V");           # SET THE PROGRAM NAME INTO     #
                                       # THE HEADER LINE.              #
  
      DB$UCHD(HEADER1,DFHEADERL);      # SET THE VARIABLE PORTION OF   #
                                       # THE HEADER LINE.              #
  
      DB$LNLF = 0;                     # SET LINES LEFT TO 0 TO START  #
                                       # A NEW PAGE.                   #
  
# OPEN THE MASTER DIRECTORY FILE.                                      #
  
      DB$WOPN(DB$FTMD,DB$MDER); 
  
# LOAD AND EXECUTE THE (1,0) OVERLAY WHICH VALIDATES THE INPUT TO      #
# DBREC AND BUILDS THE EXECUTION TABLE.  PRINT THE "SYNTAX COMPLETE"   #
# MESSAGE ON THE DAYFILE AND OUTPUT FILE.                              #
  
      DB$B10E;
  
      SYNERRCNT[0] = DB$CDIS(ERRCNT,5,10," ");
      DB$MSG(SYNCOMPMSG); 
      SYNMSGCC[0] = "-";           # TRIPLE SPACE MSG FOR OUTPUT FILE  #
      DB$UPRT(SYNCOMPMSG,60); 
  
# IF NO ERRORS OCCURRED DURING SYNTAX CRACKING, LOAD AND EXECUTE THE   #
# (2,0) OVERLAY WHICH EXECUTES THE INPUT DIRECTIVES.  PRINT THE        #
# "EXECUTION COMPLETE" MESSAGE ON THE DAYFILE AND OUTPUT FILE.         #
  
      IF ERRCNT EQ 0
      THEN
        BEGIN 
  
        DB$UCHD(HEADER2,DFHEADERL);    # SET THE VARIABLE PORTION OF   #
                                       # THE HEADER LINE.              #
  
        DB$LNLF = 0;                   # SET LINES LEFT TO 0 TO START  #
                                       # A NEW PAGE.                   #
  
        DB$B20E;
  
        EXCERRCNT[0] = DB$CDIS(ERRCNT,5,10," ");
        WRNMSGCNT[0] = DB$CDIS(WRNMSGCTR,5,10," "); 
        DB$MSG(EXCOMPMSG);
        DB$MSG(WARNMSG);
        EXCMSGCC[0] = "-";         # TRIPLE SPACE MSG FOR OUTPUT FILE  #
        DB$UPRT(EXCOMPMSG,50);
        DB$UPRT(WARNMSG,50);
  
        END 
  
# CLOSE THE MASTER DIRECTORY.  DELETE THE CMM OVERFLOW ENTRY.          #
  
      DB$WCLS(DB$FTMD,DB$MDER); 
      DB$MDOE(CURCMMID);
  
# OUTPUT THE RUN STATISTICS.                                           #
  
      DB$BORS;
  
# IF ANY ERRORS OCCURRED DURING EITHER SYNTAX CRACKING OR DIRECTIVE    #
# EXECUTION, ABORT THE DBREC RUN.                                      #
  
      IF ERRCNT GR 0
      THEN
        BEGIN 
        DB$BABT(0); 
        END 
  
# CLOSE INPUT AND OUTPUT FILES.                                        #
  
      DB$UCLF;
  
# STOP EXECUTION.                                                      #
  
      STOP; 
  
      END 
      TERM
