*DECK DB$BRJB*
USETEXT CDCSCTX 
USETEXT JLPCMTX 
      PROC DB$BRJB(SPOTOPT,FILETYP,MDJOBP,CSTMTP);
      BEGIN 
 #
* *   DB$BRJB - CREATE DBREC CONTROL STATEMENTS  PAGE  1
* *   W P CEAGLIO                                DATE  05/20/81 
* *   KIM H. NGUYEN - CCLPROC CLAUSE             DATE  11/14/84 
* 
* DC  PURPOSE 
* 
*     TO CREATE CONTROL STATEMENTS FOR A DBREC JOB (NOS). 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM SPOTOPT I;              # TYPE OF OPERATION FOR DBREC       #
                                   # (VALUES IN COMDECK DBRDFDCLS)     #
      ITEM FILETYP I;              # TYPE OF FILE FOR SPOT             #
                                   # (VALUES IN COMDECK DBRDFDCLS)     #
      ITEM MDJOBP  I;              # POINTER TO MD JOB CONTROL INFO    #
      ITEM CSTMTP  I;              # POINTER TO CONTROL CARD BUFFER    #
# 
*     NOTE - CURRENTLY, ONLY DUMP OF JOURNAL LOG SUPPORTED. 
* 
* D   ASSUMPTIONS 
* 
*     SAL EXISTS. 
*     SALX IS SET.
*     IF JOURNAL LOG DUMP, SAJLFPTR POINTS TO JOURNAL LOG QUEUE.  THE 
*     JOURNAL LOG HEADER RECORD EXISTS IN THE QUEUE AND CONTAINS THE
*     PERMANENT FILE NAME OF THE LOG FILE TO BE DUMPED. 
*     FOR AREA-TYPE FUNCTION, P<OFT> IS ALSO SET. 
* 
* DC  EXIT CONDITIONS 
* 
*     THE DBREC CONTROL STATMENTS HAVE BEEN CREATED IN THE SPECIFIED
*     BUFFER. 
* 
* DC  CALLING ROUTINES
* 
*     DB$BRIF      BASIC RECOVERY INTERFACE 
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CDEC C(10);     # CONVERT BINARY TO DECIMAL DISPLAY #
# 
* DC  INTERNAL PROCS
* 
*     INSERT       INSERT TEXT IN CONTROL STATEMENT LINE
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     BUFFER POINTED TO BY PARAMETER *CSTMTP* 
* 
* DC  DESCRIPTION 
* 
*     THE CONTROL STATEMENTS COMPRISING THE DBREC JOB ARE STRUCTURED
*     IN A BUFFER A LINE AT A TIME IN THE FOLLOWING MANNER: 
*     CASE 1:  TAPE CLAUSE IS SPECIFIED 
* 
*     LINE    TYPE           CONTENT
*     ----    ----           -------
* 
*       1     JOB CARD       DBREC,T37777.
*       2     USER CARD      USER,USERNUM,PASSWORD,FAMILY.
*       3     CHARGE CARD    CHARGE,ACCOUNTING-DATA.
*       4     RESOURC CARD   RESOURC,DENSITY-SPEC/MT/NT=1.
*       5     ATTACH CARD    ATTACH,MSTRDIR=MDPFN/UN=USERNUM,...M=R.
*       6     DBREC CARD     DBREC,CD.
*       7     EOR            *EOR 
*       8     DIRECTIVE      SCHEMA NAME IS NAME
*       9     DIRECTIVE      DUMP JOURNAL LOG NAME IS PFN . 
*      10     EOF            *EOF 
* 
*     CASE 2:  CCLPROC CLAUSE IS SPECIFIED
* 
*     LINE    TYPE           CONTENT
*     ----    ----           -------
* 
*       1     JOB CARD       DBREC,T37777.
*       2     USER CARD      USER,USERNUM,PASSWORD,FAMILY.
*       3     CHARGE CARD    CHARGE,ACCOUNTING-DATA.
*       4     ATTACH CARD    ATTACH,CCLPROCPFN/UN=USERNUM,....
*         OR  GET CARD       GET,CCLPROCPFN/UN=USERNUM,...
*       5     CCLPROC CARD   CCLPROCPFN.      (EXECUTE CARD)
*       6     EOR            *EOR 
*       7     DIRECTIVE      SCHEMA NAME IS NAME
*       8     DIRECTIVE      DUMP JOURNAL LOG NAME IS PFN . 
*       9     EOF            *EOF 
* 
*     PROCEDURE *INSERT* IS CALLED TO INSERT INDIVIDUAL ENTRIES IN
*     EACH CONTROL STATEMENT FROM THE FOLLOWING SOURCES:  
* 
*       1.  SAL (SCHEMA NAME) 
*       2.  JFQUEUE (JOURNAL LOG PFN) 
*       3.  MD ATTACH INFO IN CDCSCOMMN 
*       4.  OFT (AREA ID/VERSION) 
* 
 #
      CONTROL EJECT;
  
  
#     LOCAL DEFS                                                       #
  
*CALL DBRDFDCLS 
  
#     LOCAL VARIABLES                                                  #
  
      ITEM AREAMSG C(40) = "FFFF AREA XXXX VERSION YYYYYYY .";
      ITEM CTX     I;              # INDEX OF CONTROL STATEMENT BUFFER #
      ITEM DT      C(3);           # STORE DEVICE TYPE AND UNIT NUMBER #
      ITEM INDEX   I;              # SCRATCH - FOR LOOPS, ETC          #
      ITEM TOINDEX I;              # CURRENT CHAR POSITION IN LINE     #
  
      BASED ARRAY CTLSTMT S(DFCTLSIZE);  # BUFFER FOR CTL STATEMENTS   #
        BEGIN 
        ITEM CTLINE  C(00,00,80);  # LINE BUFFER                       #
        END 
  
      BASED ARRAY MDJOB;           # FOR ACCESSING MD JOB CONTROL INFO #
        BEGIN 
*CALL MDJOBDCLS 
        END 
  
#     THE FOLLOWING ARRAY CONTAINS THE VALUES FOR THE TAPE DENSITY     #
#     PARAMETER FOR THE RESOURC CONTROL STATEMENT.  THE INDEX FOR      #
#     ACCESSING THE TABLE IS THE VALUE OF MDJOBTDEN.                   #
  
      DEF DFTAPDENLG #4#;          # LENGTH OF TAPE DENSITY PARAMETERS #
  
      ARRAY TAPEDEN [1:6] S(1); 
        BEGIN 
        ITEM TAPDEN C(00,00,04) = ["HD=1",
                                   "PE=1",
                                   "GE=1",
                                   "LO=1",
                                   "HI=1",
                                   "HY=1"]; 
        END 
      CONTROL EJECT;
      PROC INSERT(INTXT,MAXTXTLG,TERMCH); 
      BEGIN 
 #
* *   DB$BRJB                                    PAGE  1
* *   INSERT - INSERT TEXT IN CONTROL CARD IMAGE
* *   W P CEAGLIO                                DATE 05/21/81
* 
* DC  PURPOSE 
* 
*     TO INSERT THE SPECIFIED TEXT INTO A BUFFER CONTAINING A CONTROL 
*     CARD IMAGE STARTING AT THE CURRENT CHARACTER POSITION.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM INTXT   C(30);          # TEXT TO BE INSERTED               #
      ITEM MAXTXTLG  I;            # MAX LENGTH (CHARS) OF INSERT TEXT #
      ITEM TERMCH  C(01);          # CHARACTER TO APPEND AFTER TEXT    #
# 
* D   ASSUMPTIONS 
* 
*     *TOINDEX* CONTAINS THE STARTING CHARACTER POSITION FOR THE
*     INSERTION.  *CTX* CONTAINS INDEX OF ARRAY *CTLSTMT* WHERE THE 
*     CONTROL CARD IMAGE IS BEING BUILT.
* 
* DC  EXIT CONDITIONS 
* 
*     THE TEXT IS INSERTED IN THE CONTROL CARD IMAGE AND *TOINDEX* IS 
*     UPDATED TO POINT TO THE END OF THE TEXT, PLUS ONE.
* 
* DC  CALLING ROUTINES
* 
*     DB$BRJB      MAIN ROUTINE 
* 
* DC  CALLED ROUTINES 
* 
*     NONE. 
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     ARRAY CTLSTMT     BUFFER CONTAINING CONTROL CARD IMAGES 
*     TOINDEX           CHARACTER POSITION POINTER
* 
* DC  DESCRIPTION 
* 
*     DETERMINE THE LENGTH OF THE INSERTION TEXT BY SCANNING FOR A
*     BINARY ZERO OR BLANK.  IF THE LENGTH IS GREATER THAN ZERO, INSERT 
*     THE TEXT IN THE CURRENT CONTROL STATEMENT AT THE POSITION GIVEN 
*     BY *TOINDEX* AND UPDATE *TOINDEX* ACCORDINGLY.  THEN APPEND THE 
*     TERMINATOR CHARACTER AND UPDATE *TOINDEX*.  OTHERWISE, IF THE 
*     TERMINATOR CHARACTER IS A PERIOD, APPEND TO CURRENT LINE. 
* 
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM IDX     I;              # FOR LOOPS                         #
      ITEM CHAR    C(01);          # SINGLE CHARACTER BUFFER           #
      ITEM INSERTLG  I;            # LENGTH (CHARS) OF INSERTION TEXT  #
      ITEM ZBCHAR  B;              # TRUE IF COLON OR BLANK FOUND      #
  
  
#     S T A R T   O F   I N S E R T   E X E C U T A B L E   C O D E    #
  
#     DETERMINE LENGTH OF INSERTION TEXT BY SCANNING FOR COLON OR      #
#     BLANK TERMINATOR.                                                #
  
      INSERTLG = 0; 
      ZBCHAR = FALSE; 
      FOR IDX=0 STEP 1
        WHILE NOT ZBCHAR
      DO
        BEGIN 
        CHAR = C<IDX,1>INTXT; 
        IF B<0,6>CHAR EQ 0
          OR CHAR EQ " "
          OR IDX EQ MAXTXTLG
        THEN
          BEGIN 
          ZBCHAR = TRUE;
          INSERTLG = IDX; 
          END 
        END 
  
#     IF INSERTION TEXT LENGTH GREATER THAN ZERO, INSERT THE TEXT IN   #
#     THE CURRENT POSITION OF THE CURRENT CONTROL STATEMENT AND THEN   #
#     APPEND THE TERMINATOR CHARACTER.  OTHERWISE, IF THE TERMINATOR   #
#     CHARACTER IS A PERIOD, THEN APPEND IT TO THE CURRENT LINE.       #
  
      IF INSERTLG GR 0
      THEN
        BEGIN 
        C<TOINDEX,INSERTLG>CTLINE[CTX] = C<0,INSERTLG>INTXT;
        TOINDEX = TOINDEX + INSERTLG; 
        C<TOINDEX,1>CTLINE[CTX] = TERMCH; 
        TOINDEX = TOINDEX + 1;
        END 
      ELSE
        BEGIN 
        IF TERMCH EQ "."
        THEN
          BEGIN 
          C<TOINDEX,1>CTLINE[CTX] = ".";
          TOINDEX = TOINDEX + 1;
          END 
        END 
  
      RETURN; 
  
      END 
      CONTROL EJECT;
  
  
#     S T A R T   O F   D B $ B R J B   E X E C U T A B L E  C O D E   #
  
  
#**********************************************************************#
#                                                                      #
#     PREPARE ALL CONTROL STATEMENTS FOR THE DBREC JOB IN THE ALLOCATED#
#     BUFFER.  THE ORDER OF THE CONTROL STATEMENTS IS AS FOLLOWS:      #
#                                                                      #
#     CASE 1:  TAPE CLAUSE IS SPECIFIED                                #
#                                                                      #
#       *  JOB CARD                                                    #
#       *  USER CARD                                                   #
#       *  CHARGE CARD                                                 #
#       *  RESOURCE CARD                                               #
#       *  ATTACH CARD FOR MD                                          #
#       *  DBREC CARD                                                  #
#       *  *EOR CARD                                                   #
#       *  DIRECTIVE CARD FOR SCHEMA NAME                              #
#       *  DIRECTIVE CARD FOR JOURNAL LOG NAME                         #
#       *  *EOF CARD                                                   #
#                                                                      #
#     CASE 2:  CCLPROC CLAUSE IS SPECIFIED                             #
#                                                                      #
#       *  JOB CARD                                                    #
#       *  USER CARD                                                   #
#       *  CHARGE CARD                                                 #
#       *  ATTACH CARD OR GET CARD FOR CCLPROC                         #
#       *  CCLPROC CARD    (EXECUTE CARD)                              #
#       *  *EOR CARD                                                   #
#       *  DIRECTIVE CARD FOR SCHEMA NAME                              #
#       *  DIRECTIVE CARD FOR JOURNAL LOG NAME                         #
#       *  *EOF CARD                                                   #
#**********************************************************************#
  
      P<MDJOB> = MDJOBP;           # SET POINTER TO JOB CONTROL INFO   #
      P<CTLSTMT> = CSTMTP;         # SET POINTER TO CTL STMT BUFFER    #
      CTLINE[0] = DFCTLJBNOS;      # JOB STATEMENT                     #
  
      CTX = 1;
      CTLINE[1] = DFCTLUSER ;      # USER STATEMENT                    #
      TOINDEX = DFCTLUSLG;
      IF B<0,6>MDJOBPW[0] NQ 0     # USER-NUMBER,PASSWORD,FAMILY       #
      THEN
        BEGIN 
        INSERT(MDJOBUN[0],DFMAXUNLG,","); 
        IF B<0,6>MDJOBFAM[0] NQ 0 
        THEN
          BEGIN 
          INSERT(MDJOBPW[0],DFMAXPWLG,","); 
          INSERT(MDJOBFAM[0],DFMAXFMLG,".");
          END 
        ELSE
          BEGIN 
          INSERT(MDJOBPW[0],DFMAXPWLG,"."); 
          END 
        END 
      ELSE
        BEGIN 
        INSERT(MDJOBUN[0],DFMAXUNLG,"."); 
        END 
  
      IF MDJOBCHGLEN[0] NQ 0       # CHARGE STATEMENT IF ACCTG DATA    #
      THEN
        BEGIN 
        CTX = 2;
        CTLINE[CTX] = DFCTLCHG; 
        TOINDEX = DFCTLCHLG;
        INSERT(MDJOBCHARGE[0],DFMAXACLGNOS,".");
        END 
  
      CTX = CTX + 1;
      IF NOT MDJOBCCLFLAG[0]
      THEN
        BEGIN                      # CREATE RESOURC STATEMENT WITH     #
                                   # TAPE TYPE OR DENSITY PARAMETER    #
        IF MDJOBTDEN[0] EQ 0
        THEN                       # USE MT OR NT IF DEFAULT (ZERO)    #
          BEGIN                    # DENSITY                           #
          IF MDJOBTTYP[0] 
          THEN
            BEGIN 
            CTLINE[CTX] = DFCTLRES; 
            END 
          ELSE
            BEGIN 
            CTLINE[CTX] = DFCTLRESNT; 
            END 
          END 
        ELSE                       # OTHERWISE, PUT DENSITY PARAMETER  #
          BEGIN                    # IN STATEMENT.                     #
          CTLINE[CTX] = DFCTLRESDN; 
          TOINDEX = DFCTLRDLG;
          INSERT(TAPDEN[MDJOBTDEN[0]],DFTAPDENLG,".");
          END 
  
        CTX = CTX + 1;
        CTLINE[CTX] = DFCTLATNOS ; # ATTACH STATEMENT FOR MD           #
        TOINDEX = DFCTLATNLG; 
        INSERT(MDPFINAME[0],DFMAXPFLG,"/");# ATTACH PFN                #
        END 
  
      IF MDJOBCCLFLAG[0]                   # CREATE ATTACH/GET CARD FOR#
      THEN                                 # CCLPROC                   #
        BEGIN 
        IF MDJOBACCESS[0] EQ 0
        THEN
          BEGIN 
          CTLINE[CTX] = DFCTLGETCCL;       # GET STATEMENT FOR CCLPROC #
          TOINDEX = DFCTLGETLG; 
          END 
        ELSE
          BEGIN 
          CTLINE[CTX] = DFCTLATTCCL;       # ATTACH STMT FOR CCLPROC   #
          TOINDEX = DFCTLATTLG; 
          END 
        INSERT(MDJOBCCLNAME[0],DFMAXPFLG,"/");
        END 
      IF B<0,6>MDPFUNID[0] NQ 0    # ATTACH UN IF PRESENT              #
      THEN
        BEGIN 
        C<TOINDEX,DFCTLUNL>CTLINE[CTX] = DFCTLUN; 
        TOINDEX = TOINDEX + DFCTLUNL; 
        INSERT(MDPFUNID[0],DFMAXUNLG,",");
        END 
      IF B<0,6>MDPFPW1[0] NQ 0     # ATTACH PASSWORD IF PRESENT        #
      THEN
        BEGIN 
        C<TOINDEX,DFCTLPWL>CTLINE[CTX] = DFCTLPW; 
        TOINDEX = TOINDEX + DFCTLPWL; 
        INSERT(MDPFPW1[0],DFMAXPWLG,","); 
        END 
      IF MDPFSNPN[0] NQ 0          # ATTACH PACK NAME IF PRESENT       #
      THEN
        BEGIN 
        C<TOINDEX,DFCTLPN>CTLINE[CTX] = DFCTLPN;
        TOINDEX = TOINDEX + DFCTLPNL; 
        INSERT(MDPFSN[0],DFMAXPNLG,",");
        END 
  
      IF B<0,6>MDPFDT[0] NQ 0      # ATTACH DEVICE TYPE IF PRESENT     #
      THEN
        BEGIN 
        C<TOINDEX,DFCTLDTL>CTLINE[CTX] = DFCTLDT; 
        TOINDEX = TOINDEX + DFCTLDTL; 
        DT = MDPFDT[0]; 
        IF MDPFUNIT[0] NQ 0        # APPEND UNIT NUMBER IF PRESENT     #
        THEN
          BEGIN 
          B<12,6>DT = MDPFUNIT[0] + O"33";
          END 
        INSERT(DT,DFMAXDTLG,","); 
        END 
  
      IF (MDJOBCCLFLAG[0]  AND
         MDJOBACCESS[0] EQ 0)      # CCLPROC IS AN INDIRECT PERM FILE  #
      THEN
        BEGIN 
        TOINDEX = TOINDEX - 1;
        C<TOINDEX,1>CTLINE[CTX] = "."; # CANNOT HAVE M=R PARAM FOR GET #
        END 
      ELSE
        BEGIN 
        C<TOINDEX,DFCTLMERL>CTLINE[CTX] = DFCTLMER; 
                                       # ATTACH M=R PARAM              #
        END 
      CTX = CTX + 1;
      IF MDJOBCCLFLAG[0]
      THEN
        BEGIN 
        TOINDEX = 0;
        CTLINE[CTX] = " ";
        INSERT(MDJOBCCLNAME[0],DFMAXPFLG,"."); # CCLPROC EXECUTION STMT#
        C<TOINDEX,DFCTLJOBTL>CTLINE[CTX] = DFCTLJOBT; 
        END 
      ELSE
        BEGIN 
        CTLINE[CTX] = DFCTLDBR;    # DBREC EXECUTION STATEMENT         #
        END 
  
      CTX = CTX + 1;
  
      CTLINE[CTX] = DFCTLEOR;      # *EOR STATEMENT                    #
      CTX = CTX + 1;
  
      CTLINE[CTX] = DFCTLDBS;      # SCHEMA NAME DIRECTIVE             #
      TOINDEX = DFCTLDSL; 
      INSERT(SASCNAME[SALX],DFMAXSCLG," "); 
      CTX = CTX + 1;
  
      IF FILETYP EQ DFDBRJLOG      # DUMP/LOAD DIRECTIVE               #
      THEN
        BEGIN 
        CTLINE[CTX] = DFCTLDDD; 
        TOINDEX = DFCTLDDL; 
        INSERT(JLFRPFN[0],DFMAXJLLG,"."); 
        END 
      ELSE
        BEGIN 
        C<10,4>AREAMSG = DB$CDEC(OFARID[0],4);
        C<23,7>AREAMSG = OFVENAME[0]; 
        IF SPOTOPT EQ DFDBRDUMP 
        THEN
          BEGIN 
          C<0,4>AREAMSG = "DUMP"; 
          END 
        ELSE
          BEGIN 
          C<0,4>AREAMSG = "LOAD"; 
          END 
        CTLINE[CTX] = AREAMSG;
        END 
  
      CTX = CTX + 1;
  
      CTLINE[CTX] = DFCTLEOF;      # *EOF STATEMENT                    #
  
      END 
      TERM; 
