*DECK DB$BCCC 
USETEXT BRGENTX 
      PROC DB$BCCC; 
      BEGIN 
 #
* *   DB$BCCC - CRACK CONTROL CARD               PAGE  1
* *   P. A. MURRAY                               DATE  01/20/81 
* 
* DC  PURPOSE 
* 
*     TO CRACK THE DBREC CONTROL CARD AND INITIALIZE THE PARAMETERS.
* 
* 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. 
* 
* DC  EXIT CONDITIONS 
* 
*     RUN PARAMETERS HAVE BEEN INITIALIZED.  IF ANY CONTROL CARD ERRORS 
*     ARE FOUND, OR IF THE FILE "MSTRDIR" IS NOT AT THE CONTROL POINT,
*     THE RUN IS ABORTED. 
* 
* DC  CALLING ROUTINES
* 
*     DBREC - BASIC RECOVERY UTILITY MAIN ROUTINE 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ABRT;     # ABORT THE RUN                           #
      XREF PROC DB$MSG;      # ISSUE MESSAGE TO THE DAYFILE            #
      XREF FUNC DB$STAT I;   # CHECK IF FILE IS AT CP                  #
# 
* D   INTERNAL PROCS/FUNCS
* 
*     BADPARM - ABORT -- BAD PARAMETER
*     STORLFN - STORE LFN IN VARIABLE 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     CDCSFLG                CDCS INITIATED JOB FLAG
# 
      XREF ITEM DB$MIN U;    # INPUT FILE LFN                          #
      XREF ITEM DB$MOUT U;   # OUTPUT FILE LFN                         #
# 
* DC  DESCRIPTION 
* 
*     INITIALIZE DEFAULT CONTROL CARD PARAMETERS. 
* 
*     INTERPRET ALL PARAMETERS ON THE CONTROL CARD.  VERIFY THAT ALL
*     PARAMETERS ARE LEGAL AND APPEAR ONLY ONCE.  IF ANY CONTROL CARD 
*     ERRORS ARE DETECTED, THE RUN IS ABORTED.
* 
*     VERIFY THAT THE MASTER DIRECTORY IS AT THE CONTROL POINT UNDER THE
*     NAME "MSTRDIR".  IF IT IS NOT AT THE CONTROL POINT, ISSUE A 
*     MESSAGE TO THE DAYFILE AND ABORT. 
* 
*     RETURN TO THE CALLING ROUTINE.
* 
 #
  
  
      DEF DFCOMPILE #O"03171520111405000000"#;  # COMPILE, ZERO FILLED #
      DEF DFEQUAL  #2#;      # THE CODE FOR AN EQUAL SIGN AS A CONTROL #
                             # CARD SEPARATOR IS 2                     #
      DEF DFINPUT  #O"11162025240000000000"#;   # INPUT, ZERO FILLED   #
      DEF DFLEGLPCNT  #2#;   # NO. OF PARAMS ALLOWED ON CC, MINUS 1    #
      DEF DFOUTPUT #O"17252420252400000000"#;   # OUTPUT, ZERO FILLED  #
      DEF DFMSTRDIR  #O"15232422041122000000"#; # MSTRDIR, ZERO FILLED #
      DEF DFNMPARAMLOC #52#; # LOCATION OF THE NUMBER OF PARAMETERS IN #
                             # THE COMMUNICTION AREA - RA+64           #
  
  
  
      ITEM INDEX I;          # LOOP INDEX                              #
      ITEM PARAM I;          # CC PARAMETER BEING WORKED ON            #
      ITEM PARAMCNT I;       # NUMBER OF CONTROL CARD PARAMETERS       #
      ITEM SUBINDEX I;       # LOOP INDEX                              #
  
# PARAMETER VALUES DEFINED BELOW MUST CORRESPOND TO SWITCH VALUES IN   #
# SWITCH CCPARMSW, SINCE A COMMON INDEX IS USED TO REFERENCE THEM.     #
  
      ARRAY CCPARMTBL[DFLEGLPCNT];
        BEGIN 
        ITEM LEGPARAM U(00,00,60);              # THE WHOLE PARAMETER  #
        ITEM P1HALF U(00,00,18) = [O"110000",   #I# 
                                   O"140000",   #L# 
                                   O"030400"];  #CD#
        ITEM P2HALF U(00,18,42) = [0,0,0];
        END 
  
      XREF ARRAY DB$RA0;     # ARRAY FOR EXAMINING THE SYSTEM'S        #
                             # COMMUNICATIONS AREA                     #
        BEGIN 
        ITEM CCPARAM U(00,00,42);      # CONTROL CARD PARAMETER        #
        ITEM NUMCCPR U(00,42,18);      # NUMBER OF CC PARAMETERS       #
        ITEM CCPRSEP U(00,54,06);      # CONTROL CARD SEPARATOR        #
        END 
  
      SWITCH CCPARMSW INPUTLFN,    # SAVE INPUT LFN                    #
                      LISTLFN,     # SAVE OUTPUT LIST LFN              #
                      CDCSCALL;    # SET CDCS FLAG                     #
      CONTROL EJECT;
      PROC BADPARM ((NAME));
      BEGIN 
 #
* *   DB$BCCC                                    PAGE  1
* *   BADPARM - ABORT -- BAD PARAMETER
* *   P. A. MURRAY                               DATE  01/21/81 
* 
* DC  PURPOSE 
* 
*     TO ISSUE THE "BAD PARAMETER" MESSAGE AND ABORT THE PROGRAM. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM NAME C(10);       # PARAMETER VALUE IN ERROR                #
# 
* D   ASSUMPTIONS 
* 
*     AN INVALID PARAMETER HAS BEEN DETECTED. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE "BAD PARAMETER" MESSAGE IS SENT TO THE DAYFILE.  THE RUN IS 
*     ABORTED.
* 
* DC  CALLING ROUTINES
* 
*     DB$BCCC - CRACK CONTROL CARD
* 
* DC  CALLED ROUTINES 
* 
*     DB$ABRT - ABORT RUN 
*     DB$MSG  - ISSUE MESSAGE TO DAYFILE
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     STORE THE PARAMETER IN ERROR IN THE "BAD PARAMETER" MESSAGE.  SEND
*     THE "BAD PARAMETER" MESSAGE TO THE DAYFILE.  ABORT THE RUN. 
* 
 #
  
      ITEM BADPARMMSG C(30) = "    BAD PARAMETER = "; 
      ITEM ABORTMSG C(30) = "    **** DBREC ABORT ****     "; 
  
  
      C<20,10>BADPARMMSG = NAME;
      DB$MSG(BADPARMMSG); 
      DB$MSG(ABORTMSG); 
      DB$ABRT;
  
      END 
      CONTROL EJECT;
      PROC STORLFN (FILNAM);
      BEGIN 
 #
* *   DB$BCCC                                    PAGE  1
* *   STORLFN - STORE LFN IN VARIABLE 
* *   P. A. MURRAY                               DATE  01/21/81 
* 
* DC  PURPOSE 
* 
*     TO VERIFY THAT THE NEXT CONTROL CARD PARAMETER IS A VALID FILE
*     NAME AND TO STORE THE NAME IN THE LOCATION SPECIFIED. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM FILNAM U;         # LOCATION TO SAVE LFN                    #
# 
* D   ASSUMPTIONS 
* 
*     INDEX - POINTS TO THE PREVIOUS PARAMETER IN THE CC AREA 
* 
* DC  EXIT CONDITIONS 
* 
*     FILNAM = LFN, ZERO FILLED 
*     INDEX = INDEX + 1 
* 
* DC  CALLING ROUTINES
* 
*     DB$BCCC - CRACK CONTROL CARD
* 
* DC  CALLED ROUTINES 
* 
*     BADPARM - ABORT -- BAD PARAMETER
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     INDEX                  INCREMENTED BY 1 
* 
* DC  DESCRIPTION 
* 
*     THE VARIABLE, INDEX, IS BUMPED BY 1 TO POINT TO THE LFN.  THE 
*     CONTROL CARD PARAMETER IT IS POINTING TO IS ZERO-FILLED AND STORED
*     IN FILNAM.  IF THE FIRST CHARACTER IS NOT A LETTER, THE RUN IS
*     ABORTED.
* 
 #
  
  
      INDEX = INDEX + 1;
      FILNAM = CCPARAM[INDEX] * 2**18;
      IF C<0,1>FILNAM GR "Z"         # TEST IF FIRST CHAR IS A LETTER#
        OR C<0,1>FILNAM LS "A"
      THEN                            # ILL-FORMED LFN                 #
        BEGIN 
        BADPARM(FILNAM);
        END 
      RETURN; 
  
      END 
      CONTROL EJECT;
  
  
# S T A R T   O F   D B $ B C C C   E X E C U T A B L E   C O D E      #
  
  
# INITIALIZE DEFAULT CONTROL CARD PARAMETERS                           #
  
      DB$MIN = DFINPUT; 
      DB$MOUT = DFOUTPUT; 
      CDCSFLG = FALSE;
  
# INTERPRET ALL PARAMETERS ON THE CONTROL CARD.  VERIFY THAT ALL       #
# PARAMETERS ARE LEGAL AND APPEAR ONLY ONCE.                           #
  
      PARAMCNT = NUMCCPR[DFNMPARAMLOC] + 1; 
                                       # GET NUMBER OF PARAMETERS      #
      FOR INDEX = 2 STEP 1 UNTIL PARAMCNT 
      DO
        BEGIN 
        PARAM = CCPARAM[INDEX] * 2**18;  # GET PARAMETER AND ZERO FILL #
        FOR SUBINDEX = 0 STEP 1 UNTIL DFLEGLPCNT
        DO                   # CHECK PARAMETER AGAINST LEGAL VALUES    #
          BEGIN 
          IF PARAM EQ LEGPARAM[SUBINDEX]
          THEN                         # LEGAL PARAMETER               #
            BEGIN 
            LEGPARAM[SUBINDEX] = 0;    # CLEAR PARAMETER SINCE IT MAY  #
                                       # BE SPECIFIED ONLY ONCE        #
            GOTO CCPARMSW[SUBINDEX];   # SWITCH ON PARAMETER VALUE.    #
                                       # RETURN FROM SWITCH WILL GO TO #
                                       # TEST PORTION OF INDEX FOR LOOP#
            END 
          END 
        BADPARM(PARAM);      # PARAMETER IS ILLEGAL                    #
  
# THE FOLLOWING LABELED CODE IS JUMPED TO AS PARAMETERS ARE RECOGNIZED.#
# THE CODE IS JUMPED TO BY MEANS OF SWITCH CCPARMSW AND SUBINDEX.  THE #
# PARAMETERS ARE VERIFIED AND STORED.                                  #
  
INPUTLFN:                              # PARAMETER I WAS FOUND         #
        IF CCPRSEP[INDEX] EQ DFEQUAL
        THEN                           # PARAMETER WAS I=LFN           #
          BEGIN 
          STORLFN(DB$MIN);             # STORE NEW LFN, INDEX IS BUMPED#
          END 
        ELSE
          BEGIN 
          DB$MIN = DFCOMPILE;          # I ALONE SETS LFN TO COMPILE   #
          END 
        TEST;                          # SEE IF ANY MORE PARAMETERS    #
  
  
LISTLFN:                               # PARAMETER L WAS FOUND         #
        IF CCPRSEP[INDEX] EQ DFEQUAL
        THEN
          BEGIN 
          IF C<0,1>CCPARAM [INDEX+1] EQ "0" 
          THEN                         # L=0, SUPPRESS OUTPUT LIST     #
            BEGIN 
            INDEX = INDEX + 1;
            DB$MOUT = 0;
            END 
          ELSE                         # PARAMETER WAS L=LFN           #
            BEGIN 
            STORLFN(DB$MOUT);          # STORE NEW LFN, INDEX IS BUMPED#
            END 
          END 
        TEST;                          # SEE IF ANY MORE PARAMETERS    #
  
  
CDCSCALL:                              # PARAMETER CD WAS FOUND        #
        CDCSFLG = TRUE; 
        TEST;                          # SEE IF ANY MORE PARAMETERS    #
  
        END                            # END OF CONTROL CARD CRACKING  #
  
  
# VERIFY THAT THE MASTER DIRECTORY IS AT THE CONTROL POINT.  IF IT IS  #
# NOT, ISSUE A MESSAGE TO THE DAYFILE AND ABORT THE RUN.               #
  
      IF DB$STAT(DFMSTRDIR) EQ 0
      THEN
        BEGIN 
        DB$MSG("    FILE MSTRDIR NOT AT CONTROL POINT -- RUN ABORTED"); 
        DB$ABRT;
  
        END 
  
  
      END 
      TERM
