*DECK DB$SORT 
USETEXT CDCSCTX 
      PROC DB$SORT; 
      BEGIN 
 #
* *   DB$SORT - SORT MODULE FOR RECOVERY/RESTORE PAGE  1
* *   J E ESLER                                  DATE  07/15/76 
* *   A W ALLEN - DATABASE VERSIONS              DATE  09/19/80 
* 
* DC  PURPOSE 
* 
*     SORT THE SELECTION FILE ON THE FOLLOWING KEYS 
*         AREA-ID 
*         PRIMARY VERSION NAME
*         YYDDD 
*         HH.MM.SS
*         SEQUENCE NUMBER 
* 
* DC  ENTRY CONDITIONS
* 
*     INPUT LOG LFN = ZZZZPST.
*     RECOVRUN IN DB$RCOM IS SET. 
*     MDCW IN DB$CDCS IS SET. 
*     SELLFN IN DB$RCOM IS SET. 
* 
* DC  EXIT CONDITIONS 
* 
*     INPUT LOG IS CLOSE UNLOADED.
*     SORTED LOG FILE IS CLOSED. LFN = SELLFN IN DB$RCOM. 
* 
* DC  CALLING ROUTINES
* 
*     DB$RVRS - RECOVERY/RESTORE CONTROL ROUTINE
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC CLOSEM;            #CRM CLOSE MODULE# 
      XREF PROC OPENM;             #CRM OPEN MODULE#
      XREF PROC SM5END;            # SORT/MERGE BEGIN PROCESSING       #
      XREF PROC SM5FROM;           # SORT/MERGE DEFINE SOURCE FILE     #
      XREF PROC SM5KEY;            # SORT/MERGE DESCRIBE A KEY         #
      XREF PROC SM5RETA;           # SORT/MERGE RETAIN INPUT SEQUENCE  #
      XREF PROC SM5SEQN;           # SORT/MERGE SEQUENCE NAME          #
      XREF PROC SM5SEQS;           # SORT/MERGE SEQUENCE STEP          #
      XREF PROC SM5SORT;           # SORT/MERGE INITIALIZE PROCEDURES  #
      XREF PROC SM5TO;             # SORT/MERGE DEFINE TARGET FILE     #
# 
* DC  NON-LOCAL VARIABLES 
* 
# 
      XREF ARRAY DB$JFIT;          #MODEL FIT FOR JOURNAL LOG#
        BEGIN 
        ITEM LOGFITWD;
        END 
      XREF ARRAY DB$RA0;;          #ARRAY AT RA+0#
# 
*     RECOVERY/RESTORE COMMON, CDCS COMMON
 #
      CONTROL NOLIST;              # RVRSCOMMN                         #
*CALL RVRSCOMMN 
      CONTROL LIST; 
# 
*     LOCAL VARIABLES 
# 
      ARRAY IFIT [DFFITSIZE] S;    #SORT INPUT FILE FIT#
        BEGIN 
        ITEM IFITWD (0,0,60); 
        ITEM IFITLFN C(0,0,7);     #FILE NAME#
        ITEM IFITMRL U(12,0,24);   # MAX RECORD SIZE                   #
        ITEM IFITHL  U(15,0,24);   # HEADER LENGTH OF A T TYPE RECORD  #
                                   # IN CHARACTERS.                    #
        ITEM IFITCP  U(17,15,24);  # TRAILER COUNT BEGINNING CHARACTER #
                                   # POSITION OF A T TYPE RECORD.      #
        END 
      ARRAY OFIT [DFFITSIZE] S;    #SORT OUTPUT FILE# 
        BEGIN 
        ITEM OFITWD (0,0,60); 
        ITEM OFITLFN C(0,0,7);     #FILE NAME#
        ITEM OFITMRL U(12,0,24);   # MAX RECORD SIZE                   #
        ITEM OFITHL  U(15,0,24);   # HEADER LENGTH OF A T TYPE RECORD  #
                                   # IN CHARACTERS.                    #
        ITEM OFITCP  U(17,15,24);  # TRAILER COUNT BEGINNING CHARACTER #
                                   # POSITION OF A T TYPE RECORD.      #
        END 
      ITEM INDEX;                  #LOOP INDEX# 
      ITEM ORDER C(10);            #ORDER OF SORT#
 #
* DC  DESCRIPTION 
 #
  
  
  
#     B E G I N   D B $ S O R T   E X E C U T A B L E   C O D E .      #
  
  
 #
* 
*     INITIALIZE THE FIT"S FOR THE INPUT AND OUTPUT LOG FILES.
 #
      FOR INDEX = DFFITSIZE-1 STEP -1 UNTIL 0 DO
        BEGIN 
        IFITWD[INDEX] = LOGFITWD[INDEX];
        OFITWD[INDEX] = LOGFITWD[INDEX];
        END 
      IFITLFN[0] = DFPRESORTLFN;
      OFITLFN[0] = C<0,7>SELLFN;
#     SELECT RECORD IS ONE WORD LARGER THAN JOURNAL LOG RECORD.        #
      IFITMRL[0] = SASCMAXLOG[0] + DFSELCHARS;
      IFITHL[0] = IFITHL[0] + DFSELCHARS; 
      IFITCP[0] = IFITCP[0] + DFSELCHARS; 
      OFITMRL[0] = SASCMAXLOG[0] + DFSELCHARS;
      OFITHL[0] = OFITHL[0] + DFSELCHARS; 
      OFITCP[0] = OFITCP[0] + DFSELCHARS; 
      OPENM(IFIT,DFINPUT,DB$RA0); 
      OPENM(OFIT,DFOUTPUT,DB$RA0);
 #
*     INITIALIZE THE SORT.
 #
      SM5SORT(0,DB$RA0);
 #
*     DEFINE INPUT AND OUTPUT FILES.
 #
      SM5FROM(IFIT,DB$RA0); 
      SM5TO  (OFIT,DB$RA0); 
 #
*     CREATE A USER DEFINED COLLATING SEQUENCE FOR THE DECADE DIGIT 
*     OF THE YEAR.
 #
      SM5SEQN("DECADE",DB$RA0); 
      SM5SEQS("7",DB$RA0);
      SM5SEQS("8",DB$RA0);
      SM5SEQS("9",DB$RA0);
      SM5SEQS("0",DB$RA0);
      SM5SEQS("1",DB$RA0);
      SM5SEQS("2",DB$RA0);
      SM5SEQS("3",DB$RA0);
      SM5SEQS("4",DB$RA0);
      SM5SEQS("5",DB$RA0);
      SM5SEQS("6",DB$RA0);
 #
*     DESCRIBE SORT KEYS. 
 #
      IF RECOVRUN THEN
        ORDER = "A";               #ASCENDING ORDER FOR RECOVERY# 
      ELSE
        ORDER = "D";               #DESCENDING ORDER FOR RESTORE# 
  
      SM5KEY(27,4,"DISPLAY",DB$RA0);        # AREA ID                  #
      SM5KEY(01,7,"DISPLAY",DB$RA0);        # PRIMARY VERSION NAME     #
      SM5KEY(61,1,"DECADE",ORDER,DB$RA0);   # Y                        #
      SM5KEY(62,4,"DISPLAY",ORDER,DB$RA0);  #  YDDD                    #
      SM5KEY(72,8,"DISPLAY",ORDER,DB$RA0);  # HH.MM.SS                 #
      SM5KEY(21,2,"DISPLAY",ORDER,DB$RA0);  # SEQUENCE NUMBER          #
  
      SM5RETA("Y");                # RETAIN SEQUENCE AMONG EQUALS      #
 #
*     DO THE SORT.
 #
      SM5END; 
      CLOSEM(OFIT,DFDET,DB$RA0);
      RETURN; 
      END 
      TERM
