[gambit-list] FFI with (char *) buffer

Ben Weaver weaver at coptix.com
Mon Feb 26 17:01:44 EST 2007


Thanks for your help, Phil.  Combining your suggestions with some
ideas from gamsock, I now have this code.  In addition to being
significantly faster, it will also work with any vector type (I
think).

Best wishes,

-Ben

;; code

(define vector->c-buffer
  (c-lambda
      (scheme-object scheme-object size-type) void
      #<<end-lambda
      
      if (!___TESTSUBTYPE(___arg2, ___sFOREIGN))
          return ___FIX(___STOC_POINTER_ERR + 2);

      memcpy(___CAST(void *, ___FIELD(___arg2, ___FOREIGN_PTR)),
             ___CAST(void *, ___BODY_AS(___arg1, ___tSUBTYPED)),
             ___arg3);
      
end-lambda
))

(define %c-buffer->vector
  (c-lambda
      (scheme-object scheme-object size-type)
      void
    #<<end-lambda

      if (!___TESTSUBTYPE(___arg1, ___sFOREIGN))
          return ___FIX(___STOC_POINTER_ERR + 1);

      memcpy(___CAST(void *, ___BODY_AS(___arg2, ___tSUBTYPED)),
             ___CAST(void *, ___FIELD(___arg1, ___FOREIGN_PTR)),
             ___arg3);    
    
end-lambda
))



More information about the Gambit-list mailing list