From: espen Date: Sun, 17 Apr 2005 21:49:19 +0000 (+0000) Subject: All alien strings automatically converted to and from utf8 i SBCL X-Git-Url: https://git.distorted.org.uk/~mdw/clg/commitdiff_plain/6896c0f3344ff5cdf23bdd634a9413c782bdcbd7 All alien strings automatically converted to and from utf8 i SBCL --- diff --git a/glib/defpackage.lisp b/glib/defpackage.lisp index cfb9792..ba8d0bd 100644 --- a/glib/defpackage.lisp +++ b/glib/defpackage.lisp @@ -1,5 +1,5 @@ ;; Common Lisp bindings for GTK+ v2.0 -;; Copyright (C) 1999-2000 Espen S. Johnsen +;; Copyright (C) 1999-2005 Espen S. Johnsen ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -15,7 +15,7 @@ ;; 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: defpackage.lisp,v 1.5 2005-02-03 23:09:03 espen Exp $ +;; $Id: defpackage.lisp,v 1.6 2005-04-17 21:49:19 espen Exp $ ;(export 'kernel::type-expand-1 "KERNEL") @@ -37,7 +37,9 @@ (:import-from #+cmu"ALIEN" #+sbcl"SB-ALIEN" "WITH-ALIEN" "ALIEN-FUNCALL" "%HEAP-ALIEN" "MAKE-HEAP-ALIEN-INFO" "ADDR" "PARSE-ALIEN-TYPE" "SYSTEM-AREA-POINTER" "EXTERN-ALIEN") - (:import-from #+cmu"C-CALL" #+sbcl"SB-ALIEN" "%NATURALIZE-C-STRING" "VOID") + #+cmu(:import-from "C-CALL" "%NATURALIZE-C-STRING" "VOID") + #+sbcl(:import-from "SB-ALIEN" + "%NATURALIZE-UTF8-STRING" "%DEPORT-UTF8-STRING" "VOID") (:export "DEFTYPE-METHOD" "TRANSLATE-TYPE-SPEC" "TRANSLATE-TO-ALIEN" "TRANSLATE-FROM-ALIEN" "CLEANUP-ALIEN" "UNREFERENCE-ALIEN" "SIZE-OF" "UNBOUND-VALUE") diff --git a/glib/ffi.lisp b/glib/ffi.lisp index 385a7c4..56fe1da 100644 --- a/glib/ffi.lisp +++ b/glib/ffi.lisp @@ -1,5 +1,5 @@ ;; Common Lisp bindings for GTK+ v2.0 -;; Copyright (C) 1999-2001 Espen S. Johnsen +;; Copyright (C) 1999-2005 Espen S. Johnsen ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -15,7 +15,7 @@ ;; 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.18 2005-03-13 18:06:51 espen Exp $ +;; $Id: ffi.lisp,v 1.19 2005-04-17 21:49:19 espen Exp $ (in-package "GLIB") @@ -546,23 +546,32 @@ (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) @@ -570,7 +579,8 @@ #'(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) @@ -589,29 +599,35 @@ (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)) @@ -624,6 +640,7 @@ (declare (ignore type args)) (values t nil)) + (defmethod alien-type ((type (eql 'pathname)) &rest args) (declare (ignore type args)) (alien-type 'string))