I didn't know before I tried it either. It occurred to me as a candidate
because I've seen many warnings about conflating ordinary pointers and
function pointers (although usually the warning is that they are not
guaranteed to have the same size). I only discovered that note in the
docs afterwards.
Ryan
On 08/27/2018 03:08 PM, Philip McGrath wrote:
Thanks for the very quick reply—using `_fpointer` seems to work for me,
too. I don't think I'd noticed it in the docs before, though, even if I
had, I don't think it would have been obvious to me that it was the
solution to this problem.
-Philip
On Mon, Aug 27, 2018 at 8:03 AM Ryan Culpepper <[email protected]
<mailto:[email protected]>> wrote:
On 08/27/2018 02:13 PM, Philip McGrath wrote:
> I am hoping for some help debugging a problem I'm having writing FFI
> bindings for libxml2.
>
> I am trying to use the function `xmlValidateDtd`, which
(predictably)
> validates an XML document against a DTD. To support error
reporting, the
> first argument to the function is a pointer to an `xmlValidCtxt`
struct
> (documented at
http://xmlsoft.org/html/libxml-valid.html#xmlValidCtxt,
> though note that the last two fields are listed twice because
whatever
> extracted the docs didn't understand a processor directive). My
wrapper
> code needs to allocate the `xmlValidCtxt` (via
`xmlNewValidCtxt`), set
> the first field to a `FILE*` for writing obtained via `fopen`,
set the
> second and third fields to pointers to `fprintf`, and then call
> `xmlValidateDtd` with the instance. I have a little function in C
that
> does this work:
> https://github.com/LiberalArtist/libxml2-ffi/blob/master/myvalidate.c
>
> Of course, I want to write this in Racket, not C, but my attempt
to do
> this via the FFI
>
(https://github.com/LiberalArtist/libxml2-ffi/blob/master/segfault.rkt)
> causes a segfault. The problem is something in the way I'm
initializing
> the `xmlValidCtxt` struct. If I run my Racket version with a valid
> document, so that the error reporting isn't used, it works just
fine.
> Likewise, if I don't initialize the first three fields of the
> `xmlValidCtxt` struct, instead leaving them as null pointers, the
> default error behavior (writing to standard error) works, though it
> isn't useful for my purposes. The segfault only happens if I
initialize
> the fields as described and a validation error actually tries to
use the
> fields.
>
> I've also confirmed that my C version works. If I compile it to a
shared
> library and load it with the FFI, it works just as desired with both
> valid and invalid documents:
>
https://github.com/LiberalArtist/libxml2-ffi/blob/master/use-my-so.rkt
>
> I don't see anything different between my attempt to initialize the
> `xmlValidCtxt` struct from Racket and the way I'm doing it in C, but
> obviously there is some difference. Any debugging suggestions
would be
> appreciated.
It works for me if I change the definition of `_fprintf-ptr` to this:
(define _fprintf-ptr _fpointer)
The docs say that compared to `_pointer`, `_fpointer` skips a level of
indirection on symbol lookups. (This also might explain a problem I had
in the past getting the right value for a symbol whose value is an
array
of pointers to structs. IIRC, I got the pointer to the first struct
instead.)
Ryan
--
You received this message because you are subscribed to the Google Groups "Racket
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.