This document covers the following topics:
In that the maximum size of large data structures (for example,
                       pictures, sounds, videos) may not exactly be known at application development
                       time,  Natural additionally provides for the definition of alphanumeric and
                       binary variables with the attribute DYNAMIC. The value space of
                       variables which are defined with this attribute will be extended dynamically at
                       execution time when it becomes necessary (for example, during an assignment
                       operation: #picture1 := #picture2). This means that large binary
                       and alphanumeric data structures may be processed in Natural without the need
                       to define a limit at development time. The execution-time allocation of dynamic
                       variables is of course subject to available memory restrictions. If the
                       allocation of dynamic variables results in an insufficient memory condition
                       being returned by the underlying operating system, the
                       ON ERROR statement
                       can be used to intercept this error condition; otherwise, an error message will
                       be returned by Natural.
               
The Natural system variable *LENGTH
                       can be used obtain the length (in terms of code units) of the value space which
                       is currently used for a given dynamic variable. For A and B formats, the size
                       of one code unit is 1 byte. For U format, the size of one code unit is 2 bytes
                       (UTF-16). Natural automatically sets *LENGTH to
                       the length of the source operand during assignments in which the dynamic
                       variable is involved.
                       *LENGTH(field)
                       therefore returns the length (in terms of code units) currently used for a
                       dynamic Natural field or variable.
               
If the dynamic variable space is no longer needed, the
                       REDUCE or
                       RESIZE statements can
                       be used to reduce the space used for the dynamic variable to zero (or any other
                       desired size).  If the upper limit of memory usage is known for a specific
                       dynamic variable, the EXPAND statement can be used to
                       set the space used for the dynamic variable to this specific size.
               
If a dynamic variable is to be initialized, the
                       MOVE ALL UNTIL
                       statement should be used for this purpose.
               
Because the actual size of large alphanumeric and binary data structures
                       may not be exactly known at application development time, the definition of
                       dynamic variables of format A, B or U can be used to manage these
                       structures. The dynamic allocation and extension (reallocation) of large
                       variables is transparent to the application programming logic. Dynamic
                       variables are defined without any length. Memory will be allocated either
                       implicitly at execution time, when the dynamic variable is used as a target
                       operand, or explicitly with an EXPAND or
                       RESIZE statement.
               
Dynamic variables can only be defined in a
                       DEFINE DATA
                       statement using the following syntax:
               
 level variable-name ( A )
                                       DYNAMIC 
                         |  
                               
                     
level variable-name ( B )
                                       DYNAMIC 
                         |  
                               
                     
level variable-name ( U )
                                       DYNAMIC 
                         |  
                               
                     
The following restrictions apply to a dynamic variable:
A redefinition of a dynamic variable is not allowed.
A dynamic variable may not be contained in a REDEFINE
                               clause.
                     
The length (in terms of code units) of the currently used value space of
                       a dynamic variable can be obtained from the system variable
                       *LENGTH.
                       *LENGTH is set to the (used) length of the source
                       operand during assignments automatically.
               
| Warning: Due to performance considerations, the storage area that is allocated to hold the value of the dynamic variable may be larger than the value of *LENGTH (used size available to the
                                   programmer). You should not rely on the storage that is allocated beyond the
                                   used length as indicated by *LENGTH: it may be
                                   released at any time, even if the respective dynamic variable is not accessed.
                                   It is not possible for the Natural programmer to obtain information about the
                                   currently allocated size. This is an internal value. | 
                     
*LENGTH(field)
                       returns the used length (in terms of code units) of a dynamic Natural field or
                       variable. For A and B formats, the size of one code unit is 1 byte. For U
                       format, the size of one code unit is 2 bytes (UTF-16).
                       *LENGTH may be used only to get the currently used
                       length for dynamic variables.
               
The statements EXPAND,
                       REDUCE and
                       RESIZE are used to
                       explicitly allocate and free memory space for a dynamic variable.
               
 EXPAND [SIZE OF] DYNAMIC [VARIABLE]
                                    operand1 TO
                                    operand2 
                         |  
                               
                     
REDUCE [SIZE OF] DYNAMIC [VARIABLE]
                                    operand1 TO
                                    operand2 
                         |  
                               
                     
RESIZE [SIZE OF] DYNAMIC [VARIABLE]
                                    operand1 TO
                                    operand2 
                         |  
                               
                     
- where operand1 is a dynamic
                       variable and operand2 is a non-negative
                       numeric size value.
               
The EXPAND
                        statement is used to increase the allocated length of the dynamic variable
                        (operand1) to the specified length
                        (operand2).
               
The length currently used (as indicated by the Natural system variable
                        *LENGTH,
                        see above) for the
                        dynamic variable is not modified.
               
If the specified length
                        (operand2) is less than the allocated
                        length of the dynamic variable, the statement will be ignored. 
               
The REDUCE
                        statement is used to reduce the allocated length of the dynamic variable
                        (operand1) to the specified length
                        (operand2).
               
The storage allocated for the dynamic variable
                        (operand1) beyond the specified length
                        (operand2) may be released at any time,
                        when the statement is executed or at a later time.
               
If the length currently used (as indicated by the Natural system
                        variable *LENGTH,
                        see above) for the
                        dynamic variable is greater than the specified length
                        (operand2), the system variable
                        *LENGTH of this dynamic variable is set to the
                        specified length. The content of the variable is truncated, but not
                        modified.
               
If the given length is larger than the currently allocated storage of the dynamic variable, the statement will be ignored.
The RESIZE
                        statement adjusts the currently allocated length of the dynamic variable
                        (operand1) to the specified length
                        (operand2).
               
If the specified length is smaller than the used length (as indicated
                        by the Natural system variable *LENGTH,
                        see above) of the
                        dynamic variable, the used length is reduced accordingly.
               
If the specified length is larger than the currently allocated length
                        of the dynamic variable, the allocated length of the dynamic variable is
                        increased. The currently used length (as indicated by the system variable
                        *LENGTH) of the dynamic variable is not affected
                        and remains unchanged.
               
If the specified length is the same as the currently allocated length
                        of the dynamic variable, the execution of the RESIZE statement has
                        no effect.