*DECK S$ALCF
          PROC  S$ALCF(FMTBL$, REC$, SPEC$, WSAF$); 
  
#**       S$ALCF -  ALLOCATE WSA$ FOR FINAL MERGE                      #
#                                                                      #
#     CALLING SEQUENCE-                                                #
#         S$ALCF(FMTBL$, REC$, SPEC$, WSAF$):                          #
#                                                                      #
#     GIVEN-                                                           #
#         FMTBL$ = DESCRIPTION OF FINAL MERGE.                         #
#         REC$ = FORMAT OF INTERNAL RECORD.                            #
#         SPEC$ = USER SPECIFICATIONS.                                 #
#                                                                      #
#     DOES-                                                            #
#         SETS WSAF$ ALLOCATION OF WSA$ FOR FINAL MERGE.               #
  
  
          BEGIN 
  
*CALL A 
  
*CALL FMTBL$
  
*CALL MACHINE 
  
*CALL REC$
  
*CALL SPEC$ 
  
*CALL WSAF$ 
  
          ITEM  I            I;        # SCRATCH                       #
          ITEM  LIBUFS       I; 
          ITEM  LOREC        I;        # LENGTH OF OREC                #
          ITEM  MINBUFLEN    I;        # MINIMUM BUFFER LENGTH         #
          ITEM  OFFSET       I; 
          ITEM  TOTALRELBFS  I;        # TOTAL OF ALL RELBFS-S         #
          ITEM  USED         I; 
  
          XREF
              PROC  S$ABORT;           # HANDLE INTERNAL ABORT         #
  
          CONTROL DISJOINT; 
  
          CONTROL INERT;
  
CONTROL EJECT;
  
#     DETERMINE BUFFER LENGTH                                          #
  
          MINBUFLEN = 9 * PRU +1; 
  
#     DETERMINE TOTAL OF RELBFS-S                                      #
  
          TOTALRELBFS = 0;
          FOR I = 1 STEP 1 UNTIL FMTBL$MO  DO 
              TOTALRELBFS = TOTALRELBFS + FMTBL$RELBFS[I];
  
#     COMPUTE LENGTHS OF SOME OF THE AREAS                             #
  
          WSAF$LTRN = FMTBL$MO;        # LENGTH OF TOURNAMENT          #
  
          USED = WSAF$LTRN                       # TOURNAMENT          #
                 + WSAF$LTRN*REC$IRRL            # RECORD STOR. AREA   #
          ;   # OUTPUT BUFFER ALLOCATED DYNAMICALLY # 
  
          IF SPEC$FIXED THEN
              LOREC = (SPEC$FIXLEN + WORD - 1)/WORD;
          ELSE
              LOREC = (SPEC$MRL + WORD - 1)/WORD + 1; 
              #( MAY CLOBBER LAST WORD + 1) # 
  
          USED = USED + LOREC;
  
          LIBUFS = SPEC$LWSA - USED;
          LIBUFS = LIBUFS - (FMTBL$MO * MINBUFLEN); 
  
#     SET OFFSETS OF AREAS                                             #
  
          WSAF$ORSA = WSAF$LTRN;
          OFFSET = WSAF$LTRN + WSAF$LTRN * REC$IRRL;
  
          WSAF$OREC = OFFSET; 
          OFFSET = OFFSET + LOREC;
  
          FOR I = 1 STEP 1 UNTIL FMTBL$MO DO
              BEGIN 
              WSAF$OIBUF[I] = OFFSET; 
              WSAF$LIBUF[I] = (LIBUFS * FMTBL$RELBFS[I] / TOTALRELBFS)
                                                + MINBUFLEN;
              OFFSET = OFFSET + WSAF$LIBUF[I];
              END 
  
          END  # S$ALCF # 
          TERM
