I believe a better way to solve these issues is to create a generic library for allocating C memory.
------------
(define alloc-u8 (c-lambda (int) u8* "___result_voidstar = malloc(___arg1*sizeof(unsigned char));"))
(define u8*-ref (c-lambda (u8* int) int "___result = ___arg1[___arg2];"))
(define u8*-set! (c-lambda (u8* int int) void "___arg1[___arg2] = ___arg3;"))
(define (u8vector->u8* v) (let* ((len (u8vector-length v)) (c-buffer (alloc-u8 len))) (let loop (i 0) (if (< i len) (begin (u8*-set! c-buffer i (u8vector-ref v i)) (loop (+ i 1))) c-buffer))))
(define free (c-lambda ((pointer void #f)) void "free((void*)___arg1);"))
-----------
void do_something_with_u8(unsigned char *data) { ... }
(define %%do-something-with-u8 (c-lambda ((pointer unsigned-char)) void "do_something_with_u8"))
(define (do-something-with-u8 v) (let ((buf (u8vector->u8* v))) (%%do-something-with-u8 buf) (free buf)))
----------------
I'm working on automatically generating this interface for all the possible types. This lets you access all FFI's without the need to change C code. Unfortunately, it requires allocation for every call, but there are ways to optimize this. That code is completely untested and just wanted to give you the idea.
- James