Browse thread
[Caml-list] Binding C libraries which use variable arguments (stdarg.h)
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2009-10-29 (21:37) |
From: | Adrien <camaradetux@g...> |
Subject: | Re: [Caml-list] Binding C libraries which use variable arguments (stdarg.h) |
On 29/10/2009, Goswin von Brederlow <goswin-v-b@web.de> wrote: > Basile STARYNKEVITCH <basile@starynkevitch.net> writes: > >> Adrien wrote: >>> Hi, >>> >>> I am currently trying to bind a C function that takes variables >>> arguments, like foo(int a, ...). I can't find how to make a C stub for >>> that function. >> >> I am assuming that the a is the number of actual arguments, so you call >> foo(3, x, y, z) >> foo(5, t, t+1, t+3, 0, 4) >> foo(0) >> >>> >>> Any other idea? Hint^WPointer? (sorry for the bad joke ;-) ) >> >> First, you could suppose that the a has a reasonable limit, say 100. >> >> Then you could generate the glue code for each value of the argument >> a. I mean generate ocaml code like >> >> external f0: void -> uit = "f_0" >> external f1: int -> unit = "f_1" >> external f2: int -> int -> unit = "f_2" >> external f3: int -> int -> int -> unit = "f_3" >> >> let f a = match Array.length a with >> 0 -> f0 () >> | 1 -> f1 a.[0] >> | 2 -> f2 a.[0] a.[1] >> | 3 -> f3 a.[0] a.[1] a.[2] >> .... >> | _ -> failwith "too many components for f" >> >> and generate C code for each of f_0 f_1 ... >> >> and call f with an array ... >> >> The specialized code generator is reasonably written in Ocaml >> >> There are more crazy variants, including >> >> try Ocaml varargs like Pierre Weis did in printf.ml. For plain mortals >> like me this is white magic. >> >> Assuming a Linux system, you could lazily generate the glue code and >> invoke dynamic linker on it. So the general case would be to call the >> code generator. >> >> Time to go to bed. I am saying lot of non-sense. >> >> Bye! > > Since ocaml functions with more than 5 args use an array you only do > that in ocaml for a few arguments and then you need to do this in > C. So do it in C for all. The stub takes an array and then switches on > the lentgh to call the real function. > > Unfortunately you can not convert an array or list into a va_list. You > need to specifically catch each length and call foo(4, a[0], a[1], > a[2], a[3]) for each length. Well, my problem is more when calling the C function since I can chose the interface of the caml functions. There's something I've not been sure and would like to ask however: for the sake of consitency, I've been giving both a native and bytecode function every time no matter the number of arguments. Could that be a problem? --- Adrien Nader