Start of change

Example: ALLOCATE and FREE storage for UNBOUNDED tables

This example illustrates one way to manage an UNBOUNDED table that needs to be dynamically increased in size by using the ALLOCATE and FREE statements.

Start of change
 ID DIVISION.
  PROGRAM-ID. ALLOC.
 ENVIRONMENT DIVISION.
 DATA DIVISION.
  WORKING-STORAGE SECTION.
  77 X PIC 9(2) PACKED-DECIMAL.
  77 NUM-ELEMENTS PIC 9(4) BINARY.
  77 SIZE-NEEDED PIC 9(4) BINARY.
  77 VPTR POINTER.

  LINKAGE SECTION.

  01 VARGRP.
    02 OBJ PIC 9(4) COMP.
    02 TABGRP.
      03 VARTAB OCCURS 1 TO UNBOUNDED DEPENDING ON OBJ.
        04 T1 PIC 9(4).
        04 T2 PIC X(8).
        04 T3 PIC 9(4) COMP.
  01 BUFFER PIC X(1000).

 PROCEDURE DIVISION.

     DISPLAY ’Starting testcase ALLOC’
     SET VPTR To NULL

*************************************************************
* Allocate a table with 20 elements
*************************************************************
     COMPUTE NUM-ELEMENTS = 20
     PERFORM ALLOC-VARGRP

*************************************************************
* Set some ’test’ values to validate re-allocated table
*************************************************************
     COMPUTE T1(12) = 9999
     MOVE ’HI MOM’ TO T2 (17)
     DISPLAY ’ ’
     DISPLAY ’VARTAB(12) = ’ VARTAB(12)
     DISPLAY ’VARTAB(17) = ’ VARTAB(17)
     DISPLAY ’ ’

*************************************************************
* Need a bigger table! Allocate a larger one and copy data
*************************************************************
     COMPUTE NUM-ELEMENTS = 30
     PERFORM ALLOC-VARGRP

*************************************************************
* Ensure that new table has correct data from original
*************************************************************
     DISPLAY ’VARTAB(12) = ’ VARTAB(12)
     DISPLAY ’VARTAB(17) = ’ VARTAB(17)

 GOBACK.

*************************************************************
* The first time allocate the original table. If the table
* has already been allocated, assume that we are allocating
* a larger one and want to copy the data over to it
*************************************************************
  ALLOC-VARGRP.
     If VPTR = NULL Then *> If first time, allocate the table
       COMPUTE SIZE-NEEDED = LENGTH OF OBJ +
                           LENGTH OF VARTAB * NUM-ELEMENTS
       ALLOCATE SIZE-NEEDED CHARACTERS INITIALIZED RETURNING VPTR
       SET ADDRESS OF VARGRP TO VPTR
       MOVE NUM-ELEMENTS TO OBJ

     Else                    *> If already have a table, doing re-size
*********************************************************************
* Re-size it!
* First, map BUFFER on current table   
*********************************************************************
                                     
       SET ADDRESS OF BUFFER TO VPTR   

*********************************************************************
* Calculate new size from NUM-ElEMENTS
*********************************************************************
     COMPUTE SIZE-NEEDED = LENGTH OF OBJ +
                           LENGTH OF VARTAB * NUM-ELEMENTS

     ALLOCATE SIZE-NEEDED CHARACTERS INITIALIZED RETURNING VPTR

*************************************************************
* Move data from old table to new larger table
*************************************************************
     SET ADDRESS OF VARGRP TO VPTR
     MOVE NUM-ELEMENTS TO OBJ
     MOVE BUFFER(1:SIZE-NEEDED) TO VARGRP

*************************************************************
* Free the original table
************************************************************
     SET VPTR TO ADDRESS OF BUFFER
     FREE VPTR
     .
End of change

related references  
ALLOCATE statement  
FREE statement  
MOVE statement  
Working with unbounded tables and groups (Enterprise COBOL Programming Guide)

End of change