*DECK FFSMATS 
USETEXT TEXTFFS 
      PROC FFSMATS (PTR, (IDX), (NUM)); 
*CALL COPYRITE
# TITLE FFSMATS - ALLOCATE TABLE SPACE.                                #
  
      BEGIN                            # FFSMATS                       #
# 
**    FFSMATS  ALLOCATE TABLE SPACE.
* 
*     C. J. RAMSAY                     84/03/13 
* 
*     THIS PROCEDURE ALLOCATES THE REQUESTED AMOUNT OF MEMORY TO THE
*     SPECIFIED TABLE BEGINNING AT THE SPECIFIED POSITION IN THE TABLE. 
* 
*     PROC FFSMATS (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:  
*                IF NECESSARY REQUEST A FIELD LENGTH CHANGE.
*                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 FFSMATS - XREF LIST
# 
      XREF
        BEGIN 
        PROC MOVEI;      # MOVE A NUMBER OF WORDS - INDIRECT ADDRESSING#
        PROC FFSMRFL;    # REQUEST FIELD LENGTH CHANGE                 #
        PROC FFSMRMT;    # RELOCATE MANAGED TABLES                     #
        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  #
          FFSMRFL (NUM);               # REQUEST ADDITIONAL FIELD LEN  #
          END;
        FFSMRMT (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                              # FFSMATS                       #
  
      TERM
