;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: basic-types.lisp,v 1.2 2006-06-08 13:24:25 espen Exp $
+;; $Id: basic-types.lisp,v 1.6 2007-02-19 14:42:24 espen Exp $
(in-package "GFFI")
(deftype pointer ()
#+(or cmu sbcl) 'system-area-pointer
#+clisp 'ffi:foreign-address)
+(deftype pointer-data ()
+ '(unsigned-byte #+sbcl #.(sb-sizeof-bits 'sb-alien:system-area-pointer)
+ #+clisp #.(ffi:bitsizeof 'ffi:c-pointer)
+ #-(or sbcl clisp) 32))
+
(deftype bool (&optional (size '*)) (declare (ignore size)) 'boolean)
(deftype copy-of (type) type)
(deftype static (type) type)
#+(or cmu sbcl)(sap-ref-double location offset)
#+clisp(ffi:memory-as location 'double-float offset)))
+(deftype optimized-double-float () 'double-float)
+
+(define-type-method to-alien-form ((type optimized-double-float) form &optional copy-p)
+ (declare (ignore type copy-p))
+ form)
+
;;; Character
;;; String
(defun utf8-length (string)
+ "Returns the length including the trailing zero, of STRING encoded as UTF8"
(1+ (loop
for char across string
as char-code = (char-code char)
((< char-code #x1FFFFF) 4)))))
(defun encode-utf8-string (string &optional location)
- (let ((location (or location (allocate-memory (utf8-length string)))))
+ (let* ((len (utf8-length string))
+ (location (or location (allocate-memory len))))
(loop
for char across string
for i from 0
((< char-code #x80) (setf (ref-byte location i) char-code))
((< char-code #x800) (encode 11))
((< char-code #x10000) (encode 16))
- ((< char-code #x200000) (encode 21))))
- finally (setf (ref-byte location (1+ i)) 0))
+ ((< char-code #x200000) (encode 21)))))
+ (setf (ref-byte location (1- len)) 0)
location))
(defun decode-utf8-string (c-string)