On Sun, Dec 10, 2017 at 07:22:55AM -0800, Matt Wette wrote: > > > On Dec 9, 2017, at 10:06 AM, pelzflorian (Florian Pelz) wrote: > > (define xerror-handler-struct > > (make-struct-po_xerror_handler)) ; TODO SET HANDLERS: > > ;; […] > > > > First of all, FFI helper + Guile can't deal with this pattern: using varargs function > members in structs. This would require things like `va_arg' in libffi and Guile. I > have posted a request on the libffi dev site. Your example also brought up some gaps > in the ffi helper. Thank you. I’m sorry to say that it did not work. Actually it is not the “struct po_error_handler” but the “struct po_xerror_handler” which I need. I believe the “struct po_error_handler” is not used anymore in current Gettext but I am not sure. varargs are not needed for “struct po_xerror_handler” (even though support for them is desirable in general). Hmm I tried mostly the same as you propose before for the xerror handler and it did not work: fh-object-set! apparently did not have any effect, i.e. a subsequent fh-object-ref returned 0 and on error the callback handler function was called at address 0, causing a SIGSEGV. Either way, I tried your code for “struct po_error_handler” and put it in my dot.ffi to see if it works. > I think I may have a workaround for you, though. Try to add code > like the following to your dot-ffi file. In functions calls that want a error handler > specified use std-po-error-handler. > > > (define-ffi-module (gettext-po) > #:include '("gettext-po.h") > #:library '("libgettextpo")) > > (define-public std-po-error-handler > (let* ((error > (lambda (status errnum format) > (simple-format #t "~A\n" (ffi:pointer->string format)))) > (error-p > (ffi:procedure->pointer ffi:void error (list ffi:int ffi:int '*))) > ;; > (error_at_line > (lambda (status errnum filename lineno format) > (simple-format #t "~A\n" (ffi:pointer->string format)))) > (error_at_line-p > (ffi:procedure->pointer ffi:void error_at_line > (list ffi:int ffi:int '* ffi:int '*))) > ;; > (multiline_warning > (lambda (prefix message) > (simple-format #t "~A ~A\n" > (ffi:pointer->string prefix) > (ffi:pointer->string message)))) > (multiline_warning-p > (ffi:procedure->pointer ffi:void multiline_warning (list '* '*))) > ;; > (multiline_error > (lambda (prefix message) > (simple-format #t "~A ~A\n" prefix message))) > (multiline_error-p > (ffi:procedure->pointer ffi:void multiline_error (list '* '*))) > ;; > (eh-struct (make-struct-po_error_handler))) > > (fh-object-set! eh-struct 'error error-p) I inserted an (display (fh-object-ref eh-struct 'error)) (newline) at this point at this point in the dot.ffi file. Then when I ran (use-modules (gettext-po)) from the REPL it printed 0, so presumably this does not work either. It seems like the same issue. > (fh-object-set! eh-struct 'error_at_line error_at_line-p) > (fh-object-set! eh-struct 'multiline_warning multiline_warning-p) > (fh-object-set! eh-struct 'multiline_error multiline_error-p) > ;; > (make-po_error_handler_t > (ffi:pointer-address > ((fht-unwrap struct-po_error_handler*) > (pointer-to eh-struct)))))) > By the way, what I forgot to mention is that I needed to replace #include in the gettext-po.h header file by typedef long size_t; otherwise “guild compile-ffi gettext-po.ffi” would fail with the error message ffi-help: WARNING: the FFI helper is experimental (unknown):1: not found: "gnu/stubs-32.h" compile-ffi: parse failed So this change is needed in order to reproduce my issue. Regards, Florian