NAME
          irExtendInit, irExtendStart, irExtendExit, irExtendExecute,
		  irExtendQuit, irExtendTrace - IRAPI extension functions

     SYNOPSIS
          #include <irapi.h>

          int irExtendInit ( int id... );

          int irExtendStart ( int id... );

          int irExtendExecute ( int id... );

          int irExtendExit ( int id... );

          int irExtendQuit ( int id... );

          int irExtendTrace ( int id... );


     DESCRIPTION
          The irExtend family of functions support execution
          of functions added to the IRAPI dynamic switch tables docu-
          mented in IrEXTEND(4SPI).

          The function irExtendInit calls each function in the IRAPI
          dynamic switch table Iri_ExtendInit_table with the argument
          list id , args where args is a pointer to the irExtendInit
          function stack after the id argument.  Each function called
          must return either IRR_OK or IRR_FAIL.


          The function irExtendStart calls each function in the IRAPI
          dynamic switch table Iri_ExtendStart_table with the argument
          list id, args where args is a pointer to the irExtendStart
          function stack after the id argument.  Each function called
          must return either IRR_OK or IRR_FAIL.


          The function irExtendExecute calls one function in the IRAPI
          dynamic switch table Iri_ExtendExecute_table with the argu-
          ment list id, args where args is a pointer to the
          irExtendExecute function stack after the id argument.  The
          function chosen for execution has a IRAPI dynamic switch
          table val field equal to id.  The function called must
          return either IRR_OK or IRR_FAIL.


          The function irExtendExit calls each function in the IRAPI
          dynamic switch table Iri_ExtendExit_table with the argument
          list id, args where args is a pointer to the irExtendExit
          function stack after the id argument.  Each function called
          must return either IRR_OK or IRR_FAIL.


          The function irExtendQuit calls each function in the IRAPI
          dynamic switch table Iri_ExtendQuit_table with the argument
          list id, args where args is a pointer to the irExtendQuit
          function stack after the id argument.  Each function called
          must return either IRR_OK or IRR_FAIL.


          The function irExtendTrace calls each function in the IRAPI
          dynamic switch table Iri_ExtendTrace_table with the argument
          list id, args where args is a pointer to the irExtendTrace
          function stack after the id argument.  Each function called
          must return either IRR_OK or IRR_FAIL.


          The stack arguments may be retrevied via the va_arg macro in
          the include file <stdarg_iso.h>

          This indirection is necessary because it is not possible in
          the C language to pass a variable argument list from one
          function to another function.


     EVENTS
          No events result from a call to the irExtend(3IRAPI) func-
          tions.  No events may result from a call to any subfunction.


     PARAMETERS
          The parameter IRP_EXTEND_BUF may be used to communicate
          between TSM scripts and the C language functions called via
          irExtend(3IRAPI).


     RETURN VALUE
          The functions irExtendInit, irExtendStart,
          irExtendExit, irExtendQuit and irExtendTrace 
          return IRR_OK if all functions in
          their respective IRAPI dynamic switch table return IRR_OK.

          The function irExtendExecute returns IRR_OK if the
          function in the IRAPI dynamic switch Iri_ExtendExecute_table
          identifed by id returns IRR_OK, or IRR_FAIL otherwise.


     TSM
          The TSM process executes the function call:

               irExtendInit( 0 )

          when TSM is initializing prior to executing any script.  The
          customer written extension function must have the following
          prototype and perform the following operations:


                   int your_extension_init_function(int id, va_list args)
                   {
                    /* whatever you need to do */

                    return( IRR_OK );
                   }

          There is no need for the customer written extension initial-
          ization function to examine the argument list since id is
          always zero, and args contains nothing meaningful.  Since
          this function is called when TSM process initializes the
          customer written extension function may do any initializa-
          tion that is appropriate in this context, i.e., memory allo-
          cation, initializing data structures, etc.

          The TSM process executes the function call:

               irExtendStart( 0, (channel_id)cid, (char *)script )

          when TSM starts a script.  This function is called prior to
          executing the first instruction of the script.  The customer
          written extension function should have the following proto-
          type, and perform the following operations:


                   int your_extension_start_function( int id, va_list args )
                   {
                    channel_id cid;
                    char *script;
                    int chan;

                    cid = va_arg(args, channel_id);
                    script = va_arg(args, char *);
                    chan = irCid2Chan(args, char *);

                    /* whatever you need to do */

                    return( IRR_OK );
                   }


          The TSM process executes the function call:

               irExtendExecute( id, (channel_id)cid, (char *)script, (long *)reg )



               extend( id )

          The customer written extension execute function should have
          the following prototype and perform the following opera-
          tions:


                   int your_extension_execute_function( int id, va_list args )
                   {
                    channel_id cid;
                    char *script;
                    long *reg;

                    cid = va_arg(args, channel_id);
                    script = va_arg(args, char *);
                    reg = va_arg(args, long *);
                    chan = irCid2Chan( cid );

                    /* whatever you need to do */

                    return( IRR_OK );
                   }


          The IRAPI parameter IRP_EXTEND_BUF, and the registers
          r.1,~...,~r.15 are the means by which TAS scripts and C
          language extension functions exchange information.

          The TAS script may get and set the IRAPI parameter
          IRP_EXTEND_BUF with the instruction:


                    setIRAPIparamstr( IRP_EXTEND_BUF, buffer, length )
               and
                    getIRAPIparamstr( IRP_EXTEND_BUF, buffer, length )

          The C language extension execute function may get and set
          this IRAPI parameter with:


                    irGetParamStr(cid, IRP_EXTEND_BUF, buffer, length );
               and
                    irSetParamStrCnt(cid, IRP_EXTEND_BUF, buffer, length );

          The TAS script may get and set script registers r.1, ...,
          r.15 with the load instruction.

          The C language extension execute function may get and set
          the script registers by getting and setting


               reg[7] = 43;

          when the extension execute function returns the TAS script
          register r.7 will contain a value of 43.

          The TSM process executes the function call:

               irExtendExit( 0, (channel_id)cid, (char *)script )

          when TSM terminates a script.  The customer written exten-
          sion function should have the following prototype, and per-
          form the following operations:


                   int your_extension_exit_function( int id, va_list args )
                   {
                    channel_id cid;
                    char *script;
                    int chan;

                    cid = va_arg(args, channel_id );
                    script = va_arg(args, char *);
                    chan = irCid2Chan( cid );

                    /* whatever you need to do */

                    return( IRR_OK );
                   }

          The TSM process executes the function call:

               irExtendQuit( 0 )

          when TSM terminates.  The customer written extension func-
          tion should have the following prototype, and perform the
          following operations:


                   int your_extension_quit_function( int id, va_list args )
                   {
                    /* whatever you need to do */

                    return( IRR_OK );
                   }

          There is no need for this function to examine the argument
          list since id is always 0, and args contains nothing mean-
          ingful.


          when TSM receives a SIGUSR1 signal.  The customer written
          extension function should have the following prototype, and
          perform the following operations:


                   int your_extension_trace_function( int id, va_list args )
                   {
                    /* whatever you need to do */

                    return( IRR_OK );
                   }

          There is no need for this function to examine the argument
          list since id is always 0, and args contains nothing mean-
          ingful.


          The id argument to irExtendExecute is the extension function
          identifier as passed to the TAS extend instruction.  The id
          argument to all other irExtend(3IRAPI) functions is always
          0.



          The cid argument in all the above function calls is the
          channel_id for the channel.

          The script argument in all the above function calls is the
          script name running on the channel.

          The reg argument to irExtendExecute is the array of
          IRD_NUMREG TSM registers.  All of the TSM registers may be
          read and/or written, however register zero, reg[0], aka r.0,
          will be set by TSM according to the return code of the C
          function called.


          There is no requirement for a customer written extension
          library to provide a function to each of the
          IrEXTEND(4IRAPI) tables.  As can be seen by the example in
          the file util_fcns.c there is one extension init function
          for the entire library.  Similarly, there is one start, one
          exit, one quit, and one trace function for the entire
          library.  There are separate execute functions for each
          utility function.

          This design was chosen to minimize the number of functions
          written.  It could just as well have had a seperate init.


          There is no need for a customer written extension function
          to call va_start or va_end, that is done by the correspond-
          ing irExtend(3IRAPI).  function.

          TSM is multi-threaded with one thread per channel.  It is
          possible for TSM to alternate thread execution between TAS
          instructions.  This impacts extend instruction execution in
          that if it is necessary to save an intermediate result
          between extend instructions the intermediate result should
          be saved in a persistent data structure accessed by channel
          number.


     WARNING
          The TSM extend instruction, and the functions it invokes via
          the irExtend(3IRAPI) functions are intended only for fast C
          functions and should not block or otherwise slow down TSM.
          These functions may not generate IRAPI events.  These func-
          tions may not not call database functions.  Any database
          functions should continue to be done through a DIP.  Only
          computationally simple, and inexpensive, DIPs should be
          replaced with extend functions.


     EXAMPLE
          See /vs/examples/IRAPI/util_fcns.c for a sample extension
          library which implements simple utility functions.


     ERROR
          irError may be set by the functions called through the IRAPI
          dynamic switch tables.


     SEE ALSO
          irSPIRegister, IrDEFINES(4IRAPI),
          IrPARAMETERS(4IRAPI)


     VERSION
          This is version 11/11/02 of this man page.