Runtime interface functions
Your foreign subroutines can access the C string and data conversion functions, which are part of the Synergy runtime. You can only use these functions when you build a DLL or shared object with C routines (see Building a dynamic library with C routines).
You must pass the argument block pointer to runtime interface functions. This argument block pointer gets passed to your C routine. More than one argument block pointer can be active. For example, the following call is valid (from Synergy DBL):
xcall csub(%cfunc1, %cfunc2(%cfunc3))
Example using the Synergy DBL C interface
The example below illustrates the following:
- A user-supplied C subroutine called from a Synergy program
- A Synergy DBL subroutine called from a user-supplied C subroutine
;
; Calculate x to the yth power through the use of the system-supplied
; subroutine pow() in the C routine pwrrti.c.
;
.define TTCHN ,1
record
input ,a30
xval ,d10
yval ,d10
result ,d10
rlen ,d2
proc
open(TTCHN, o, "tt:")
repeat
begin
display(TTCHN, "x: ")
reads(TTCHN, input) [eof=done]
xval = input
display(TTCHN, "y: ")
reads(TTCHN, input) [eof=done]
yval = input
xcall power(result, xval, yval)
input = result [left:rlen]
writes(TTCHN, "(DBL) result: " + input(1:rlen))
end
done,
end
subroutine sub1
a_result ,n
proc
writes(TTCHN, "(C) result: " + %string(a_result))
return
endsubroutine
/* ---------------------------------------------------------------------
*
* Routine: XCALL POWER(RESULT, IVAL, POWR)
*
* Description: Calculate X to the nth power, display the result
* with a Synergy program, and return the result to
* the calling routine.
*
* Arguments: RESULT, D; the result with size defined in the
* Synergy program limited to D10
*
* IVAL, D; Decimal value X
* POWR, D; Power value n
*
* Requirements: Unix - link with -lm (math library)
*
* Notes:
*
* To identify this routine, like .IDENT, declare a variable
* in the form:
*
* static char *var = "@(#)ident";
*
* The runtime executable will contain the ident string and can
* be seen with the "what" command (e.g., what $DBLDIR/bin/dbr).
*
* ------------------------------------------------------------------ */
#include <math.h>
#include "xcall.h"
#define WROARG 6
static char *what = "@(#)POWER V2.0 (C-interface)";
extern double pow();
void
power(argblk)
DESCRIP **argblk;
{
double num1, num2, result;
SEGENTRY *segp; /* SEGENTRY & DESC are
DESCRIP *exec_argblk[2]; * defined in xcall.h */
DESCRIP r_descr;
if ((long)argblk[0] != 3) /* Expecting 3 args */
dblerror(WROARG);
num1 = get_xarg_fval(argblk, 2); /* Get the x and n */
num2 = get_xarg_fval(argblk, 3); /* arguments */
result = pow(num1, num2); /* Call pow function */
put_xarg_fval(argblk, 1, result); /* Load return val */
/* Set up a pointer to our return argument pairs to Synergy sub1 */
exec_argblk[0] = (DESCRIP *)1; /* Define one argument */
exec_argblk[1] = get_xarg(argblk, 1, &r_descr);
dbl_exec(get_seg_ptr("SUB1"), exec_argblk); /* Call Synergy subroutine */
return;
}
