X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fprimitives.cl;h=294dcdc9b784a35f6efe09bab73cdd790f217cc1;hb=02d03aeb9bb5adf1cf5b1d6ea598d6446a631aea;hp=c5c64502ce241ce64bf4b2b62fe58e7b4f476231;hpb=c7b9e795a73b25b3c81ecb1c8c69b8f0f944a064;p=uffi.git diff --git a/src/primitives.cl b/src/primitives.cl index c5c6450..294dcdc 100644 --- a/src/primitives.cl +++ b/src/primitives.cl @@ -7,50 +7,34 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; Copyright (c) 2002 Kevin M. Rosenberg +;;;; $Id: primitives.cl,v 1.6 2002/03/15 11:38:13 kevin Exp $ ;;;; -;;;; $Id: primitives.cl,v 1.1 2002/03/10 21:48:50 kevin Exp $ +;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; -;;;; This file is part of the UFFI. -;;;; -;;;; UFFI is free software; you can redistribute it and/or modify -;;;; it under the terms of the GNU General Public License (version 2) as -;;;; published by the Free Software Foundation. -;;;; -;;;; UFFI is distributed in the hope that it will be useful, -;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;;; GNU General Public License for more details. -;;;; -;;;; You should have received a copy of the GNU General Public License -;;;; along with UFFI; if not, write to the Free Software -;;;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +;;;; UFFI users are granted the rights to distribute and use this software +;;;; as governed by the terms of the Lisp Lesser GNU Public License +;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL. ;;;; ************************************************************************* (declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0))) (in-package :uffi) -(defmacro def-constant (name value) +(defmacro def-constant (name value &key (export nil)) "Macro to define a constant and to export it" `(eval-when (:compile-toplevel :load-toplevel :execute) (defconstant ,name ,value) - (export ',name))) + ,(if export (list 'export `(quote ,name)) (values)))) -(defmacro uffi-declare (type name) - "Generates a declare statement for CL. Currently, only CMUCL -supports this." - #+(or lispworks allegro) - (declare (ignore type name)) - #+cmu - `(declare (type (alien ,type) ,name)) - ) - -(defmacro slot-type (type) +(defmacro def-type (name type) + "Generates a (deftype) statement for CL. Currently, only CMUCL +supports takes advantage of this optimization." #+(or lispworks allegro) (declare (ignore type)) #+(or lispworks allegro) - t - #+cmu `'(alien:alien ,type)) + `(deftype ,name () t) + #+cmu + `(deftype ,name () '(alien:alien ,(convert-from-uffi-type type :declare))) + ) (defmacro null-char-p (val) `(if (or (eql ,val 0) @@ -58,8 +42,14 @@ supports this." t nil)) +(defmacro ensure-char (val) + `(etypecase ,val + (integer + (code-char ,val)) + (character + ,val))) -(defmacro def-type (name type) +(defmacro def-foreign-type (name type) #+lispworks `(fli:define-c-typedef ,name ,(convert-from-uffi-type type :type)) #+allegro `(ff:def-foreign-type ,name ,(convert-from-uffi-type type :type)) #+cmu `(alien:def-alien-type ,name ,(convert-from-uffi-type type :type)) @@ -90,7 +80,7 @@ supports this." '((* . *) (:void . c-call:void) (:short . c-call:short) (:pointer-void . (* t)) - (:cstring . c-call:cstring) + (:cstring . c-call:c-string) (:char . c-call:char) (:unsigned-char . (alien:unsigned 8)) (:byte . (alien:unsigned 8)) @@ -131,7 +121,7 @@ supports this." (dolist (type +cmu-def-type-list+) (setf (gethash (car type) +cmu-def-type-hash+) (cdr type))) -(defun ph (&optional (os *standard-output*)) +(defmethod ph (&optional (os *standard-output*)) (maphash #'(lambda (k v) (format os "~&~S => ~S" k v)) +type-conversion-hash+)) (defun convert-from-uffi-type (type context)