8.3.1 What is an External Function Handler

An external function handler is a piece of code, that is called to
handle external functions and subroutine calls in REXX. It must be
either a subroutine in the application that started the
interpreter, or a subroutine in a dynamic link library. In any
case, when the interpreter needs to execute a function  registered
as an external function, it will call the external function
handler, passing the function name as a parameter.
All external functions written in a language other than REXX must
be registered with the interpreter before starting a REXX script.

An external function handler can handle one or more functions.
The handler can determine the function actually called by
examiining one of the parameters passed to the handler and act
accordingly.

The prototype of a subcommand handler function is:

     APIRET APIENTRY handler(
           PSZ name,
           ULONG argc,
           PRXSTRING argv,
           PSZ queuename,
           PRXSTRING returnstring
      ) ;

After a function is registered with this function defined as the
handler, this function is called whenever the application calls
the function. The value of the parameters are:

     [name]
          The  function called.
     [argc]
          The number of parameters passed to the function. Argv
          will contain argc RXSTRINGs.
     [queuename]
          The name of the currently define data queue.
     [returnstring]
          Points to a RXSTRING which is to receive the return
          value from the function. Passing the return value as a
          string makes it  possible to return non-numeric return
          codes. As a special case, you  might set
          returnstring.strptr to NULL, instead of  specifying a
          return string of the ASCII representation of zero.

The returnstring string will provide a 256 byte array which the
programmer might use if the return data is not longer that that.
If that space is not sufficient, the handler can provide another
area itself.  In that case, the handler should not de-allocate the
default area, and the new area should be allocated in a standard
fashion.  if the external function does not return a value, it
should set returnstring to an empty RXSTRING.  This will enable
the interpreter to raise error 44; Function did not return data,
if the external function is called as a function.  If the external
function is invoked via a CALL command, the interpreter drops the
special variable RESULT.

The handler returns zero if the function completed successfully.
When the handler returns a non-zero value, the interpreter will
raise error 40; Invalid call to routine.



PREV NEXT