;;;; 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)
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))
'((* . *) (: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))
(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)