caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Dmitry Bely <dbely@mail.ru>
To: caml-list@inria.fr
Subject: Re: [Caml-list] CamlIDL documentation and COM issues
Date: Tue, 04 Jun 2002 21:23:04 +0400	[thread overview]
Message-ID: <8z5vq7pj.fsf@mail.ru> (raw)
In-Reply-To: <3CFCEAB6.5040204@hars.de> (Florian Hars's message of "Tue, 04 Jun 2002 18:28:38 +0200")

Florian Hars <florian@hars.de> writes:

> I am trying to write an interface to an existing C library and I
> intend to use CamlIDL for this task, but I am missing some more
> HOWTO-like documentation.
>
> The library uses a pattern that should be common enough to supported
> in CamlIDL (and explained in the hints on writing IDL files): there is
> a struct that is only of internal relavance, and there is an open and
> a close function that returns or frees a pointer to such a struct, and
> several functions that operate on such a handle:
>
> typedef struct { /* things */ } Foo;
> typedef Foo * FooHandle;
> FooHandle FooOpen(args...);
> int FooOperate(FooHandle fhdl, args...);
> void FooClose(FooHandle fhdl);
>
> Now all I need is a way to put this handle into a Caml variable (and,
> optionally, to call FooClose automatically whenever the handle runs
> out of scope). It looks like the [abstract] and [ptr] attributes,
> either alone or in combination, might be relevant for this task. But
> [ptr] requires the Com module, which I do not want to use. (OK, it is
> tiny under unix, but still...

It's easy:

[interface.idl]
quote(c,"#include <foo-native-definition.h>");
typedef [abstract,finalize(FooClose)] void* FooHandle;
FooHandle FooOpen(args...);
int FooOperate(FooHandle fhdl, args...);
void FooClose(FooHandle fhdl);

$camlidl -no-include interface.idl

FooClose() will be called automatically when Foo instance is
garbage-collected.

> what happens if I ever recompile the
> program under windoze? Shouldn't the generally useful features for
> interfacing to C/C++ and the COM-specific stuff be somehow separated,
> like in a module Idl and another module Com? This would certainly help
> to reduce the prevailing confusion over the possible uses of
> CamlIDL. Or is it irrelevant for my problem?)

Com module works under unix and windows (under Unix some COM stuff is
emulated), so there is no such problem.

> An example for the use of errorcheck(fn) and a remark on the type of
> fn in errorcheck might be helpful, too.

If you write IDL definition

typedef [errorcheck(checkFoo)] something Foo;

then checkFoo() should have C prototype

void check(Foo);

> Oh, and shouldn't the example on page 24 of the Manual (1.0.4) read
>
>   double time() quote(call, "_res=....; ");
>                       ^^^^^^
> Or is "call" implicit if no ident is given in a quote in a function
> definition?

Yes, "call" can be ommited:

[camlidl/compiler/parser_midl.mly]
...
opt_quotes:
    opt_quotes QUOTE LPAREN STRING RPAREN
        { ("call", $4) :: $1 }
  | opt_quotes QUOTE LPAREN ident COMMA STRING RPAREN
        { ($4, $6) :: $1 }
  | /* empty */
        { [] }
;

But you are right, this doesn't seem to be documented in the manual. Ask
Xavier Leroy for the correction.

Hope to hear from you soon,
Dmitry


-------------------
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


  reply	other threads:[~2002-06-04 17:25 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-06-04 16:28 Florian Hars
2002-06-04 17:23 ` Dmitry Bely [this message]
2002-06-07 13:46   ` Florian Hars
2002-06-08 19:16     ` Dmitry Bely

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