Using Functions |
Top Previous Next |
User-defined functions are a handy way to re-use a sequence of commands that may otherwise be repeated in a script file. Like functions or subroutines in other programming environments, Robo-FTP script file functions make script development easier and results in more easily read and maintained scripts.
A script may define up to 256 unique functions. Functions may call other functions and may call themselves recursively but the nesting depth of embedded functions is limited to 512 calls. If the nesting depth exceeds 512 then the function call fails and error $ERROR_FUNCS_NOT_RECURSIVE is returned.
Functions must be declared before they can be used. Robo-FTP provides two script directives to create what is referred to as a function declaration section within a script file. This section must be at the top of the script file.
;; an example function declaration section ;; function(s) are defined here
Functions are defined within the function declaration section in the following manner.
;; an example function FUNCTION MyFunction ;; function body is here
Putting it all together.
;; an example function declaration section BEGINFUNCTIONS ;; function(s) are defined here ;; an example function FUNCTION MyFunction ;; function body is here ENDFUNCTION ENDFUNCTIONS
There can be multiple functions.
;; an example function declaration section BEGINFUNCTIONS ;; function(s) are defined here ;; example function #1 FUNCTION MyFunction1 ;; function body is here ENDFUNCTION ;; example function #2 FUNCTION MyFunction2 ;; function body is here ENDFUNCTION ENDFUNCTIONS
Calling a function is accomplished by simply using the function name as a command in the script file. The following calls the two functions declared above.
;; call my functions MyFunction1 MyFunction2
Up to 32 arguments may be passed to a function. The function must be declared showing the arguments and then called with the corresponding number of arguments.
;; an example function with two arguments FUNCTION MyFunction arg1 arg2 ;; function body is here ENDFUNCTION
;; calling the function with two arguments MyFunction "a" "b"
;; calling the function passing a variable as an argument SET var = "I am an argument" MyFunction var "b"
Because functions are global, they are accessible from the main script and any scripts that are invoked with CALL or CHAIN script commands. It is possible to define functions in one script file and then call those functions when running other script file(s).
Function arguments are local to a single call of a function unless they have the same name as a pre-existing variable. Any other variable modified or created inside a function is global in scope. In the script below, the first function argument has the same name as a pre-existing variable so it may be used both inside and outside the function:
;; declare our function BEGINFUNCTIONS FUNCTION MyFunction arg1 arg2 DISPLAY arg1 DISPLAY arg2 SET var1 = "hello" ;; creates variable named var1 ENDFUNCTION ENDFUNCTIONS ;; script execution begin here SET arg1 = "a" ;; creates variable named arg1 MyFunction arg1 "b" DISPLAY arg1 DISPLAY arg2 ;; this line will cause an error DISPLAY var1
All of the previous examples show a single return point from a function. Specifically, all of the preceding functions return when there are no more command(s) in the function to perform. Multiple return points are possible in more complex scripts by using the RETURN script command which returns script execution to the command immediately after the function call.
;; declare our function BEGINFUNCTIONS FUNCTION MyFunction arg1 ;; complicated operations GOTO more :more ;; more complicated operations RETURN ENDFUNCTION ENDFUNCTIONS
The RETURN statement is not always required. In the preceding function, the second RETURN statement is redundant because the ENDFUNCTION directive is recognized as the end of the function so the RETURN command is implied. The script could be written as shown below:
;; declare our function BEGINFUNCTIONS FUNCTION MyFunction arg1 ;; complicated operations GOTO more RETURN :more ;; more complicated operations ENDFUNCTION ENDFUNCTIONS
Finally, the RETURN statement allows for a numeric return code to be passed back. Upon return to the calling script, the return code may be tested using the IFERROR script commands and is saved in the %lasterror variable. The following example shows how different return points from a function may be indicated to the calling script.
;; declare our function BEGINFUNCTIONS FUNCTION MyFunction arg1 ;; complicated operations GOTO more RETURN $ERROR_INVALID_FILE_NAME :more ;; more complicated operations RETURN $ERROR_FTP_CONNECT_FAILURE ENDFUNCTION ENDFUNCTIONS
Testing a return code would look something like this.
;; call my functions MyFunction1 IFERROR= $ERROR_INVALID_FILE_NAME GOTO from_Return1 IFERROR= $ERROR_FTP_CONNECT_FAILURE GOTO from_Return2
Related command(s): FUNCTION, ENDFUNCTION, BEGINFUNCTIONS, ENDFUNCTIONS, RETURN |