> On Dec 9, 2017, at 10:06 AM, pelzflorian (Florian Pelz) > <pelzflor...@pelzflorian.de> 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. 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) (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))))))