So if the resulting spec file looked something like
;; spec file starts here (cffi-c2ffi:definition foo ...) (cffi-c2ffi:definition bar ...) (cffi-c2ffi:definition baz ...) ;; spec file ends here
ah, ok, this makes sense, thanks!
but it leads up to an issue i'm dealing with now:
the c2ffi output contains offset for each field in a struct, which enables us to generate partial bindings where not all struct fields need to have a defined type.
my current idea to deal with undefined types is the following:
- (cffi:defctype undefined :char "Used by cffi-c2ffi to mark types that are used in e.g. structs, but are not defined in the scope of the generation.")
- in a first phase collect all defined and referenced types. (this may be a PITA because i don't know all the ins and outs of C namespaces, e.g. where is it ok to reference a struct by only its name, as opposed to by "struct some-struct", and which namespaces are looked up in naked type references, etc.)
- in the emitting phase first emit defctype for each used but not defined type before emitting the definitions themselves
- while emitting definitions simplify them compatibly. e.g. the bindings of functions that take a pointer to an undefined type get simplified into a :pointer.
as you can see this needs a multi-phase whole-file processing, but i'm open for ideas.
the way cl-autowrap deals with this is that its struct framework doesn't complain for undefined types because it expects :offset for each field.
maybe defcstruct could be extended in a sane way with something like this?