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.

Reply via email to