From: "NASSOR Eric" <nassor@crf.canon.fr>
To: Dmitry Bely <dbely@mail.ru>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] camlidl and pointer to function
Date: Wed, 14 Nov 2001 10:52:36 +0100 [thread overview]
Message-ID: <3BF23EE4.BB444C5C@crf.canon.fr> (raw)
In-Reply-To: <m3k7wu36so.fsf@mail.ru>
[-- Attachment #1: Type: text/plain, Size: 2702 bytes --]
Dmitry Bely wrote:
> I have a C library function with interface like following:
>
> typedef [abstract] void* SomeType;
> typedef int (*CallBack)(int);
> void convert( SomeType* in, SomeType* out, CallBack c);
>
> It would be nice to use it in caml the following way:
>
> external convert: someType->someType->(int->int)->unit = "something"
> ...
> convert stIn stOut ((+) 1)
> ...
>
> Unfortinately CamIDL language does not allow the pointer to function as a
> valid type, but maybe there is some common solution/workaround for this
> problem? Or the only way is writing necessary stubs and conversion
> functions by hands? Is is possible at all?
>
It is possible to call back caml code from a C code which was called from caml, but
you need to write a few lines of code.
here is an example extracted from my application (with a few simplifications).
the resulting caml function iter_tree can be called recursively, it can also raise
exceptions.
Another possible solution was proposed in a previous mail by Thierry Bravier, if
you want to use C++
http://caml.inria.fr/bin/wilma_hiliter/caml-list/199704/msg00029.html
Eric Nassor
-------------------------------------------------------------
in the original C library
typedef tree (*walk_tree_fn) (tree *, void *);
/* walk_tree iters on the tree data structure
and calls the function func with the current tree value and the data
*/
tree walk_tree (tree *tp, walk_tree_fn func, void *data)
-------------------------------------------------------------
in C_to_ml interface
/*
* intermediary function called by walk_tree
* it calls the caml callback function which is given as argument
*/
static tree iter_tree_func(tree * t,void * fun)
{
CAMLparam0();
CAMLlocal1(tr);
/* if you want to stress the memory system */
/* Garbage_collection_function() ;*/
tr = camlidl_c2ml_type_tree(t,NULL);
callback(*(value *)fun, tr);
CAMLreturn(NULL_TREE); /* caml exceptions are used if needed instead of return
values */
}
/*
* function to apply walk_tree to a CAML function
*/
value iter_tree (value v_function, value v_tree)
{
CAMLparam2(v_tree, v_function);
tree t ;
camlidl_ml2c_type_tree(v_tree,&t,NULL);
/* v_function is protected but its value may change because of the gc
so we have to take the address */
walk_tree(&t, iter_tree_func, &v_function);
CAMLreturn (Val_unit);
}
camlidl_ml2c_type_tree and camlidl_c2ml_type_tree are generated by camlidl to
translate tree between C and caml
-------------------------------------------------------------
in the caml code
external iter_tree : (tree -> unit) -> tree -> unit = "iter_tree"
-------------------------------------------------------------
[-- Attachment #2: Card for Eric Nassor --]
[-- Type: text/x-vcard, Size: 356 bytes --]
begin:vcard
n:Nassor;Eric
tel;fax:+33 (0)2.99.84.11.30
tel;work:+33 (0)2 99 87 68 31
x-mozilla-html:FALSE
url:http://www.crf.canon.fr
org:Canon Research Centre France;Digital Design Department
version:2.1
email;internet:nassor@crf.canon.fr
adr;quoted-printable:;;Rue de la Touche Lambert=0D=0A;CESSON-SEVIGNE ;;35517 Cedex;France
fn:Eric Nassor
end:vcard
next prev parent reply other threads:[~2001-11-14 9:52 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-11-13 17:43 Dmitry Bely
2001-11-14 9:52 ` NASSOR Eric [this message]
2001-11-14 12:16 ` Dmitry Bely
[not found] ` <9stni6$hh6$1@qrnik.zagroda>
2001-11-14 14:56 ` Marcin 'Qrczak' Kowalczyk
2001-11-14 16:02 ` Dmitry Bely
2001-11-14 20:21 ` Dmitry Bely
2001-11-14 20:43 Krishnaswami, Neel
2001-11-15 8:23 ` Dmitry Bely
[not found] <9sul5k$ga4$1@qrnik.zagroda>
2001-11-14 21:24 ` Marcin 'Qrczak' Kowalczyk
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=3BF23EE4.BB444C5C@crf.canon.fr \
--to=nassor@crf.canon.fr \
--cc=caml-list@inria.fr \
--cc=dbely@mail.ru \
/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