;; Common Lisp bindings for GTK+ v2.0
-;; Copyright (C) 1999-2001 Espen S. Johnsen <esj@stud.cs.uit.no>
+;; Copyright (C) 1999-2005 Espen S. Johnsen <espen@users.sf.net>
;;
;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: ffi.lisp,v 1.17 2005-02-25 23:55:06 espen Exp $
+;; $Id: ffi.lisp,v 1.19 2005-04-17 21:49:19 espen Exp $
(in-package "GLIB")
`(,name ,(alien-type type))))
args))
,(to-alien-form
- `(let (,@(mapcar #'(lambda (arg)
- (destructuring-bind (name type) arg
- `(,name ,(from-alien-form name type))))
- args))
+ `(let (,@(delete nil
+ (mapcar #'(lambda (arg)
+ (destructuring-bind (name type) arg
+ (let ((from-alien
+ (from-alien-form name type)))
+ (unless (eq name from-alien)
+ `(,name ,from-alien)))))
+ args)))
,@body)
return-type))))
(defun callback (af)
(sb-alien:alien-function-sap af))
+#+sbcl
+(deftype callback () 'sb-alien:alien-function)
;;;; Definitons and translations of fundamental types
(declare (ignore type args))
`(let ((string ,string))
;; Always copy strings to prevent seg fault due to GC
+ #+cmu
(copy-memory
(vector-sap (coerce string 'simple-base-string))
- (1+ (length string)))))
+ (1+ (length string)))
+ #+sbcl
+ (let ((utf8 (%deport-utf8-string string)))
+ (copy-memory (vector-sap utf8) (length utf8)))))
(defmethod to-alien-function ((type (eql 'string)) &rest args)
(declare (ignore type args))
#'(lambda (string)
+ #+cmu
(copy-memory
(vector-sap (coerce string 'simple-base-string))
- (1+ (length string)))))
+ (1+ (length string)))
+ #+sbcl
+ (let ((utf8 (%deport-utf8-string string)))
+ (copy-memory (vector-sap utf8) (length utf8)))))
(defmethod from-alien-form (string (type (eql 'string)) &rest args)
(declare (ignore type args))
`(let ((string ,string))
(unless (null-pointer-p string)
(prog1
- (%naturalize-c-string string)
+ #+cmu(%naturalize-c-string string)
+ #+sbcl(%naturalize-utf8-string string)
(deallocate-memory string)))))
(defmethod from-alien-function ((type (eql 'string)) &rest args)
#'(lambda (string)
(unless (null-pointer-p string)
(prog1
- (%naturalize-c-string string)
+ #+cmu(%naturalize-c-string string)
+ #+sbcl(%naturalize-utf8-string string)
(deallocate-memory string)))))
(defmethod cleanup-form (string (type (eql 'string)) &rest args)
(declare (ignore type args))
`(let ((string ,string))
(unless (null-pointer-p string)
- (%naturalize-c-string string))))
-
+ #+cmu(%naturalize-c-string string)
+ #+sbcl(%naturalize-utf8-string string))))
(defmethod copy-from-alien-function ((type (eql 'string)) &rest args)
(declare (ignore type args))
#'(lambda (string)
(unless (null-pointer-p string)
- (%naturalize-c-string string))))
+ #+cmu(%naturalize-c-string string)
+ #+sbcl(%naturalize-utf8-string string))))
(defmethod writer-function ((type (eql 'string)) &rest args)
(declare (ignore type args))
#'(lambda (string location &optional (offset 0))
(assert (null-pointer-p (sap-ref-sap location offset)))
(setf (sap-ref-sap location offset)
+ #+cmu
(copy-memory
(vector-sap (coerce string 'simple-base-string))
- (1+ (length string))))))
+ (1+ (length string)))
+ #+sbcl
+ (let ((utf8 (%deport-utf8-string string)))
+ (copy-memory (vector-sap utf8) (length utf8))))))
(defmethod reader-function ((type (eql 'string)) &rest args)
(declare (ignore type args))
#'(lambda (location &optional (offset 0))
(unless (null-pointer-p (sap-ref-sap location offset))
- (%naturalize-c-string (sap-ref-sap location offset)))))
+ #+cmu(%naturalize-c-string (sap-ref-sap location offset))
+ #+sbcl(%naturalize-utf8-string (sap-ref-sap location offset)))))
(defmethod destroy-function ((type (eql 'string)) &rest args)
(declare (ignore type args))
(declare (ignore type args))
(values t nil))
+
(defmethod alien-type ((type (eql 'pathname)) &rest args)
(declare (ignore type args))
(alien-type 'string))