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.
               
For dynamic variables, a size limitation check at compile time is
                  			 not possible because no length is defined for dynamic variables. The size of 
                  			 user buffer area (USIZE) indicates the
                  			 size of the user buffer in virtual memory. The user buffer contains all data
                  			 dynamically allocated by Natural. If a dynamic variable is allocated or
                  			 extended at execution time and the USIZE limitation is
                  			 exceeded, an error message will be returned.
               
The statements EXPAND,
                  			 REDUCE and
                  			 RESIZE are used to
                  			 explicitly allocate and free memory space for a dynamic variable.
               
| EXPAND [SIZE OF] DYNAMIC [VARIABLE]operand1TOoperand2 | 
| REDUCE [SIZE OF] DYNAMIC [VARIABLE]operand1TOoperand2 | 
| RESIZE [SIZE OF] DYNAMIC [VARIABLE]operand1TOoperand2 | 
- 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.