caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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

  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;
as well as URLs for NNTP newsgroup(s).