On 2/4/07, Tony Sidaway <[EMAIL PROTECTED]> wrote:
Another problem that it would be helpful to have advice on is how to cast or coerce arbitrary data received in a Chicken safe-foreign-wrapper. Say I receive a foreign c-pointer to some data and a couple of parameters nmemb and size that when multiplied together tell me the number of bytes in the foreign object, it would be nice to have a Schemish way of converting that into a SRFI-4 u8vector of size (* nmemb size). I've examined locations and locatives, but those don't seem to help with that particular problem not least because there is no underlying Scheme data object, only a random bin containing binary bits whose significance is completely unknown to Scheme. Would it be best to write something to do that in C as a foreign-primitive? Basically a C function, declared foreign-primitive, that takes a C-pointer and an int, and allocates a byte vector of the appropriate size. Presumably this would eat into the nursery until such time as a minor garbage collection takes place.
I suppose I mean something like this: (define produce-byte-vector (foreign-primitive scheme-object ((int size) (c-pointer data)) "C_word *p = C_alloc(sizeof(C_header)+C_align(size));C_return(C_bytevector(&p, size, data));")) I expect I've got the arithmetic wrong, but this is the basic idea. This is a nice easy implementation because you can then use (byte-vector->u8vector), (byte-vector->s16vector) or whatever you want to coerce the resulting byte vector to whatever you want. _______________________________________________ Chicken-users mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/chicken-users
