comp.lang.ada
 help / color / mirror / Atom feed
From: "Xenos" <dont.spam.me@spamhate.com>
Subject: Re: Importing C structs?
Date: Thu, 31 Jul 2003 14:17:09 -0400
Date: 2003-07-31T14:17:09-04:00	[thread overview]
Message-ID: <bgbmgb$rd71@cui1.lmms.lmco.com> (raw)
In-Reply-To: ddWVa.1313$Kx1.14581@newsfep4-glfd.server.ntli.net

We do this sort of think all the time.  Just create an Ada record that is
properly rep. spec'd according to the way your C compiler does its structs.
If the parameter is a pointer to a struct use either System.Address or an
access type.

Unfortunately, there is no portable way to do it.  But you usually don't run
into trouble unless your structs would have misaligned fields.  The compiler
avoids this by creating "holes."  Some C compilers give you limited control
of the packing, but again, its not portable.

Bit fields are nasty because the compiler defined which bit is 0.  For
example, our Ada compiler says that the MSB is 0, where as our C compiler
says that the LSB is, and both are for the same Big Endian machine.

Regards,

Rich

"chris" <spamoff.danx@ntlworld.com> wrote in message
news:ddWVa.1313$Kx1.14581@newsfep4-glfd.server.ntli.net...
> Freejack wrote:
> > I'm finally starting to get an idea(at least I think I am.) on handling
> > interfacing to C.
>
> Really?  I don't think I'll ever get the hang of it.
>
> > Specifically, would I cast DBTYPE as a seperate record type, and then
> > provide a seperate function to translate each item into the type
expected
> > by the C struct? Or can import the DBTYPE struct whole hog into my Ada
> > specification?
>
> Make an Ada record corresponding to that type.  Map it's fields to
> things from interfaces.c and other records.  Then use
>
> pragma Convention(C, DBType);
>
> I think!
>
> This is from my ongoing work on a libjpeg binding...
>
>     type Jpeg_Error_Mgr is record
>        Error_Exit          : Error_Exit_Handler;
>        Emit_Message        : Emit_Message_Handler;
>        Output_Message      : Output_Message_Handler;
>        Format_Message      : Format_Message_Handler;
>        Reset_Error_Mgr     : Reset_Error_Handler;
>        Msg_Code            : C.Int;
>        Msg_Parm            : System.Address;
>        Trace_Level         : C.Int;
>        Num_Warnings        : C.Long;
>        Jpeg_Message_Table  : Jpeg_Message_TableT;
>        Last_Jpeg_Message   : C.Int;
>        Addon_Message_Table : Jpeg_Message_TableT;
>        First_Addon_Message : C.Int;
>        Last_Addon_Message  : C.Int;
>     end record;
>
>     pragma Convention (C, Jpeg_Error_Mgr);
>
>
> HTH,
> Chris
>





  parent reply	other threads:[~2003-07-31 18:17 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-07-30 20:03 Importing C structs? Freejack
2003-07-30 20:52 ` chris
2003-07-30 21:26   ` Freejack
2003-07-30 23:50   ` tmoran
2003-07-31 10:53     ` chris
2003-08-04 14:33     ` Andreas Almroth
2003-08-04 15:16       ` Samuel Tardieu
2003-08-04 20:07         ` Randy Brukardt
2003-07-31 17:14   ` Warren W. Gay VE3WWG
2003-08-12  0:02     ` chris
2003-07-31 18:17   ` Xenos [this message]
2003-07-31 19:16     ` Simon Wright
2003-07-31 20:17       ` Samuel Tardieu
2003-07-31 20:40       ` Xenos
2003-07-30 23:14 ` Ching Bon Lam
2003-07-31  0:07   ` tmoran
2003-07-31  5:35   ` Matthew Heaney
2003-07-31  7:46     ` Freejack
2003-07-31  9:27       ` Martin Dowie
2003-07-31 21:41         ` Freejack
2003-08-01  7:39           ` Martin Dowie
2003-07-31 17:34       ` Matthew Heaney
2003-07-31 11:29     ` Ching Bon Lam
2003-07-31 16:59       ` Matthew Heaney
2003-07-31 17:32         ` Warren W. Gay VE3WWG
2003-07-31 17:13       ` Matthew Heaney
2003-07-31 17:40       ` Randy Brukardt
2003-07-31  5:21 ` Matthew Heaney
replies disabled

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