From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=AWL,SPF_FAIL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id 12751BC6B for ; Wed, 28 Mar 2007 14:25:53 +0200 (CEST) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by concorde.inria.fr (8.13.6/8.13.6) with SMTP id l2SCPqSg030421 for ; Wed, 28 Mar 2007 14:25:52 +0200 Received: (qmail invoked by alias); 28 Mar 2007 12:25:52 -0000 Received: from p54A32E22.dip0.t-ipconnect.de (EHLO hmmm.de) [84.163.46.34] by mail.gmx.net (mp043) with SMTP; 28 Mar 2007 14:25:52 +0200 X-Authenticated: #20477425 X-Provags-ID: V01U2FsdGVkX1+JGdsC7/CJFRfgqi1bMCp5X3Yh54xALX+Hg9+Pfq oJXWv114LbVreV Date: Wed, 28 Mar 2007 14:25:50 +0200 From: micha To: caml-list@yquem.inria.fr Subject: Re: [Caml-list] Wrapping OCaml function returning a variant Message-ID: <20070328142550.72f2f3a6@hmmm.de> In-Reply-To: References: X-Mailer: Sylpheed-Claws 2.6.0 (GTK+ 2.8.20; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-Miltered: at concorde with ID 460A5ED0.001 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; ocaml:01 ocaml:01 val:01 val:01 variants:01 polymorphic:01 char:01 char:01 caml-list:01 int:01 int:01 variant:02 variant:02 output:02 string:02 Am Wed, 28 Mar 2007 12:33:46 +0100 schrieb Joel Reymont : > Is there an example of returning a variant from OCaml into C > somewhere? > > It's a regular variant, declared like this > > type morpher_output = > | Success of string > | Error of string * int * int * int > the labels are numbered starting from zero, so in c have have to decode two possible values : let a= Success("xxx") ... is in C a block with tag 0 and size 1, to get the string write: char* s = String_val(Field(a,0)) for the case let b = Error("e",1,2,3) ... you have a block with tag 1 and size 4: to get the values you write: char* err=String_val(Field(b,0)); int n1= Int_val(Field(b,1)); ... int n3= Int_val(Field(b,3)); hope that helps... Michael ps: polymorphic variants are handled different...