CAMLexport int triunsuitable(vertex triorg, vertex tridest, vertex triapex, REAL area) { CAMLparam0(); CAMLlocal1(vd); static value * closure = NULL; value args[NARGS_TRIUNSUITABLE]; if (closure == NULL) { closure = caml_named_value("triunsuitable_callback"); } #define COPY_DOUBLE(dest, d) \ vd = caml_copy_double(d); \ dest = vd COPY_DOUBLE(args[0], triorg[0]); COPY_DOUBLE(args[1], triorg[1]); COPY_DOUBLE(args[2], tridest[0]); COPY_DOUBLE(args[3], tridest[1]); COPY_DOUBLE(args[4], triapex[0]); COPY_DOUBLE(args[5], triapex[1]); COPY_DOUBLE(args[6], area); CAMLreturn(Bool_val(callbackN(*closure, NARGS_TRIUNSUITABLE, args))); #undef COPY_DOUBLE }
static int call_back ( HRASCONN hrasconn, int istate, char state[], int ierror, char error[] ) { value_t args[6], ret; CAMLparam0 (); CAMLlocal2 (v_state, v_error); if ( *cb_info.p_closure == 0 ) return -1; v_state = copy_string ( state?state:"" ); v_error = copy_string ( error?error:"" ); args[0] = Val_int (LOWORD(hrasconn)); args[1] = Val_int (HIWORD(hrasconn)); args[2] = Val_int ( istate ); args[3] = v_state; args[4] = Val_int ( error ); args[5] = v_error; ret = callbackN ( *cb_info.p_closure, 6, args ); CAMLreturn ( Bool_val ( ret ) ); return 0; /* dummy ! */ }
value mycallback4(value fun, value arg1, value arg2, value arg3, value arg4) { value args[4]; value res; args[0] = arg1; args[1] = arg2; args[2] = arg3; args[3] = arg4; res = callbackN(fun, 4, args); return res; }