X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fobjects.lisp;h=0e2d908f45fe9edea2b6709e2f4ed28a1a455c02;hb=d0a074275862d6458963f9ad4a835cb03e50ebbf;hp=358763e41fc829c815845886a3e898dcf31bd733;hpb=9443f517939b8a9d99cb2ad1d4e6726af753cb66;p=uffi.git 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))) +