From: Dmitry Bely <dbely@mail.ru>
To: caml-list@inria.fr
Subject: Re: [Caml-list] CamlIDL and function pointers
Date: Tue, 23 Jul 2002 17:11:33 +0400 [thread overview]
Message-ID: <ptxelhbu.fsf@mail.ru> (raw)
In-Reply-To: <20020723103916.B30947@pauillac.inria.fr> (Xavier Leroy's message of "Tue, 23 Jul 2002 10:39:16 +0200")
Xavier Leroy <xavier.leroy@inria.fr> writes:
>> How would one annotate the following C struct for camlidl:
>>
>> typedef struct funp {
>> int i;
>> void (*funp_fun) ();
>> } funp_t;
>>
>> Is it possible? Looking at the specs I don't see how one can have a
>> field that is a pointer to a function. Any ideas, or pointers (no pun
>> intended) to examples?
>
> CamlIDL, like the DCE and Microsoft IDL from which it derives, doesn't
> support exchanging function pointers between C and Caml. Your best
> bet is to declare funp_t as an abstract type in the IDL file:
>
> typedef [abstract] struct funp * funp_t;
I was able to make a normal C function pointer form Ocaml closure using the
"trampoline" technique and ffcall library from
http://clisp.cons.org/~haible/packages-ffcall.html
Here is the working example from my HighGUI binding (a library from OpenCV
distribution):
Original C definition:
void (*HG_on_notify)(int);
int cvvCreateTrackbar( const char* name, const char* window_name,
int* value, int count, HG_on_notify on_notify );
My IDL definition:
typedef [abstract,mltype("int->unit")] void* ON_NOTIFY; // void (*ON_NOTIFY)(int)
quote(c,"\
#include <callback.h> \n\
static int _slider_val; \n\
static void _ON_NOTIFY (void* cback, va_alist alist) \n\
{ \n\
int handle; \n\
va_start_void(alist); \n\
handle = va_arg_int(alist); \n\
callback(*(value*)cback,Val_int(_slider_val)); \n\
va_return_void(alist); \n\
}")
int cvvCreateTrackbar([string] const char* trackbar_name, [string] const char* window_name,
[ref,in] int* val, int count, ON_NOTIFY call_back)
quote(call,"\
{ \n\
value* p_call_back; \n\
__TR_function cback; \n\
p_call_back = stat_alloc(sizeof(value)); \n\
*p_call_back = _v_call_back; \n\
register_global_root(p_call_back); /*both caml and C closure will live forever */ \n\
cback = alloc_callback(_ON_NOTIFY, p_call_back); \n\
_slider_val = *val; \n\
_res = cvvCreateTrackbar(trackbar_name,window_name,&_slider_val,count,cback); \n\
}");
Now you can pass the normal OCaml closure to C function:
let f_sl1 x = print_string "slider 1:"; print_int x; print_newline ();;
cvvCreateTrackbar "sl1" "test_window" 5 10 f_sl1;;
- Dmitry Bely
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2002-07-23 13:15 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-15 21:22 [Caml-list] Caml productivity Pal-Kristian Engstad
2002-07-20 15:16 ` William Chesters
2002-07-22 18:22 ` Pal-Kristian Engstad
2002-07-22 18:41 ` achrist
2002-07-22 19:23 ` Pal-Kristian Engstad
2002-07-22 21:13 ` [Caml-list] CamlIDL and function pointers Michael Tucker
2002-07-23 8:39 ` Xavier Leroy
2002-07-23 13:11 ` Dmitry Bely [this message]
2002-07-24 15:00 ` Michael Tucker
2002-07-25 9:36 ` Xavier Leroy
2002-07-22 21:26 ` Games (Re: [Caml-list] Caml productivity.) Oleg
2002-07-23 2:56 ` Issac Trotts
2002-07-23 11:03 ` eijiro_sumii
2002-07-23 16:17 ` Charles Martin
2002-07-29 3:36 ` Andrei de A. Formiga
2002-07-29 6:32 ` Florian Hars
2002-07-29 10:23 ` eijiro_sumii
[not found] ` <001901c237a7$9e685920$890bfea9@mimbi>
2002-07-30 4:52 ` eijiro_sumii
2002-07-30 18:13 ` Jonathan Coupe
2002-07-30 6:16 ` eijiro_sumii
2002-08-01 15:39 ` John Max Skaller
2002-08-01 15:59 ` Markus Mottl
2002-08-01 16:28 ` Jonathan Coupe
[not found] ` <86vg6ta9o6.fsf@laurelin.dementia.org>
2002-08-02 12:50 ` Jonathan Coupe
2002-08-02 14:51 ` John Max Skaller
2002-07-25 3:19 ` Chris Hecker
2002-07-28 13:45 ` Jonathan Coupe
2002-07-29 0:57 ` Michael Vanier
2002-07-22 22:00 ` [Caml-list] Caml productivity Alexander V.Voinov
2002-07-20 15:25 ` Oleg
2002-07-22 6:41 ` Tom
2002-07-22 10:46 ` Nicolas Cannasse
2002-07-22 17:46 ` Pal-Kristian Engstad
2002-07-24 3:20 ` Travis Bemann
2002-07-24 9:45 ` Pal-Kristian Engstad
2002-07-26 21:42 ` Chris Hecker
2002-07-27 4:41 ` Issac Trotts
2002-07-27 5:49 ` Chris Hecker
2002-07-27 14:49 ` John Max Skaller
2002-07-27 9:06 ` Oleg
2002-07-27 18:18 ` Chris Hecker
2002-07-29 8:13 ` Nicolas Cannasse
2002-07-30 4:46 ` Travis Bemann
2002-07-24 8:02 ` Nicolas Cannasse
2002-07-24 8:25 ` Jérôme Marant
2002-07-24 10:00 ` Pal-Kristian Engstad
2002-07-27 9:06 ` Oleg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ptxelhbu.fsf@mail.ru \
--to=dbely@mail.ru \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox