From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by yquem.inria.fr (Postfix) with ESMTP id 8A265BC37 for ; Thu, 29 Oct 2009 22:37:16 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtgBANun6UpKfU4ZkGdsb2JhbACRZ4kkPwEBAQEJCQwHEwOzIYE5hjuIaAEDAwWEOAQ X-IronPort-AV: E=Sophos;i="4.44,648,1249250400"; d="scan'208";a="35842633" Received: from ey-out-2122.google.com ([74.125.78.25]) by mail2-smtp-roc.national.inria.fr with ESMTP; 29 Oct 2009 22:37:16 +0100 Received: by ey-out-2122.google.com with SMTP id 22so519456eye.31 for ; Thu, 29 Oct 2009 14:37:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:content-type; bh=BsgY5CmMwGq02zcGbxaOXGsoLVeiyrg3Ny7keB5PX38=; b=M/ZItKhbzm9gnq6a0FwPIpVvnEXKGN53ykb3DkMQN5JCTyle7X67Fuu3jiJ0+3gveA SouJjN0cwpKcQrYBhrCYUAcLDh41x7gVOG6veEJADgKOOMyM64S3BvS3aVOt2ez8L1+f bih5FWl9rMEht8Wvkeh49IO+g0z6fTotRKgPQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=xwR6rldx8XGixaqMnr2QRR5FmUFCoeDHwBp5FLOepa5fOqgqTIpYIEHW8VpOITzw4b tnfdesYXcDBNjPmQqv0llkG1+ZwFJYKZ/GCMgWdwKiX3EMn+72JV6teXjSU08d0IDp2F AM/dlxdN0VlAhXgWI2+vvC5N6UJmOi+I4Fls8= MIME-Version: 1.0 Received: by 10.211.142.18 with SMTP id u18mr3226581ebn.88.1256852235808; Thu, 29 Oct 2009 14:37:15 -0700 (PDT) In-Reply-To: <877huewpdc.fsf@frosties.localdomain> References: <666572260910281507q74cb1c1at157c9e3c86070c69@mail.gmail.com> <4AE8C987.8020100@starynkevitch.net> <877huewpdc.fsf@frosties.localdomain> Date: Thu, 29 Oct 2009 22:37:15 +0100 Message-ID: <666572260910291437w38283b27s1244f39f68a86b3e@mail.gmail.com> Subject: Re: [Caml-list] Binding C libraries which use variable arguments (stdarg.h) From: Adrien To: Caml Mailing List Content-Type: text/plain; charset=ISO-8859-1 X-Spam: no; 0.00; basile:01 basile:01 foo:01 stub:01 foo:01 ocaml:01 failwith:01 ocaml:01 variants:01 varargs:01 weis:01 printf:01 stub:01 bytecode:01 invoke:01 On 29/10/2009, Goswin von Brederlow wrote: > Basile STARYNKEVITCH 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