*DECK DB$CRIN 
USETEXT RVRSCTX 
      PROC DB$CRIN; 
      BEGIN 
 #
* *   DB$CRIN - BUILD CRITERIA TABLE             PAGE  1
* *   J E ESLER                                  DATE  06/11/76 
* *   A W ALLEN - DATABASE VERSIONS              DATE  09/19/80 
* 
* DC  PURPOSE 
* 
*     EXTRACT SELECTION CRITERIA FROM THE INPUT FILE AND BUILD THE
*     CRITERIA TABLE. 
* 
* DC  ENTRY CONDITIONS
* 
*     INPUT AND OUTPUT FILES ARE OPEN.
*     MASTER DIRECTORY IS OPEN. 
*     CMM IS ALLOCATED FOR AN SAL ENTRY AT "DUMMYSAL" IN DB$RCOM. 
* 
* DC  EXIT CONDITIONS 
* 
*     CRITERIA TABLE IN DB$RCOM IS COMPLETE.
*     SCHEMA ACCESS LIST ENTRY FOR REQUESTED SCHEMA IS IN DB$RCOM.
*     ALL ERRORS IN INPUT ARE FATAL.
* 
* DC  CALLING ROUTINES
* 
*     DB$RCVR - RECOVERY/RESTORE MAIN PROGRAM 
* 
* 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 OR ZERO FILL A VARIABLE#
      XREF PROC DB$DIAG;           #ISSUE SYNTAX DIAGNOSTIC#
      XREF FUNC DB$LNK;            #RESERVE AND LINK A MM BLOCK#
      XREF PROC DB$MDER;           #MD ERROR PROCESSOR# 
      XREF PROC DB$MFA;            #RESERVE FIXED POSITION MM#
      XREF PROC DB$MFF;            #RELEASE FIXED POSITION MM#
      XREF PROC DB$MINI;           #SYNTAX ANALYZER INITIALIZATION# 
      XREF PROC DB$MSG;            #ISSUE DAYFILE MESSAGE#
      XREF PROC DB$NO;             #SYNTAX ANALYZER ENTRY POINT#
      XREF PROC DB$STD;            #SYNTAX ANALYZER#
      XREF PROC DB$UCHD;           #SET OUTPUT FILE HEADER LINE#
      XREF PROC DB$UCLF;           #CLOSE INPUT AND OUTPUT FILES# 
      XREF PROC DB$UPRT;           #PRINT A LINE# 
      XREF PROC DB$VERL;           #VERSION NAME LOOK-UP               #
      XREF PROC DB$WGET;           #READ WA FILE# 
      XREF PROC DB$YES;            #SYNTAX ANALYZER ENTRY POINT#
# 
* DC  NON-LOCAL VARIABLES 
* 
# 
      XREF ITEM DB$LNLF;           #LINES LEFT ON PAGE# 
      XREF BEGIN
*CALL SCANXDCLS 
      END 
  
*CALL FITMDDCLS 
# 
*     DBMSTRD COMMON,RECOVERY/RESTORE COMMON
  
*     NOTE - DBMSTRD COMMON IS USED TO COMMUNICATE WITH THE SYNTAX
*     ANALYZER, DB$STD, AND ITS DIAGNOSTIC ROUTINE, DB$DIAG.
 #
      CONTROL NOLIST;              # MDBCMDCLS                         #
*CALL MDBCMDCLS 
      CONTROL LIST; 
# 
*     LOCAL VARIABLES 
# 
      DEF DFBEGINLXID #3#;         #LEXICAL ID FOR BEGIN# 
      DEF DFENDLXID #4#;           #LEXICAL ID FOR END# 
      ITEM ABTMSG C(40) = "      INPUT ERROR(S) - PROGRAM ABORTED:";
      ITEM INDEX;                  #LOOP INDEX# 
      ITEM LASTAREA C(4) = " ";    #LAST AREA REQUESTED#
      ITEM MDARDCT;                #NUMBER OF MD AREA DIRECTORY ENTRIES#
      ITEM PAGEHEADER C(60) = "MD=                   SCHEMA=";
      BASED ARRAY STRING;;         #FOR PARAMETER PASSING#
      ITEM SUPSELMSG C(70) = " NOTE - SELECTION PHASE SUPPRESSED. SELECT
 CLAUSE WILL HAVE NO EFFECT.";
      ITEM TOTAREA = 0;            #COUNT OF AREAS REQUESTED(1=1 AREA)# 
      ITEM VERSUB U;               # VERSION SUBSCRIPT                 #
      BASED ARRAY MDSCDIR S(DFMDSCDESIZE); #MD SCHEMA DIRECTORY#
        BEGIN 
*CALL MDSCDDCLS 
                ITEM MDSCW3 (3,0,60);  #WORD 3# 
                ITEM MDSCW4 (4,0,60);  #WORD 4# 
                ITEM MDSCW5 (5,0,60);  #WORD 5# 
        END 
  
      BASED ARRAY TIMEFIELDS (3);  #USED TO SET BEGIN/END TIMES#
        BEGIN 
        ITEM DATE C(0,0,5);        #CRBDATE/CREDATE#
        ITEM HMSC C(1,0,10);       #CRBTIME/CRETIME#
        ITEM HOUR C(1,6,2);        #CRBTIME/CRETIME HOURS#
        ITEM MINS C(1,24,2);       #CRBTIME/CRETIME MINUTES#
        ITEM SECS C(1,42,2);       #CRBTIME/CRETIME SECONDS#
        ITEM RECOVPT C(2,0,10);    #CRBRP/CRERP#
        END 
 #
  
* DC  DESCRIPTION 
  
 #
      CONTROL EJECT;
      P<CRITERIA> = LOC(FIRSTCRIT); 
      FIRSTCRIT = 0;
      ERRCNT = 0;                  #INITIALIZE ERROR COUNT# 
      C<3,7>PAGEHEADER = DB$CFIL(FTMDLFN,7," ");
      IF SAVESORT THEN
        BEGIN 
        C<11,3>PAGEHEADER = "SF=";
        C<14,7>PAGEHEADER = DB$CFIL(SELLFN,7," ");
        END 
      DB$UCHD(PAGEHEADER,60);#SET OUTPUT HEADER LINE# 
      DB$LNLF = 0;           #SET LINE COUNT = 0 TO FORCE NEW PAGE# 
 #
*     CALL THE SEMANTIC ANALYSIS ROUTINE TO READ AND INTERPRET THE
*     INPUT FILE PARAMETERS.
 #
      DB$TFLG = 0;                 #ENABLE TRACE# 
      DB$MINI;                     #INITIALIZE THE SYNTAX ANALYZER# 
      DB$STD(DB$SYSW);                 #START SYNTAX ANALYZER#
ENDINPUT: 
      RETURN;                      #DB$CRIN IS FINISHED - EXIT# 
  
  
 #
*     THE FOLLOWING BLOCKS OF CODE ARE THE SEMANTIC PROCEDURES FOR
*     INTERPRETING AND VALIDATING THE RECOVERY PARAMETERS.
  
* DC  SEMANTIC ROUTINES 
  
* 
*     ENDSCAN - END THE SCAN OF DATA CARD PARAMETERS. 
 #
      PROC ENDSCAN; 
      BEGIN 
 #
*     IF ERRORS WERE DETECTED IN THE INPUT, ABORT THE PROGRAM.
 #
      IF ERRCNT NQ 0 THEN 
          ABORT;
  
#     RELEASE THE AREA DIRECTORY                                       #
  
      P<MDARDIR> = P<MDARDIR> - 1;     #GET BACK TO CONTROL WORD# 
      DB$MFF(P<MDARDIR>);              #RELEASE MM# 
 #
*     IF EXACTLY ONE AREA IS SPECIFICALLY REQUESTED ON ALL SELECT 
*     CLAUSES COMBINED, AND WE ARE RUNNING DBRCN, THE SORT PHASE IS 
*     NOT NEEDED. 
  
 #
      IF TOTAREA EQ 1 AND RECOVRUN THEN 
        SORTREQD = FALSE; 
      DB$UPRT("-        END OF SOURCE INPUT.",30);
      DB$UPRT("-",1); 
      GOTO ENDINPUT;               #END OF DB$CRIN EXECUTION# 
      END 
  
  
 #
*     ABORT - A FATAL ERROR HAS BEEN DETECTED...ABORT THE RUN.
  
 #
      PROC ABORT; 
      BEGIN 
      DB$MSG(ABTMSG); 
      DB$UCLF;
      DB$ABRT;
      END 
  
  
 #
*     AREA - VERIFY THAT THE SPECIFIED AREA IS DEFINED FOR THE SCHEMA.
*     SAVE THE AREA ID IN THE CRITERIA TABLE. 
  
 #
      PROC AREA;
      BEGIN 
      IF CRAREA[0] NQ 0 THEN           #ONLY ONE AREA NAME PER SELECT#
        BEGIN 
        DB$DIAG(207,"AREA");
        DB$NO;
        END 
  
      P<STRING> = LOC(CURWORDC[0]); 
      CURWORDC[0] = DB$CFIL(STRING,30," ");  #BLANK FILL AREA NAME# 
      FOR INDEX = MDARDCT-1 STEP -1 UNTIL 0 DO
        BEGIN 
        IF CURWORDC[0] EQ MDADARNM[INDEX] THEN
          GOTO FOUNDAREA; 
  
        END 
      DB$DIAG(211,CURWORDC[0]);        #AREA NAME NOT FOUND            #
      DB$NO;                           #RETURN TO SYNTAX ANALYZER#
  
FOUNDAREA:  
      CRAREA[0] = DB$CDIS(MDADIDNT[INDEX],4,10,"0");#SAVE AREA ID#
      TOTAREA = TOTAREA - 2;           #RESET COUNT FOR SINGLE AREA SEL#
      IF LASTAREA NQ CRAREA[0] THEN 
        BEGIN 
        LASTAREA = CRAREA[0]; 
        TOTAREA = TOTAREA + 1;
        END 
      DB$YES;                          #RETURN TO SYNTAX ANALYZER#
      END 
  
  
 #
*     JOB - VALIDATE AND SAVE A JOBNAME IN THE CRITERIA TABLE.
  
 #
      PROC JOB; 
      BEGIN 
      IF DB$CLNG NQ 7 AND DB$CLNG NQ 4 THEN 
        DB$NO;                         #INVALID JOBNAME#
      IF CRJOB[0] NQ 0 THEN 
        DB$DIAG(207,"JOB");            #DUPLICATE PARAMETER#
      CRJOB[0] = DB$CFIL(CURWORDC[0],7," ");
      DB$YES; 
      END 
  
  
 #
*     RECOVERY - SAVE A BEGIN/END RECOVERY POINT NUMBER.
  
 #
      PROC RECOVERY;
      BEGIN 
      IF DB$CLNG GR 10 THEN 
        DB$NO;                         #INVALID RECOVERY POINT NUMBER#
      RECOVPT[0] = "0000000000";       #GENERATE LEADING ZERO FILL# 
      C<10-DB$CLNG,DB$CLNG>RECOVPT[0] = C<0,DB$CLNG>CURWORDC[0];
      DB$YES; 
      END 
  
  
 #
*     RUNUNIT - SAVE A RUN-UNIT-ID IN THE CRITERIA TABLE. 
  
 #
      PROC RUNUNIT; 
      BEGIN 
      IF DB$CLNG GR 10 THEN 
        DB$NO;                         #INVALID RUN-UNIT# 
      IF CRRUNUNIT[0] NQ 0 THEN 
        DB$DIAG(207,"RUN-UNIT");       #DUPLICATE PARAMETER#
      CRRUNUNIT[0] = DB$CFIL(CURWORDC[0],10," "); 
      DB$YES; 
      END 
  
  
 #
*     SCHEMA - READ SCHEMA INFORMATION FROM MASTER DIRECTORY. 
 #
      PROC SCHEMA;
      BEGIN 
      P<STRING> = LOC(CURWORDC[0]); 
      CURWORDC[0] = DB$CFIL(STRING,30," ");     #BLANK FILL NAME# 
      C<29,30>PAGEHEADER = CURWORDC[0]; 
      DB$UCHD(PAGEHEADER,60);#RESET OUTPUT HEADER LINE# 
 #
*     READ MD SCHEMA CONTROL WORDS. 
 #
      DB$WGET(DB$FTMD,MDCONWD,14,1,DB$MDER);
 #
*     READ MD SCHEMA DIRECTORY ENTRIES INTO CMM ONE AT A TIME UNTIL 
*     THE SELECTED SCHEMA IS FOUND.  IN THE MAIN PROGRAM, DB$RCVR,
*     THE SAL BASED ARRAY POINTS TO THIS SAME ARRAY.
 #
      P<MDSCDIR> = LOC(DUMMYSAL);  # SET SCHEMA DIRECTORY BASED ARRAY  #
      FOR INDEX = 0 STEP 1         # LOOP FOR EACH SCHEMA ENTRY IN THE #
        UNTIL MDSDNO[0] - 1        # MASTER DIRECTORY.                 #
      DO
        BEGIN                      # READ ONE SCHEMA DIRECTORY ENTRY   #
        DB$WGET(DB$FTMD,MDSCDIR,DFMDSCDESIZE
               ,MDSDWA[0] + (INDEX*DFMDSCDESIZE)
               ,DB$MDER); 
        IF CURWORDC[0] EQ MDSCNAME[0] 
        THEN                       # IF THIS IS THE SELECTED SCHEMA... #
          GOTO FOUNDSCHEMA; 
  
        END 
      DB$DIAG(115,CURWORDC[0]);        #ERROR - SCHEMA NOT IN MD# 
        ABORT;
  
FOUNDSCHEMA:  
 #
*     READ THE AREA DIRECTORY FOR THIS SCHEMA.
  
 #
      DB$MFA(MDSCADSZ[0],P<MDARDIR>);  #RESERVE MM FOR AREA DIRECTORY#
      DB$WGET(DB$FTMD,MDARDIR,MDSCADSZ[0],MDSCWAAD[0],DB$MDER); 
      MDARDCT = MDADNBAR[0];           #SAVE AREA ENTRY COUNT#
      P<MDARDIR> = P<MDARDIR> + 1;     #ADJUST POINTER TO FIRST ENTRY#
      DB$YES;                      #RETURN TO SYNTAX ANALYZER#
      END 
  
  
 #
*     SELECT - INITIALIZE FOR A SELECT CLAUSE. RESERVE AND LINK AN
*     ENTRY IN THE CRITERIA CHAIN.
  
 #
      PROC SELECT;
      BEGIN 
      IF NOT SELECTION THEN 
        DB$UPRT(SUPSELMSG,70);
      P<CRITERIA> = DB$LNK(P<CRITERIA>,DFCRITENSZ); 
      CRAREAI[0] = 0; 
      CRJOBI[0] = 0;
      CRRUNUNITI[0] = 0;
      CRBRPI[0] = 0;
      CRERPI[0] = 0;
      CRBDATEI[0] = 0;
      CREDATE[0] = DFBIGDATE; 
      CRBTIME[0] = DFZEROTIME;
      CRETIME[0] = DFBIGTIME; 
      CRVENAMEI[0] = 0; 
      TOTAREA = TOTAREA + 2;           #CONSIDER HIS A MULTI-AREA SELCT#
      DB$YES;                      #RETURN TO DB$STD# 
      END 
  
  
 #
*     TIMEKW - SET A BASED ARRAY TO POINT TO THE BEGIN OR END TIME
*     FIELDS.  NOTE THAT IF THIS IS A DBRST RUN, WE STORE A BEGIN CLAUSE
*     AS THE END POINT, AND VICE VERSA.  THIS IS BECAUSE WE ALWAYS
*     SCAN FORWARD ON THE LOG FILE, AND DBRST LOGICALLY SCANS BACKWARDS.
  
 #
      PROC TIMEKW;
      BEGIN 
      IF (RECOVRUN AND DB$CXID EQ DFBEGINLXID)
        OR (NOT RECOVRUN AND DB$CXID EQ DFENDLXID) THEN 
        BEGIN                          #THIS IS EARLY TIME DEFINITION#
        P<TIMEFIELDS> = LOC(CRBDATE[0]);
        IF CRBRP[0] EQ 0               #IS THIS FIRST START TIME# 
          AND CRBDATE[0] EQ 0 
          AND CRBTIME[0] EQ DFZEROTIME THEN 
            DB$YES;                    #YES - WE ARE OK#
        DB$DIAG(207,"BEGIN");          #DUPLICATE PARAMETER#
        END 
      ELSE                             #THIS IS LATE TIME DEFINITION# 
        BEGIN 
        P<TIMEFIELDS> = LOC(CREDATE[0]);
        IF CRERP[0] EQ 0               #IS THIS FIRST STOP TIME#
          AND CREDATE[0] EQ DFBIGDATE 
          AND CRETIME[0] EQ DFBIGTIME THEN
            DB$YES;                    #YES - WE ARE OK#
        DB$DIAG(207,"END");            #DUPLICATE PARAMETER#
        END 
  
      DB$NO;
      END 
  
  
 #
*     TIME - INTERPRET AND SAVE A BEGIN/END TIME SUBCLAUSE. 
 #
      PROC TIME;
      BEGIN 
      IF DB$CLNG EQ 11 THEN            #DATE-TIME FORMAT# 
        BEGIN 
        DATE[0] = C<0,5>CURWORDC[0];
        HOUR[0] = C<5,2>CURWORDC[0];
        MINS[0] = C<7,2>CURWORDC[0];
        SECS[0] = C<9,2>CURWORDC[0];
        IF HOUR[0] GR "24"
          OR MINS[0] GR "59"
          OR SECS[0] GR "59"
          OR C<2,3>DATE[0] GR "366" 
          THEN
            DB$NO;
        END 
      ELSE                             #BAD TIME FIELD# 
        DB$NO;
  
      IF (CRBDATE[0] GR CREDATE[0]) 
        OR (CRBDATE[0] EQ CREDATE[0] AND CRBTIME[0] GR CRETIME[0])
        THEN
        BEGIN 
        DB$DIAG(209); 
        END 
      DB$YES; 
      END 
  
  
 #
* 
*     VERSION - VERIFY THAT THE SPECIFIED VERSION NAME IS DEFINED FOR 
*     THE SCHEMA (DB$VERL).  SAVE VERSION NAME AND VERSION SUBSCRIPT IN 
*     THE CRITERIA TABLE. 
 #
      PROC VERSION; 
      BEGIN 
      IF CRVENAMEI[0] NQ 0
      THEN
        BEGIN 
        DB$DIAG(207,"VERSION");    # DUPLICATE VERSION CLAUSE          #
        DB$NO;
  
        END 
      P<STRING> = LOC(CURWORDC[0]); 
      IF DB$CLNG GR 7 
      THEN
        BEGIN 
        DB$DIAG(129,CURWORDC[0]);  # NAME TOO LONG.                    #
        DB$NO;
  
        END 
      CRVENAME[0] = C<0,DB$CLNG>CURWORDC[0];
      DB$VERL(CRVENAME[0],VERSUB); # LOOK FOR VERSION NAME IN MASTER   #
                                   # DIRECTORY.                        #
      IF VERSUB EQ 0               # IF VERSION NAME IS INVALID...     #
      THEN
        BEGIN 
        DB$DIAG(210,CURWORDC[0]);  # VERSION NAME NOT FOUND.           #
        DB$NO;                     # RETURN TO SYNTAX ANALYZER         #
  
        END 
      DB$YES;                      # RETURN TO SYNTAX ANALYZER.        #
      END 
  
  
 #
*     THE SEMANTIC ROUTINE JUMP TABLE IS GENERATED HERE.
 #
DB$SYSW:  
*CALL RSMJPDCLS 
      END 
      TERM
