FLI question: How to have C manipulate an array
Hi!
Suppose I have a C function
int foo(unsigned char *data, int len)
{
int i;
for (i = 0; i < len; i++)
data[i]++;
return len;
}
What is the recommended way to call such a thing via FLI? This works:
(define-foreign-function (foo "foo" :source)
((data (:pointer (:unsigned :char)))
(len :int))
:result-type :int
:language :ansi-c)
(defun call-foo (data)
(declare (type (simple-array (unsigned-byte 8) (*)) data))
(with-dynamic-foreign-objects ()
(let* ((len (length data))
(arr (allocate-dynamic-foreign-object :type '(:unsigned :char)
:nelems len)))
(dotimes (i len)
(declare (fixnum i))
(setf (dereference arr :index i) (aref data i)))
(prog1
(foo arr len)
(dotimes (i len)
(declare (fixnum i))
(setf (aref data i) (dereference arr :index i)))))))
but is there a better way (possibly one that avoids copying)?
Regards,
--
Nils Goesche
"Don't ask for whom the <CTRL-G> tolls."
PGP key ID 0x0655CFA0