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]> 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.

