8.6.2.4 RXSIO — The Standard I/O Exit Handler

The main code for this exit handler has the symbolic value RXSIO.
There are four sub-functions:
     [RXSIODTR]
          Called whenever the interpreter needs to read a line
          from the user during interactive tracing. Note the
          difference between this subfunction and  RXSIOTRD.
     [RXSIOSAY]
          Called whenever the interpreter tries to write something
          to standard output in a  SAY instruction, even a SAY
          instruction without a parameter.
     [RXSIOTRC]
          Called whenever the interpreter tries to write out
          debugging information, e.g. during tracing, as a trace
          back, or as a syntax error message.
     [RXSIOTRD]
          Called whenever the interpreter need to read from the
          standard input stream during a PULL or PARSE PULL
          instruction.  Note that it will not be called if there
          is sufficient data on the  stack to satisfy the
          operation.

Note that these function are only called for the exact situations
that are listed above. e.g. the RXSIOSAY is not called during a
call to the REXX built-in function LINEOUT() that writes to the
default output stream. TRL says that SAY is identical to calling
LINEOUT() for the standard output stream, but SAA API still
manages to see the difference between stem variables and compound
variables with a ``zero-length-string'' tail. Please bear with
this inconsistency.

Depending on the subfunction, the ParmBlock parameter will have
four only slightly different definitions. It is kind of
frustrating that the ParmBlock takes so many different datatypes,
but it can
be handled easily using unions, see a later section. The
definitions are:

     typedef struct {
           RXSTRING rxsiodtr_retc ;  /* the interactive trace
     input */
     } RXSIODTR_PARM ;
     
     typedef struct {
           RXSTRING rxsio_string ;   /* the SAY line to write out
     */
     } RXSIOSAY_PARM ;
     
     typedef struct {
           RXSTRING rxsio_string ;   /* the debug line to write
     out */
     } RXSIOTRC_PARM ;
     
     typedef struct {
           RXSTRING rxsiotrd_retc ;  /* the line to read in */
     } RXSIOTRD_PARM ;

In all of these, the RXSTRING structure either holds the value to
be written out  (for RXSIOSAY and RXSIOTRC), or the value to be
used instead of reading standard input stream  (for RXSIOTRD and
RXSIODTR). Note that the values set by RXSIOTRD and RXSIODTR are
ignored if the exit handler does not return the value
RXEXIT_HANDLED.

Any end-of-line marker are stripped off the strings in this
context. If the exit handler writes out the string during RXSIOSAY
or RXSIOTRC, it must supply any end-of-line action itself.
Similarly, the interpreter does not expect a end-of-line marker in
the data returned from RXSIODTR and RXSIOTRD.

The space used to store the return data for the RXSIODTR and
RXSIOTRD sub-functions, must be provided by the exit handler
itself, and the space is not de-allocated by the interpreter. The
space can be reused by the application at any later time. The
space allocated to hold the data given by the RXSIOSAY and
RXSIOTRC sub-functions, will be allocated by the interpreter, and
must neither be de-allocated by the exit handler, nor used after
the exit handler has terminated.


PREV NEXT