*DECK S$COLST 
          PROC S$COLST(DAYFILE);
  
#         S$COLST - COLLECT SM5SORT ARRAY STATISTICS AND SET ARRAY     #
#                                                                      #
#      CALLING SEQ -                                                   #
#             DAYFILE(BOOLEAN PARAMETER FROM S$MAIN)                   #
  
#      GIVEN -                                                         #
#         THIS ROUTINE USES THE GLOBAL VARIABLES: S$ARRY AND S$LOCST   #
#      DOES -                                                          #
#         USING THE ADDRESS IN S$LOCST, THIS ROUTINE SETS UP A BASED   #
#         ARRAY FOR THE SM5SORT ARRAY.  DEPENDING UPON WHAT THE FIRST  #
#         ELEMENT OF THE ARRAY IS, WHICH TELLS SORT5 HOW MANY ELEMENTS #
#         OF THE ARRAY THE USER WANTS, THIS ROUTINE COPIES THE DESIRED #
#         ELEMENTS FROM S$ARRY TO THE BASED ARRAY THAT THE USER WILL   #
#         ACCESS.                                                      #
#         THE GLOBAL STATISTICS ARRAY, S$ARRY, CONTAINS                #
#         THE FOLLOWING ELEMENTS:                                      #
#             1 - NO. OF RECORDS READ FROM INPUT FILES-                #
#                 THIS NUMBER IS INCREMENTED AND SET IN S$GNGR1.       #
#             2 - NO. OF RECORDS DELETED BY OWNCODE 1-                 #
#                 SET IN S$GNGR1 IF THERE IS AN INPUT FILE, AND        #
#                 NOT SET IF THERE ARE NO INPUT FILES.                 #
#             3 - NO. OF RECORDS INSERTED BY OWNCODE 1-                #
#                 SET IN S$GNGR1 IF THERE ARE INPUT FILES, AND         #
#                 SET IN S$GNGR2 IF THERE ARE NO INPUT FILES           #
#             4 - NO. OF RECORDS INSERTED BY OWNCODE 2-                #
#                 SET IN S$GNGR1 IF THERE ARE INPUT FILES, AND         #
#                 SET IN S$GNGR2 IF THERE ARE NO INPUT FILES           #
#             5 - NO. OF RECORDS SORTED OR MERGED-                     #
#                 THE SUM OF ELEMENTS 1,3,AND 4 MINUS ELEMENT 2.       #
#             6 - NO. OF RECORDS DELETED BY OWNCODE 3-                 #
#                 SET IN S$GNPR1 UNLESS OWN5 IS USED THEN              #
#                 IT IS SET IN S$GNPR2.                                #
#             7 - NO, OF RECORDS INSERTED BY OWNCODE 3-                #
#                 SET IN S$GNPR1 UNLESS OWN5 IS USED THEN              #
#                 IT IS SET IN S$GNPR2.                                #
#             8 - NO. OF RECORDS INSERTED BY OWNCODE 4-                #
#                 SET IN S$GNPR1 UNLESS OWN5 IS USED THEN              #
#                 IT IS SET IN S$GNPR2.                                #
#             9 - NO. OF RECORDS INSERTED BY OWNCODE 5-                #
#                 SET IN S$GNPR2.                                      #
#             10- NO. OF RECORDS DELETED BY OWNCODE 5-                 #
#                 SET IN S$GNPR2.                                      #
#             11- NO. OF RECORDS COMBINED BY  SUMMING -                #
#                 SET IN S$GNSMA.                                      #
#             12- NO. OF RECORDS WRITTEN TO OUTPUT FILE -              #
#                   SET IN S$GNPR1 AND S$GNPR3.                        #
#             13- MINIMUM RECORD LENGTH(IN CHARACTERS) -               #
#                 SET IN S$PRSPC.                                      #
#             14- AVERAGE RECORD LENGTH -                              #
#                                                                      #
#         N O T E:  IF ANY MORE ELEMENTS ARE ADDED LATER,  THEN THE    #
#         USE OF '15' BELOW AS A UPPER BOUND WILL HAVE TO BE CHANGED   #
#                 IF THE RECORDS ARE OF FIXED LENGTH THEN THIS         #
#                 ELEMENT IS SET IN S$PRSPC, OTHERWISE, IF THE         #
#                 RECORDS ARE OF VARIABLE LENGTH THEN THE AVERAGE      #
#                 IS CALCULATED AS TOTAL CHAR. / ELEMENT 5.            #
#             15- MAXIMUM RECORD LENGTH -                              #
#                 SET IN S$PRSPC.                                      #
#                                                                      #
  
          BEGIN 
  
          XREF
              BEGIN 
              PROC S$MESAG; 
              ITEM S$LOCST          I;      # ADDRESS OF USER ARRAY    #
*CALL S$CALLR 
  
              ARRAY S$ARRY [1:15];
                  ITEM S$ARRYELEM      I(0, 0, 60); 
              END 
  
          ITEM I;                    # LOOP INCREMENT                  #
          ITEM  DAYFILE       B;  # REMEMBER DAYFILE SUPPRESSION       #
          ITEM REAL1   R;            #CONTAINS FIRST-HALF OF INTEGER   #
          ITEM REAL2   R;            #CONTAINS LAST-HALF OF INTEGER    #
          ITEM RAVG    R;            #AVERAGE REC LEN AS REAL NUM      #
          ITEM RTOTR   R;            #TOTAL NUMBER OF RECORDS SORTED   #
          ITEM RTOTRL  R;            #TOTAL OF ALL RECORD LENGTHS      #
  
          BASED  ARRAY SARAY$  [0:15];
              ITEM SARAY$ELEM       I(0, 0, 60);
  
  
          S$ARRYELEM[5] = (S$ARRYELEM[1] + S$ARRYELEM[3] + S$ARRYELEM[4]
                             - S$ARRYELEM[2]);
  
          IF S$ARRYELEM[9] EQ 0  THEN 
#               THIS ELEMENT WAS NOT SET TO 1 BY S$PRSPC -             #
#           THE RECORDS SORTED ARE NOT FIXED LENGTH SO                 #
#           THE AVERAGE REC. LEN. MUST BE CALCULATED.                  #
#           IN SYMPL, INTEGERS ARE TRUNCATED WHEN CONVERTED TO REALS   #
#           SO WE NEED TO DIVID BOTH THE INTEGER CONTAINING THE TOTAL  #
#           RECORD LENGTHS, AND THE INTEGER CONTAINING THE TOTAL       #
#           NUMBER OF RECORDS IN HALF. THEN WE CAN CALCULATE THE       #
#           AVERAGE (TOT-OF-REC-LENS / TOT-NUM-OF-RECS)                #
#           WITHOUT LOSSING ANY PRECESION.                             #
  
              BEGIN 
              REAL1 = B<0,30>S$ARRYELEM[14];
              REAL2 = B<30,30>S$ARRYELEM[14]; 
              RTOTRL = (REAL1 * 2**30) + REAL2; 
              REAL1 = B<0,30>S$ARRYELEM[12];
              REAL2 = B<30,30>S$ARRYELEM[12]; 
              RTOTR = (REAL1 * 2**30) + REAL2;
#    IF WE HAVE ZERO RECORDS, DON'T CACULATE THE AVERAGE RECORD LENGTH #
              IF  RTOTR LS 1.0  THEN
                  RAVG = 0.0; 
              ELSE
                  RAVG = RTOTRL / RTOTR;
              S$ARRYELEM[14] = RAVG;
              END 
  
          IF S$ARRYELEM[9] NQ 0  THEN 
             BEGIN
             S$ARRYELEM[9]  = 0;
             S$ARRYELEM[14] = S$ARRYELEM[13]; 
             END
          IF DAYFILE THEN 
              S$MESAG(S$ARRY);
  
          IF S$CALLR EQ 2  THEN 
            BEGIN 
            P<SARAY$> = S$LOCST;
            IF SARAY$ELEM[0] GR 0  THEN 
              BEGIN 
              FOR I=1 STEP 1 UNTIL SARAY$ELEM[0]  DO
                 BEGIN
                  SARAY$ELEM[I] = S$ARRYELEM[I];
                 IF I EQ 15  THEN 
#                  STOP SETTING ARRAY VALUES, EVEN THOUGH              #
#                  THE USER ASKED FOR MORE THAN 15                     #
                      I = SARAY$ELEM[0];
                 END
              END 
            END 
  
          END  # OF S$COLST # 
          TERM
