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.

-Philip

-- 
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 racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to