From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,6a614d58fc5237e8 X-Google-Attributes: gid103376,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news2.google.com!news1.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local01.nntp.dca.giganews.com!nntp.comcast.com!news.comcast.com.POSTED!not-for-mail NNTP-Posting-Date: Tue, 12 Jun 2007 18:15:03 -0500 Date: Tue, 12 Jun 2007 18:36:16 -0400 From: Jeffrey Creem User-Agent: Thunderbird 2.0.0.0 (Windows/20070326) MIME-Version: 1.0 Newsgroups: comp.lang.ada Subject: Re: Interfacing to C: API with structures but without binary layout References: <1181678983.377288.225770@d30g2000prg.googlegroups.com> In-Reply-To: <1181678983.377288.225770@d30g2000prg.googlegroups.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Message-ID: <0oj3k4-ke5.ln1@newserver.thecreems.com> NNTP-Posting-Host: 24.147.74.171 X-Trace: sv3-rAZeDwoyy5/pWo83DmvTRBdS2m5FLYGFH/MK1PJCydqC34UMYORhIxbCWjDQslOdCpjXlBpcaYOQV0C!2nWdGNvI3vPXdGaDqsM4nMkOLUR6REpXbX4XMUWmL71WPJGDeHLvbEWmF5fmEP8QtcdVOWpdCa8l!kaJafsQUxKIMCBCTbDqG6A== X-Complaints-To: abuse@comcast.net X-DMCA-Complaints-To: dmca@comcast.net X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly X-Postfilter: 1.3.34 Xref: g2news1.google.com comp.lang.ada:16175 Date: 2007-06-12T18:36:16-04:00 List-Id: Maciej Sobczak wrote: > Another problem with interfacing: consider a C function that expects > some data structure that is defined in terms of C struct definition, > but without clear binary layout. > A motivating example might be the connect(2) system call, which > expects the sockaddr address structure. The only thing we know (by the > standard) about this structure is that it contains *at least* some > given fields. Depending on the actual system, however, it might > contain some more fields for implementation-defined reasons, or they > might be in different order, etc. > > Now, in order to call such a function we need access to the > appropriate header file, where the actual structure definition is > provided. But Ada doesn't understand C headers and pragma Import(C, > connect) will not be enough. > > A straightforward solution is to create a thin wrapper (in C) for the > given function that will expect parameters in well-defined form and > layout and just forward them to the interesting system call. This > wrapper will have to be compiled separately on each target system, > picking the actual structure definition from the appropriate system > header. Ada can then call the wrapper function. > > Is this THE solution? > > -- > Maciej Sobczak > http://www.msobczak.com/ > There are a few possibilities. 1) Define the Ada records to match what you expect and hope for the best (not great but fine in some cases) 2) Create the wrappers that you have suggested (I've used this in some cases) 3) Use an automated bindings generator for some of the thin stuff and create the bindings during the ./configure step. This is certainly what some other languages do in some cases (e.g. Python). SWIG is a tool that can in theory be used in this cases. The current official sources do not support Ada but the maintains have indicated they will accept patches when they are ready. In the mean time, there is a branch being worked within the gnuada project SVN structure on sourceforge. If you have a large library you want to bind to, contributing to SWIG may be an overall cost neutral approach and be helpful in the long term. Having said that, many C libraries have gotten so cluttered with defines and decl specs and exports of various flavors that I suspect that some libraries will forever resist effective automated binding generation. 4) Something else similar. Specifically, GtkAda has a perl script that is semi-specific to Gtk that helps in the creation of bindings. It is sort of a middle ground and is an effective approach in some special cases.