*DECK FCSMATS 
USETEXT TEXTFCS 
      PROC FCSMATS (PTR, (IDX), (NUM)); 
*CALL COPYRITE
# TITLE FCSMATS - ALLOCATE TABLE SPACE.                                #
  
      BEGIN                            # FCSMATS                       #
  
# 
**    FCSMATS - ALLOCATE TABLE SPACE. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE ALLOCATES THE REQUESTED AMOUNT OF MEMORY TO THE
*     SPECIFIED TABLE BEGINNING AT THE SPECIFIED POSITION IN THE TABLE. 
* 
*     PROC FCSMATS (PTR, IDX, NUM)
* 
*     ENTRY    PTR       = PTR TO TABLE TO ALLOCATE SPACE TO. 
*              IDX       = WORD INDEX WITHIN TABLE TO START ALLOCATION. 
*              NUM       = NUMBER OF WORDS TO ALLOCATE. 
*              AVAIL     = AVAILABLE WORDS FOR TABLE EXPANSION. 
* 
*     EXIT     AVAIL     = AVAILABLE WORDS FOR TABLE EXPANSION. 
*              TABLE LENGTH UPDATED AND TABLES RELOCATED IF NECESSARY.
* 
*     METHOD   IF THE ALLOCATION CAUSES THE TABLE TO OVERFLOW THEN IF 
*              NECESSARY REQUEST A FIELD LENGTH CHANGE , AND RELOCATE 
*              ALL MANAGED TABLES.
*              UPDATE THE TABLE LENGTH AND AVAILABLE WORDS FOR TABLE
*              EXPANSION. 
*              IF THE ALLOCATION IS NOT AT THE END OF THE TABLE THEN
*              RELOCATE THE AFFECTED PORTION OF THE TABLE.
* 
# 
  
# 
****  PROC FCSMATS - XREF LIST
# 
      XREF
        BEGIN 
        PROC FCSMRFL;                  # REQUEST FIELD LENGTH CHANGE   #
        PROC FCSMRMT;                  # RELOCATE MANAGED TABLES       #
        PROC MOVEI;                    # MOVE A NUMBER OF WORDS (IND)  #
        END 
# 
****
# 
      ITEM PTR           I;            # TABLE POINTER                 #
      ITEM IDX           I;            # ALLOCATION INDEX WITHIN TABLE #
      ITEM NUM           I;            # NUMBER OF WORDS TO ALLOCATE   #
  
      ITEM COUNT         I;            # NUMBER OF WORDS TO MOVE       #
      ITEM DEST          I;            # ADDRESS TO MOVE TO            #
      ITEM FROM          I;            # ADDRESS TO MOVE FROM          #
      ITEM K             I;            # MANAGED TABLE INDEX           #
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      K = (LOC(PTR) - LOC(TSTART)) / 2;# CALCULATE MANAGED TABLE INDEX #
  
      IF (TABF[K] + TABL[K] + NUM) GR TABF[K+1] 
      THEN
        BEGIN                          # ALLOCATION WILL OVERFLOW TABLE#
        IF NUM GR AVAIL 
        THEN
          BEGIN                        # CANNOT ABSORB TABLE INCREASE  #
          FCSMRFL (NUM);               # REQUEST ADDITIONAL FIELD LEN  #
          END;
        FCSMRMT (AVAIL, K, NUM);       # RELOCATE MANAGED TABLES       #
        END;
  
      TABL[K] = TABL[K] + NUM;         # UPDATE TABLE LENGTH           #
      AVAIL = AVAIL - NUM;             # UPDATE AVAILABLE WORDS        #
  
      COUNT = TABL[K] - IDX - NUM;     # NUMBER OF WORDS TO MOVE       #
      IF COUNT NQ 0 
      THEN
        BEGIN                          # NEED TO MOVE PART OF TABLE    #
        FROM = TABF[K] + IDX;          # ADDRESS TO MOVE FROM          #
        DEST = TABF[K] + IDX + NUM;    # ADDRESS TO MOVE TO            #
        MOVEI (COUNT, FROM, DEST);     # MOVE AFFECTED PART OF TABLE   #
        END;
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSMATS                       #
  
      TERM
