From: Kevin M. Rosenberg Date: Thu, 7 Oct 2004 18:36:28 +0000 (+0000) Subject: r10087: add convert-from-foreign-usb8 X-Git-Tag: v1.6.1~85 X-Git-Url: http://git.kpe.io/?p=uffi.git;a=commitdiff_plain;h=d0a074275862d6458963f9ad4a835cb03e50ebbf r10087: add convert-from-foreign-usb8 --- diff --git a/ChangeLog b/ChangeLog index 4c0ea2e..ba64d06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-10-07 Kevin Rosenberg (kevin@rosenberg.net) + * src/objects.lisp: Add new function: + convert-from-foreign-usb8 + 2004-04-15 Kevin Rosenberg (kevin@rosenberg.net) * src/objects.lisp: Add new functions: MAKE-POINTER and POINTER-ADDRESS diff --git a/src/objects.lisp b/src/objects.lisp index 358763e..0e2d908 100644 --- a/src/objects.lisp +++ b/src/objects.lisp @@ -270,3 +270,37 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." `(define-symbol-macro ,lisp-name '(error "DEF-FOREIGN-VAR not (yet) defined for ~A" (lisp-implementation-type))))) + +#-(or sbcl cmu) +(defun convert-from-foreign-usb8 (s len) + (declare (optimize (speed 3) (space 0) (safety 0) (compilation-speed 0)) + (fixnum len)) + (let ((a (make-array len :element-type '(unsigned-byte 8)))) + (dotimes (i len a) + (declare (fixnum i)) + (setf (aref a i) (uffi:deref-array s '(:array :unsigned-byte) i))))) + +#+sbcl +(defun convert-from-foreign-usb8 (s len) + (declare (type sb-sys:system-area-pointer sap)) + (locally + (declare (optimize (speed 3) (safety 0))) + (let ((result (make-array len :element-type '(unsiged-byte 8)))) + (sb-kernel:copy-from-system-area s 0 + result (* sb-vm:vector-data-offset + sb-vm:n-word-bits) + (* len sb-vm:n-byte-bits)) + result))) + +#+cmu +(defun convert-from-foreign-usb8 (s le) + (declare (type system:system-area-pointer sap)) + (locally + (declare (optimize (speed 3) (safety 0))) + (let ((result (make-array len :element-type '(unsiged-byte 8)))) + (kernel:copy-from-system-area s 0 + result (* vm:vector-data-offset + vm:word-bits) + (* len vm:byte-bits)) + result))) + diff --git a/src/package.lisp b/src/package.lisp index 3c22730..e25c9ce 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -54,6 +54,7 @@ #:char-array-to-pointer #:with-cast-pointer #:def-foreign-var + #:convert-from-foreign-usb8 ;; string functions #:convert-from-cstring