*DECK DB$FLRP 
      PROC DB$FLRP; 
      BEGIN 
 #
* *   DB$FLRP - PREPARE FLOW POINT REPORT        PAGE  1
* *   R L MCALLESTER                             DATE  05/21/80 
* 
* DC  PURPOSE 
* 
*     PREPARE TWO FLOW POINT REPORTS TO BE INCLUDED ON THE CDCS OUTPUT
*     FILE.  THESE REPORTS ARE AUTOMATICALLY INCLUDED ON EITHER NORMAL
*     OR ABNORMAL TERMINATION OF CDCS.
* 
* DC  ENTRY CONDITIONS
* 
*     THE FLOW POINT DATA HAS BEEN COLLECTED IN THE ARRAY DB$FLPT.
*     RUN-UNIT ID NAMES ARE IN USER IDENTIFICATION TABLE (DB$FLUT). 
* 
* DC  EXIT CONDITIONS 
* 
*     NONE
* 
* DC  CALLING ROUTINES
* 
*     DB$RCVR                CDCS ABNORMAL TERMINATION PROCESSOR
*     DB$TERM                CDCS NORMAL TERMINATION PROCESSOR
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CBIN I;   # CONVERT DISPLAY TO INTEGER              #
      XREF FUNC DB$CDEB C(10);  # INTEGER TO DECIMAL, LEADING BLANKS   #
      XREF FUNC DB$CDEC C(10);  # INTEGER TO DECIMAL, LEADING ZEROS    #
      XREF PROC DB$LINB;     # BUFFER INTO AN OUTPUT LINE              #
      XREF PROC DB$LINE;     # CONTROL LINE OUTPUT TO PRINT FILE       #
# 
* DC  NON-LOCAL VARIABLES 
* 
*     ARRAY DB$FLPT          FLOW POINT TABLE - SEQUENCES ARE ZEROED. 
* 
* DC  DESCRIPTION 
* 
*     TWO REPORTS ARE PRODUCED. 
* 
*     -- ALPHABETIC FLOW POINT REPORT --
* 
*     THIS REPORT DOES NOT INCLUDE ANY DATA FROM THE USER ID TABLE. 
* 
*     THE FLOW POINT NAMES ARE LISTED IN DISPLAY CODE SEQUENCE. 
*     THE REPORT ALSO INCLUDES THE NUMBER OF TIMES THE FLOW POINT HAS 
*     BEEN EXECUTED (COUNT) AND THE SEQUENCE NUMBERS OF THE LAST FOUR 
*     EXECUTIONS OF THE FLOW POINT. 
*     THE TABLE IS KEPT IN DISPLAY CODE SEQUENCE SO NO SORTING IS 
*     REQUIRED. 
* 
*     -- FLOW POINTS IN SEQUENCE OF EXECUTION --
* 
*     THIS REPORT MERGES TOGETHER DATA FROM THE FLOW POINT TABLE
*     AND THE USER ID TABLE (DB$FLRP AND DB$FLUT).
*     THE SEQUENCE NUMBERS USED IN THE TWO TABLES ARE FROM THE SAME 
*     SERIES SO THEY CAN BE REPORTED IN A SINGLE SEQUENCE OF EXECUTION. 
* 
*     RUN-UNIT ID'S FROM THE USER ID TABLE ARE IDENTIFIED IN THE REPORT 
*     BY AN ASTERISK FOLLOWING THE NAME.
* 
*     EACH FLOW POINT SEQUENCE THAT REMAINS IN THE TABLE IS LISTED IN 
*     NUMERIC ORDER WITH ITS ASSOCIATED FLOW POINT NAME.
*     EACH SEQUENCE NUMBER WORD CONTAINS UP TO FOUR SEQUENCE NUMBERS
*     IN FIFTEEN BIT PARCELS. 
*     THE NEWEST SEQUENCE (LARGEST NUMBER) IS CONTAINED IN THE RIGHT
*     MOST PARCEL.
*     WHEN THERE HAVE BEEN LESS THAN FOUR EXECUTIONS OF THE FLOW POINT
*     THE LEFT MOST PARCEL IS ZERO. 
*     BEFORE STARTING THE REPORT PROCESSING A SPECIAL PASS IS MADE
*     THROUGH THE FLOW POINT TABLE, LEFT SHIFTING THE PARCELS UNTIL 
*     THE OLDEST SEQUENCE IS IN THE LEFT PARCEL.
* 
*     DURING REPORT PROCESSING, THE LEFT PARCELS ARE SCANNED TO FIND
*     THE OLDEST SEQUENCE.
*     IF THAT OLDEST SEQUENCE ISNT AS OLD AS THE NEXT ENTRY FROM THE
*     USER IDENTIFICATION TABLE, THEN THE ENTRY FROM THE USER ID
*     IS PRINTED NEXT.
*     THUS EACH LINE OF THE REPORT CONTAINS THE OLDEST REMAINING
*     SEQUENCE, WHETHER IT IS SELECTED FROM THE FLOW POINT TABLE OR 
*     FROM THE USER IDENTIFICATION TABLE. 
*     IF THE OLDEST SEQUENCE FOUND IS FROM THE FLOW POINT TABLE 
*     THAT SEQUENCE IS THEN REPLACED BY LEFT SHIFTING THE REMAINING 
*     SEQUENCES AND INSERTING A ZERO AT THE RIGHT.
*     THE PROCESS IS FINISHED WHEN THERE ARE NO SEQUENCES REMAINING.
* 
* D   NOTE
* 
*     THE DB$FLUT ENTRIES WERE DESIGNED FOR THE USE OF DB$SCHD TO 
*     IDENTIFY THE RUN-UNITS SCHEDULED.  IT MAY, HOWEVER, BE USED 
*     TO INCLUDE ANY SEVEN CHARACTER NAME OR NUMBER IN THE REPORT.
 #
  
# 
* 
* DC  LOCAL VARIABLES 
* 
# 
      ITEM HEAD1 C(38) = "   ALPHABETIC LIST OF FLOW POINTS ";
      ITEM HEAD1A C(54) = "    NAME      COUNT        LAST FOUR SEQUENCE
 NUMBERS "; 
      ITEM HEAD2 C(40) = "   FLOW POINTS IN SEQUENCE OF EXECUTION ";
      ITEM LINE  C(60) = " "; #THE DETAIL REPORT LINES ARE FORMED HERE #
      ITEM LOWSEQ I;         # LOWEST SEQUENCE LOCATED                 #
      ITEM LOWSUB I;         # SUBSCRIPT OF LOWEST SEQUENCE LOCATED    #
      ITEM PRIOR  I = 0;     # VALUE OF PREVIOUSLY SELECTED SEQUENCE   #
      ITEM ROCOUNT I;        # COUNT OF FLOW PT REPORTS PRINTED        #
      ITEM RUID   C(7);      # CURRENT RUN-UNIT ID                     #
      ITEM RUSEQ  I;         # SEQUENCE OF CURRENT RUID                #
      ITEM TOTAL  I = 0;     # TOTAL NUMBER OF FLOW POINTS EXECUTED    #
      ITEM X1     I;         # SCRATCH                                 #
      ITEM X2     I;         # SCRATCH                                 #
# 
*     DEFINITION OF THE FLOW POINT TABLE
# 
      XREF ARRAY DB$FLPT S(2);
        BEGIN 
        ITEM FPMAXSUB I(00,00,60); # MAXIMUM SUBSCIPT INTO FLOW PT TABL#
        ITEM FPNAME   C(00,00,07); # FLOW POINT NAME                   #
        ITEM FPCOUNT  U(00,42,18); # COUNT OF FLOW POINT EXECUTIONS    #
        ITEM FPSEQ1   I(01,00,15); # FLOW POINT SEQUENCE PARCEL 1 (OLD)#
        ITEM FPSEQ2   I(01,15,15); # PARCEL 2 (NEXT TO OLDEST)         #
        ITEM FPSEQ3   I(01,30,15); # PARCEL 3 (NEXT TO NEWEST)         #
        ITEM FPSEQ4   I(01,45,15); # PARCEL 4 (NEWEST) LARGEST NUMBER  #
        ITEM FPSEQ13  I(01,00,45); # PARCELS 1, 2 AND 3 COMBINED       #
        ITEM FPSEQ24  I(01,15,45); # PARCELS 2, 3 AND 4 COMBINED       #
        ITEM FPSEQ14  I(01,00,60); # ALL FOUR PARCELS COMBINED         #
        END 
# 
*     DEFINITION OF THE USER IDENTIFICATION TABLE.
# 
      XREF ARRAY DB$RA0;     # USER ID TABLE ENTRIES ARE REFERENCED    #
                             # RELATIVE TO RA.                         #
        BEGIN 
        ITEM FURUID   C(00,00,07); # RUN-UNIT ID                       #
        ITEM FUSEQ    I(00,45,15); # SEQUENCE OF RUN-UNIT ID           #
        ITEM FUWORD   I(00,00,60); # FULL WORD                         #
        END 
  
      XREF ARRAY DB$FLUT; 
        BEGIN 
        ITEM FUPTR    I(00,42,18); # POINTER TO CURRENT RUN-UNIT ID    #
        ITEM FULIMIT  I(01,42,18); # LIMIT OF DB$FLUT TABLE            #
        END 
  
  
  
#     S T A R T   O F   D B $ F L R P   E X E C U T A B L E   C O D E  #
  
      DB$LINE(0,0);          # START THE REPORTS ON A NEW PAGE         #
  
#     PRINT ALPHABETIC FLOW POINT REPORT                               #
  
      DB$LINB(" ",1); 
      DB$LINB(HEAD1,38);
      DB$LINB(" ",1); 
      DB$LINB(HEAD1A,54); 
      DB$LINB(" ",1); 
      CONTROL FASTLOOP; 
      FOR X1 = 1 STEP 1 UNTIL FPMAXSUB[0] -1
      DO
        BEGIN 
        C<3,7>LINE = FPNAME [X1]; 
        C<13,6>LINE = DB$CDEB(FPCOUNT[X1],6); 
        C<25,6>LINE = DB$CDEB(FPSEQ4 [X1],6); 
        C<32,6>LINE = DB$CDEB(FPSEQ3 [X1],6); 
        C<39,6>LINE = DB$CDEB(FPSEQ2 [X1],6); 
        C<46,6>LINE = DB$CDEB(FPSEQ1 [X1],6); 
        DB$LINB(LINE,60); 
        TOTAL = TOTAL + FPCOUNT[X1];
        END 
      LINE = " "; 
      DB$LINB(" ",1); 
      C<2,5>LINE = "TOTAL"; 
      C<11,8>LINE = DB$CDEB(TOTAL,8); 
      DB$LINB(LINE,60); 
      LINE = " "; 
      DB$LINB(" ",1); 
      DB$LINB(" ",1); 
# 
*     BEFORE PRODUCING THE NEXT REPORT -
*     LEFT SHIFT THE FLOW SEQUENCE PARCELS WHILE THE LEFT PARCEL IS ZERO
# 
      CONTROL FASTLOOP; 
      FOR X1 = 1 STEP 1 UNTIL FPMAXSUB[0] -1
      DO
        BEGIN 
        CONTROL FASTLOOP; 
        FOR X2 = 2 STEP -1 UNTIL 0
        DO
          BEGIN 
          IF FPSEQ1 [X1] NQ 0 
          THEN
            BEGIN 
            TEST X1;
            END 
  
          FPSEQ13 [X1] = FPSEQ24 [X1];
          FPSEQ4 [X1] = 0;
          END 
        END 
# 
*     PRINT FLOW POINTS IN SEQUENCE OF EXECUTION. 
* 
*     THE VALUES -37777, -0, 0 AND 37777 ARE NOT PERMITTED AMONG THE
*     SEQUENCE NUMBERS USED IN THE TWO TABLES SO THESE ARE USED AS
*     CONTROL NUMBERS IN THE PROCEDURE. 
* 
*     -37777 IS LOWER THAN ANY EXISTING NUMBER. 
*     37777 IS GREATER THAN ANY EXISTING NUMBER.
*     0 IS USED AS A NULL IN DB$FLPT. 
# 
      DB$LINB(HEAD2,40);
      DB$LINB(" ",1); 
      RUSEQ = FUSEQ[FUPTR[0]]; # INITIALIZE CURRENT RUN-UNIT SEQUENCE  #
      CONTROL FASTLOOP; 
      FOR X2 = X2 
      DO
        BEGIN 
        LOWSEQ = O"37777";
        LOWSUB = 0; 
# 
*     DETERMINE THE LOWEST SEQUENCE IN THE FLOWPOINT TABLE. 
*     IT IS KNOWN TO BE IN THE LEFT PARCEL OF ITS WORD. 
# 
        CONTROL FASTLOOP; 
        FOR X1 = 1 STEP 1 UNTIL FPMAXSUB[0] -1
        DO
          BEGIN 
          IF FPSEQ1[X1] NQ 0
            AND FPSEQ1[X1] LS LOWSEQ
          THEN
            BEGIN 
            LOWSEQ = FPSEQ1[X1];
            LOWSUB = X1;
            END 
          END 
# 
*       MERGE THE RUN-UNIT ID'S INTO THE REPORT.
# 
        CONTROL SLOWLOOP; 
        FOR X1 = X1 WHILE RUSEQ LS LOWSEQ 
        DO
          BEGIN 
          IF RUSEQ GR - O"37777"
          THEN
                             # THE DB$FLUT TABLE IS INITIALIZED WITH   #
                             # LOW SEQUENCE NUMBERS. (-37777)          #
                             # THESE ARE BYPASSED IF ANY ARE LEFT IN   #
                             # THE TABLE.                              #
            BEGIN 
            RUID = FURUID[FUPTR[0]];
            IF B<24,18>RUID EQ 0
            THEN
              BEGIN 
              C<4,3>RUID = "   "; 
              END 
            IF RUSEQ NQ PRIOR+1 
              AND PRIOR NQ 0
            THEN             # ASTERISKS FLAG THE MISSING SEQUENCES    #
              BEGIN 
              DB$LINB("    ****  ",10); 
              END 
            C<3,7>LINE = RUID;
            C<11,1>LINE = "*";
            C<13,6>LINE = DB$CDEB(RUSEQ,6); 
            DB$LINB(LINE,21); 
            C<10,10>LINE = " "; 
            PRIOR = RUSEQ;
            END 
          FUSEQ[FUPTR[0]] = O"37777"; 
          FUPTR[0] = FUPTR[0] +1; 
          IF FUPTR[0] EQ FULIMIT[0] 
          THEN
            BEGIN 
            FUPTR[0] = LOC(DB$FLUT) +2; 
            END 
          RUSEQ = FUSEQ[FUPTR[0]];
          END 
# 
*       RESUME PROCESSING OF THE DB$FLPT ENTRIES. 
# 
  
        IF LOWSUB EQ 0
        THEN
          BEGIN 
          GOTO FINISH;
  
          END 
        IF LOWSEQ NQ PRIOR +1 
          AND PRIOR NQ 0
        THEN
          BEGIN 
          DB$LINB("    ****  ",10); 
          END 
        PRIOR = LOWSEQ; 
        X1 = LOWSUB;
  
        C<3,7>LINE = FPNAME [X1]; 
        C<13,6>LINE = DB$CDEB(FPSEQ1[X1],6);
        DB$LINB(LINE,21); 
# 
*       SHIFT THE NEXT SEQUENCE INTO POSITION 
# 
        FPSEQ13 [X1] = FPSEQ24 [X1];
        FPSEQ4 [X1] = 0;
        END 
  
FINISH: 
      DB$LINB(0,0);          # FLUSH THE PAGE BUFFER TO THE PRINT FILE #
# 
*       REINITIALIZE THE FLOW POINT TABLE.
# 
      FPNAME[1] = FPNAME[FPMAXSUB[0]-1];
      FPMAXSUB[0] = 2;
      ROCOUNT = DB$CBIN(C<3,4>FPNAME[1],4,10) +1; 
      C<3,4>FPNAME[1] = DB$CDEC(ROCOUNT,4); 
      FPCOUNT[1] = 0; 
      FPSEQ14[1] = 0; 
# 
*       REINITIALIZE THE USER ID TABLE. 
# 
      FUPTR[0] = LOC(FUPTR[2]); 
      FOR X1 = FULIMIT[0]-1 STEP -1 UNTIL FUPTR[0]
      DO
        BEGIN 
        FUWORD[X1] = O"40000";
        END 
      END 
      TERM
