Use the GOSUB command in command procedures to transfer control to a
subroutine specified by the label. If the command stream is not being
read from a random-access device (that is, a disk device), the GOSUB
command performs no operation.
The RETURN command terminates the GOSUB subroutine procedure, returning
control to the command following the calling GOSUB statement. The
RETURN command accepts an optional status value.
The GOSUB command does not cause the creation of a new procedure level.
Therefore, it is referred to as a "local" subroutine call.
Any labels and local symbols defined in the current command procedure
level are available to a subroutine invoked with a GOSUB command. The
GOSUB command can be nested up to a maximum of 16 levels per procedure
level.
When the command interpreter encounters a label, it enters the label in
a label table. This table is allocated from space available in the
local symbol table. If the command interpreter encounters a label that
already exists in the table, the new definition replaces the existing
one. Therefore, if you use duplicate labels, control is always given to
the label most recently read by DCL. The following rules apply:
- If duplicate labels precede and follow the GOSUB command, control
is given to the label preceding the command.
- If duplicate labels all precede the GOSUB command, control is given
to the most recent label, that is, the one nearest the GOSUB command.
- If duplicate labels all follow the GOSUB command, control is given
to the one nearest the GOSUB command.
If a label does not exist in the current command procedure, the
procedure cannot continue and is forced to exit.
Note that the amount of space available for labels is limited. If a
command procedure uses many symbols and contains many labels, the
command interpreter may run out of table space and issue an error
message.
This sample command procedure shows how to use the GOSUB command to
transfer control to labeled subroutines. The GOSUB command transfers
control to the subroutine labeled TEST1. The procedure executes the
commands in subroutine TEST1, branching to the subroutine labeled
TEST2. The procedure then executes the commands in subroutine TEST2,
branching to the subroutine labeled TEST3. Each subroutine is
terminated by the RETURN command. After TEST3 is executed, the RETURN
command returns control back to the command line following each calling
GOSUB statement. At this point, the procedure has been successfully
executed.