*DECK DB$RINP 
USETEXT CDCSCTX 
      PROC DB$RINP; 
      BEGIN 
 #
* *   DB$RINP - RECOVERY/RESTORE INPUT PROCESSOR PAGE  1
* *   J E ESLER                                  DATE  06/11/76 
* 
* DC  PURPOSE 
* 
*     CRACK CONTROL CARD. 
*     INITIALIZE RUN PARAMETERS.
* 
* DC  ENTRY CONDITIONS
* 
* DC  EXIT CONDITIONS 
* 
*     RUN PARAMETERS HAVE BEEN INITIALIZED. DIAGNOSTICS HAVE BEEN ISSUED
*     FOR ANY DETECTED ERRORS.
* 
* DC  CALLING ROUTINES
* 
*     DB$RVRS - RECOVERY/RESTORE CONTROL ROUTINE
* 
* DC  CALLED ROUTINES 
* 
# 
      XREF PROC DB$ABRT;           #ABORT RUN#
      XREF FUNC DB$CDIS C(10);     #CONVERT TO DISPLAY CODE#
      XREF FUNC DB$CFIL C(30);     #BLANK FILL AN ITEM# 
      XREF PROC DB$MSG;            #ISSUE DAYFILE MESSAGE#
      XREF FUNC DB$STAT;           #CHECK STATUS OF LOG FILES#
# 
* DC  NON-LOCAL VARIABLES 
# 
      XREF ARRAY DB$RA0;     #ARRAY BASED AT RA+0#
        BEGIN 
        ITEM CCPARAM U(0,0,42);   #CONTROL CARD PARAMETER#
        ITEM CCSEP   U(0,54,6);   #CONTROL CARD SEPARATER#
        ITEM NUMCCPR U(0,42,18);  #NUMBER OF CONTROL CARD PARAMETERS# 
        END 
*CALL FITMDDCLS 
  
      XREF ITEM DB$MIN;      #INPUT FILE LFN# 
      XREF ITEM DB$MOUT;     #OUTPUT FILE LFN#
# 
*     RECOVERY/RESTORE COMMON, CDCS COMMON
 #
      CONTROL NOLIST; 
*CALL RVRSCOMMN 
      CONTROL LIST; 
# 
*     MISCELLANEOUS DEF"S 
# 
      DEF DFDISK   #O"04112313000000000000"#; #DISK, ZERO FILLED# 
      DEF DFEQUAL #2#;       #CODE FOR = ON CONTROL CARD# 
      DEF DFLIST   #O"14112324000000000000"#; #LIST, ZERO FILLED# 
      DEF DFMSTRDIR #O"15232422041122000000"#;#MSTRDIR, ZERO FILLED#
      DEF DFOLDLOG #O"17140414170700000000"#; #OLDLOG, ZERO FILLED# 
      DEF DFSLASH #3#;       #CODE FOR / ON CONTROL CARD# 
      DEF DFTAPE   #O"24012005000000000000"#; #TAPE, ZERO FILLED# 
      DEF DFZERO #O"33000000000000000000"#;    #ZERO, ZERO FILLED#
      DEF DFZSEL #O"32323232230514000000"#;  #ZZZZSEL#
# 
*     LOCAL VARIABLES 
# 
      ITEM INDEX;            #LOOP INDEX# 
      ITEM INDEX1;           #LOOP INDEX# 
      ITEM LFN C(7);               #FILE NAME#
      ITEM MISSINGFILE B = FALSE;  #FLAG FOR REQUIRED FILE NOT PRESENT# 
      ITEM PARAM;            #CONTROL CARD PARAMETER# 
      ITEM PARAMCNT;         #NUMBER OF CONTROL CARD PARAMETERS#
  
# PARAMETER VALUES DEFINED BELOW MUST CORRESPOND TO SWITCH VALUES IN   #
# SWITCH CCPARMSW, SINCE A COMMON INDEX IS USED TO REFERENCE THEM.     #
  
      DEF DFLEGPMCNT #7#;    #NUMBER OF LEGAL CONTROL CARD PARAMETERS-1#
      ARRAY CCPARMTBL[DFLEGPMCNT];
        BEGIN 
        ITEM LEGPARAM U(0,0,60); #THE VALUE PARAMETER#
        ITEM P1HALF U(0,0,18) = [O"110000",  #I#
                                 O"140000",  #L#
                                 O"150400",  #MD# 
                                 O"171400",  #OL# 
                                 O"161400",  #NL# 
                                 O"231500",  #SM# 
                                 O"230600",  #SF# 
                                 O"220326"]; #RCV#
        ITEM P2HALF U(0,18,42) =[0,0,0,0,0,0,0,0];
        END 
      SWITCH CCPARMSW INPUTLFN,   #SAVE INPUT LFN#
                      LISTLFN,    #SAVE OUTPUT LFN# 
                      MDLFN,      #SAVE MASTER DIRECTORY LFN# 
                      OLDLOGLFN,  #SAVE INPUT LOG FILE LFN# 
                      NEWLOGLFN,  #SAVE OUTPUT LOG FILE LFN#
                      SMMEDIA,    #SORT/MERGE SCRATCH FILE MEDIA# 
                      SFLFN,      #SAVE SELECT FILE LFN#
                      RCVFLAG;    #SAVE RECOVERY/RESTORE RESTART FLAG#
 #
  
* DC  INTERNAL PROCEDURES 
  
 #
      CONTROL EJECT;
      PROC BADPARM((NAME)); 
 #
*     BADPARM - PRINT BAD PARAMETER MESSAGE AND DISPLAY IT ON THE 
*     DAYFILE.  ABORT THE PROGRAM.
 #
      BEGIN 
      ITEM BADPARMMSG C(30) = "    BAD PARAMETER = "; 
      ITEM NAME C(10);             #PARAMETER VALUE IN ERROR# 
  
      C<20,10>BADPARMMSG = NAME;
      DB$MSG(BADPARMMSG); 
      DB$ABRT;
      END 
      CONTROL EJECT;
      PROC CHECKLFN((FILENAME));
 #
*     CHECKLFN - VERIFY THAT A SPECIFIED LFN IS AT THE CONTROL POINT. 
*     SET ERROR FLAG MISSINGFILE IF IT IS NOT.
 #
      BEGIN 
      ITEM FILENAME;               #LFN TO BE CHECKED#
      ITEM LOSTLFNMSG C(40) = "     FILE XXXXXXX NOT AT CONTROL POINT:";
      IF DB$STAT(FILENAME) EQ 0 THEN   #FILE NOT PRESENT# 
        BEGIN 
        C<10,7>LOSTLFNMSG = DB$CFIL(FILENAME,7," ");
        DB$MSG(LOSTLFNMSG); 
        MISSINGFILE = TRUE; 
        END 
      RETURN; 
      END 
      CONTROL EJECT;
      PROC STORLFN(FILENAME); 
 #
*     STORLFN - VERIFY THAT THE NEXT CONTROL CARD PARAMETER IS A VALID
*               FILE NAME. STORE THE NAME IN THE LOCATION SPECIFIED.
  
* DC  DESCRIPTION 
  
 #
      BEGIN 
      ITEM FILENAME;         #LOCATION TO SAVE LFN# 
  
      IF CCSEP[INDEX] NQ DFEQUAL THEN 
        BADPARM(PARAM);                #EQUAL SIGN REQUIRED SEPARATOR#
      INDEX = INDEX + 1;               #BUMP INDEX TO FILE NAME#
      FILENAME = CCPARAM[INDEX] * 2**18;  #LFN, ZERO FILLED#
      IF C<0,1>FILENAME GR O"32" OR C<0,1>FILENAME EQ O"00" THEN
        BADPARM(FILENAME);             #ILL-FORMED LFN# 
      RETURN; 
      END 
      CONTROL EJECT;
 #
*     INITIALIZE WITH DEFAULT CONTROL CARD PARAMETERS.
 #
      DB$MIN = DFINPUT; 
      DB$MOUT = DFOUTPUT; 
      SELLFN = DFZSEL;
      OLDLOG = DFOLDLOG;
      NEWLOG1 = 0;
      NEWLOG2 = 0;
      SORTREQD = TRUE;
      SORTDISK = TRUE;
      SELECTION = TRUE; 
      SUPOUTPUT = FALSE;
      SAVESORT = FALSE; 
 #
*     INTERPRET ALL PARAMETERS ON THE CONTROL CARD. VERIFY THAT ALL 
*     PARAMETERS ARE LEGAL AND APPEAR ONLY ONCE.
 #
      PARAMCNT = NUMCCPR[52] + 1; 
      FOR INDEX = 2 STEP 1 UNTIL PARAMCNT DO
        BEGIN 
        PARAM = CCPARAM[INDEX] * 2**18; #GET PARAMETER AND ZERO FILL# 
        FOR INDEX1 = 0 STEP 1 UNTIL DFLEGPMCNT DO 
          BEGIN 
          IF PARAM EQ LEGPARAM[INDEX1] THEN 
            BEGIN 
            LEGPARAM[INDEX1] = 0; #CLEAR PARAMETER-LEGAL ONLY ONCE# 
            GOTO CCPARMSW[INDEX1];#SWITCH ON PARAMETER VALUE# 
  
            END 
          END 
        BADPARM(PARAM);            #PARAMETER IS ILLEGAL# 
 #
*     THE FOLLOWING LABELED CODE IS JUMPED TO AS PARAMETERS ARE 
*     RECOGNIZED. PARAMETERS ARE VERIFIED AND STORED. 
 #
INPUTLFN: 
        STORLFN(DB$MIN);               #GET LFN AND SAVE IT#
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
LISTLFN:  
        IF CCSEP[INDEX] EQ DFEQUAL THEN 
          BEGIN 
          PARAM = CCPARAM[INDEX+1] * 2**18; 
          IF PARAM EQ DFZERO THEN 
            BEGIN 
            INDEX = INDEX + 1;
            SUPOUTPUT = TRUE;          #L=0#
            END 
          ELSE
            STORLFN(DB$MOUT);          #GET LFN AND SAVE IT#
          END 
        ELSE
          DB$MOUT = DFLIST;            #L, (SECOND DEFAULT)#
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
MDLFN:  
        STORLFN(LFN);              #GET FILE NAME#
        FTMDLFN[0] = LFN;          #SAVE MD LFN#
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
OLDLOGLFN:  
        STORLFN(OLDLOG);               #GET LFN AND SAVE IT#
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
NEWLOGLFN:  
        STORLFN(NEWLOG1);              #GET FIRST LFN AND SAVE IT#
        CHECKLFN(NEWLOG1);
        IF CCSEP[INDEX] EQ DFSLASH THEN #DOUBLE LOGGING SPECIFIED#
          BEGIN 
          CCSEP[INDEX] = DFEQUAL;      #MAKE STORCHAR HAPPY#
          STORLFN(NEWLOG2);           #GET SECOND LFN AND SAVE IT#
          CHECKLFN(NEWLOG2);
          END 
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
SMMEDIA:  
        IF CCSEP[INDEX] EQ DFEQUAL THEN 
          BEGIN 
          INDEX = INDEX + 1;
          PARAM = CCPARAM[INDEX] * 2**18; 
          IF PARAM EQ DFDISK THEN 
            TEST INDEX;                #DISK IS DEFAULT#
  
          IF PARAM EQ DFTAPE THEN 
            SORTDISK = FALSE;          #SORT MEDIA IS TAPE# 
          ELSE
            BADPARM(PARAM);            #BAD PARAMETER#
          END 
        ELSE
          SORTDISK = FALSE;            #TAPE IS SECOND DEFAULT# 
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
SFLFN:  
        STORLFN(SELLFN);               #GET LFN AND SAVE IT#
        CHECKLFN(SELLFN); 
        SAVESORT = TRUE;               #SAVE SORTED SELECT FILE#
        TEST INDEX;                    #CHECK NEXT PARAMETER# 
  
RCVFLAG:  
        SELECTION = FALSE;             #SUPPRESS SELECTION AND SORT#
        SORTREQD = FALSE; 
        END  #INDEX#
  
      CHECKLFN(FTMDLFN);               #VERIFY MD PRESENT#
      IF SELECTION THEN 
        CHECKLFN(OLDLOG);              #VERIFY OLDLOG PRESENT IF NEEDED#
  
      IF MISSINGFILE THEN              #REQ"D FILE MISSING-ABORT# 
        BEGIN 
        DB$MSG("  REQUIRED FILE(S) MISSING, PROGRAM ABORTED:"); 
        DB$ABRT;
        END 
  
      END 
      TERM
