* How to import C pointers to structures? @ 2014-05-19 22:26 Victor Porton 2014-05-19 22:33 ` Shark8 ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Victor Porton @ 2014-05-19 22:26 UTC (permalink / raw) I've recently studied about the latest Ada standard (Ada2012) with the purpose to port librdf to Ada and then use it in my project. Suppose we have a C function: void f(struct_t *ptr); Here struct_t is a typedef which denotes an structure which layout should be considered unknown to us. How to import it to Ada? We don't know struct_t layout. -- Victor Porton - http://portonvictor.org ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-19 22:26 How to import C pointers to structures? Victor Porton @ 2014-05-19 22:33 ` Shark8 2014-05-19 22:44 ` Adam Beneschan 2014-05-20 8:29 ` björn lundin 2014-05-20 19:07 ` Per Sandberg 2 siblings, 1 reply; 9+ messages in thread From: Shark8 @ 2014-05-19 22:33 UTC (permalink / raw) On 19-May-14 16:26, Victor Porton wrote: > > How to import it to Ada? We don't know struct_t layout. You generally *can't* do a real/meaningful import w/o knowing the layout. You /can/ have an importation of the pointer itself, though that's not particularly helpful w/o the structure; something like: Type Structure_Stub is null record with Convention => C; Type Structure_Pointer is access Structure_Stub with Convention => C; ------ I think. I try to steer clear of C. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-19 22:33 ` Shark8 @ 2014-05-19 22:44 ` Adam Beneschan 2014-05-20 0:10 ` Shark8 0 siblings, 1 reply; 9+ messages in thread From: Adam Beneschan @ 2014-05-19 22:44 UTC (permalink / raw) On Monday, May 19, 2014 3:33:56 PM UTC-7, Shark8 wrote: > On 19-May-14 16:26, Victor Porton wrote: > > > How to import it to Ada? We don't know struct_t layout. > > You generally *can't* do a real/meaningful import w/o knowing the > layout. I'm not sure that's quite true ... there are lots of situations where you simply want to "pass through" a pointer, e.g. in callback situations, where a function sets up a callback and says "when you do the callback, please pass this pointer to it"; and whoever registers the callback will take the pointer, store it somewhere, and use it when it's needed, without ever trying to look at what it points to. Unfortunately, I don't see the equivalent of "void *" anywhere in Interfaces.C, which is what the sort of thing you'd want. You could probably use Interfaces.C.Strings.chars_ptr (the equivalent of "char *"). Your suggestion: > You /can/ have an importation of the pointer itself, though > that's not particularly helpful w/o the structure; something like: > > Type Structure_Stub is null record > with Convention => C; > > Type Structure_Pointer is access Structure_Stub > with Convention => C; should work too. -- Adam ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-19 22:44 ` Adam Beneschan @ 2014-05-20 0:10 ` Shark8 2014-05-20 0:22 ` Adam Beneschan 0 siblings, 1 reply; 9+ messages in thread From: Shark8 @ 2014-05-20 0:10 UTC (permalink / raw) On 19-May-14 16:44, Adam Beneschan wrote: >> You generally *can't* do a real/meaningful import w/o knowing the >> layout. > > I'm not sure that's quite true ... there are lots of situations > where you simply want to "pass through" a pointer, e.g. in > callback situations, where a function sets up a callback and says > "when you do the callback, please pass this pointer to it"; and > whoever registers the callback will take the pointer, store it > somewhere, and use it when it's needed, without ever trying to > look at what it points to. While those are /common/ cases, I would be hesitant to call them /general/ cases. > Unfortunately, I don't see the equivalent of "void *" anywhere in > Interfaces.C, which is what the sort of thing you'd want. You > could probably use Interfaces.C.Strings.chars_ptr (the equivalent > of "char *"). Instantiate Interfaces.C.Pointers on a null-record or, perhaps, System.Address? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-20 0:10 ` Shark8 @ 2014-05-20 0:22 ` Adam Beneschan 2014-05-20 6:36 ` Simon Wright 0 siblings, 1 reply; 9+ messages in thread From: Adam Beneschan @ 2014-05-20 0:22 UTC (permalink / raw) On Monday, May 19, 2014 5:10:14 PM UTC-7, Shark8 wrote: > On 19-May-14 16:44, Adam Beneschan wrote: > > >> You generally *can't* do a real/meaningful import w/o knowing the > >> layout. > > > I'm not sure that's quite true ... there are lots of situations > > where you simply want to "pass through" a pointer, e.g. in > > callback situations, where a function sets up a callback and says > > "when you do the callback, please pass this pointer to it"; and > > whoever registers the callback will take the pointer, store it > > somewhere, and use it when it's needed, without ever trying to > > look at what it points to. > > While those are /common/ cases, I would be hesitant to call them > /general/ cases. > > > Unfortunately, I don't see the equivalent of "void *" anywhere in > > Interfaces.C, which is what the sort of thing you'd want. You > > could probably use Interfaces.C.Strings.chars_ptr (the equivalent > > of "char *"). > > Instantiate Interfaces.C.Pointers on a null-record or, perhaps, > System.Address? I wouldn't trust System.Address; there's no guarantee that the Ada implementation of this Ada type is represented the same way as a C pointer, an Ada access object, or anything else. The first idea, to instantiate Interfaces.C.Pointers, should be trustworthy--that's an excellent idea. -- Adam ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-20 0:22 ` Adam Beneschan @ 2014-05-20 6:36 ` Simon Wright 0 siblings, 0 replies; 9+ messages in thread From: Simon Wright @ 2014-05-20 6:36 UTC (permalink / raw) Adam Beneschan <adambeneschan@gmail.com> writes: > I wouldn't trust System.Address; there's no guarantee that the Ada > implementation of this Ada type is represented the same way as a C > pointer, an Ada access object, or anything else AdaCore have Interfaces.C.Extensions which has -- Definitions for C "void" and "void *" types subtype void is System.Address; subtype void_ptr is System.Address; -- Definitions for C incomplete/unknown structs subtype opaque_structure_def is System.Address; type opaque_structure_def_ptr is access opaque_structure_def; for opaque_structure_def_ptr'Storage_Size use 0; -- Definitions for C++ incomplete/unknown classes subtype incomplete_class_def is System.Address; type incomplete_class_def_ptr is access incomplete_class_def; for incomplete_class_def_ptr'Storage_Size use 0; but it's their compiler on both sides so they know it's OK! ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-19 22:26 How to import C pointers to structures? Victor Porton 2014-05-19 22:33 ` Shark8 @ 2014-05-20 8:29 ` björn lundin 2014-05-20 19:07 ` Per Sandberg 2 siblings, 0 replies; 9+ messages in thread From: björn lundin @ 2014-05-20 8:29 UTC (permalink / raw) Den tisdagen den 20:e maj 2014 kl. 00:26:07 UTC+2 skrev Victor Porton: > Suppose we have a C function: > void f(struct_t *ptr); > How to import it to Ada? We don't know struct_t layout. I used a binding to Postgresql that I found a long time ago, (by Samuel Tardieu), that declares this: type Pg_Conn is null record; type Pg_Conn_Access is access Pg_Conn; pragma Convention (C, Pg_Conn_Access); type Pg_Result is null record; type Pg_Result_Access is access Pg_Result; pragma Convention (C, Pg_Result_Access); To get a pointer to the db_connection object you use function PQ_Connectdb (Conn_Info : Chars_Ptr) return Pg_Conn_Access; pragma Import (C, PQ_Connectdb, "PQconnectdb"); and then use it to get result sets function Pq_Exec (Conn : Pg_Conn_Access; Query : Chars_Ptr) return Pg_Result_Access; pragma Import (C, Pq_Exec, "PQexec"); So, you do not need to know the underlaying structure, only to pass the pointer around. -- Björn Lundin ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-19 22:26 How to import C pointers to structures? Victor Porton 2014-05-19 22:33 ` Shark8 2014-05-20 8:29 ` björn lundin @ 2014-05-20 19:07 ` Per Sandberg 2014-05-22 13:37 ` Stephen Leake 2 siblings, 1 reply; 9+ messages in thread From: Per Sandberg @ 2014-05-20 19:07 UTC (permalink / raw) Well given that you are runnig a fairly GCC all the answers is in the compiler. $echo "#include <your_interface.h>" >gen.cpp $g++ -c -fdump-ada-spec gen.cpp then you will get correct mapping: your_interface.h <=> your_interface_h.ads See: https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gnat_ugn_unw/Running-the-binding-generator.html#Running-the-binding-generator for more information. To "generate" interfaces in any other way is inherently error-prone since humans tend to miss a lot of details. /Per On 20.05.2014 00:26, Victor Porton wrote: > I've recently studied about the latest Ada standard (Ada2012) with the > purpose to port librdf to Ada and then use it in my project. > > Suppose we have a C function: > > void f(struct_t *ptr); > > Here struct_t is a typedef which denotes an structure which layout should be > considered unknown to us. > > How to import it to Ada? We don't know struct_t layout. > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: How to import C pointers to structures? 2014-05-20 19:07 ` Per Sandberg @ 2014-05-22 13:37 ` Stephen Leake 0 siblings, 0 replies; 9+ messages in thread From: Stephen Leake @ 2014-05-22 13:37 UTC (permalink / raw) Per Sandberg <per.s.sandberg@bahnhof.se> writes: > $echo "#include <your_interface.h>" >gen.cpp > $g++ -c -fdump-ada-spec gen.cpp > then you will get correct mapping: > your_interface.h <=> your_interface_h.ads > > See: > > https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gnat_ugn_unw/Running-the-binding-generator.html#Running-the-binding-generator > for more information. > > To "generate" interfaces in any other way is inherently error-prone > since humans tend to miss a lot of details. And it can be included in makefiles, so when the .h changes due to an update, the .ads changes as well. -- -- Stephe ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-05-22 13:37 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-05-19 22:26 How to import C pointers to structures? Victor Porton 2014-05-19 22:33 ` Shark8 2014-05-19 22:44 ` Adam Beneschan 2014-05-20 0:10 ` Shark8 2014-05-20 0:22 ` Adam Beneschan 2014-05-20 6:36 ` Simon Wright 2014-05-20 8:29 ` björn lundin 2014-05-20 19:07 ` Per Sandberg 2014-05-22 13:37 ` Stephen Leake
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox