comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: How to bind this properly, C ** which is an array
Date: Fri, 1 Mar 2019 15:02:48 +0100
Date: 2019-03-01T15:02:48+01:00	[thread overview]
Message-ID: <q5be27$1d8u$1@gioia.aioe.org> (raw)
In-Reply-To: 1bb2318a-eb48-450f-908d-a304b92bd74c@googlegroups.com

On 2019-03-01 14:48, Lucretia wrote:
> Hi,
> 
> I'm trying to bind the following struct:
> 
> typedef struct mpc_ast_t {
>    char *tag;
>    char *contents;
>    mpc_state_t state;
>    int children_num;
>    struct mpc_ast_t** children;
> } mpc_ast_t;
> 
> I have this:
> 
>     type ASTs is
>     record
>        Tag                : C.Strings.chars_ptr;
>        Contents           : C.Strings.chars_ptr;
>        State              : States;
>        Number_Of_Children : C.int;
>        Children           : System.Address; --  Pointer to a pointer to an array of ASTs.
>     end record with
>       Convention => C;
> 
> Children needs to be accessed in code as a pointer to a pointer to an array of ASTs.
> 
> How do I best bind this thing? It's likely going to have to be converted from Address to a particular type using Unchecked_Conversion most likely.

I think you could do it without Unchecked_Conversion:

    -- Forward declaration
    type ASTs;
    type ASTs_Ptr is access all ASTs;
    pragma Convention (C, ASTs_Ptr);

    -- Flat array of pointers without bounds
    type ASTs_Ptr_Array is array (size_t) of ASTs_Ptr;
    pragma Convention (C, ASTs_Ptr_Array);
    type ASTs_Ptr_Array_Ptr is access all ASTs_Ptr_Array;
    pragma Convention (C, ASTs_Ptr_Array_Ptr);

    -- Now the type
    type ASTs is record
       Tag                : C.Strings.chars_ptr;
       Contents           : C.Strings.chars_ptr;
       State              : States;
       Number_Of_Children : C.int;
       Children           : ASTs_Ptr_Array_Ptr;
    end record;
    pragma Convention (C, ASTs);

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de


  parent reply	other threads:[~2019-03-01 14:02 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-01 13:48 How to bind this properly, C ** which is an array Lucretia
2019-03-01 13:54 ` Björn Lundin
2019-03-01 13:59   ` Lucretia
2019-03-01 14:02 ` Dmitry A. Kazakov [this message]
2019-03-01 14:20   ` Lucretia
2019-03-01 19:57 ` Per Sandberg
2019-03-01 20:25   ` Lucretia
2019-03-01 22:02     ` Per Sandberg
2019-03-01 23:42       ` Lucretia
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox