X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fprimitives.cl;h=009c1fcf8b974ebbf37b025edea42041154dc764;hb=ec7303cd70cb5f382927af232691e6e9bd4269da;hp=0048668d9779c1bd0289c9d4a6c2efcb03021950;hpb=fb93b1923db347f01bdebc7226e5e1eaacacc9f9;p=uffi.git diff --git a/src/primitives.cl b/src/primitives.cl index 0048668..009c1fc 100644 --- a/src/primitives.cl +++ b/src/primitives.cl @@ -1,4 +1,4 @@ -;;;; -*- Mode: ANSI-Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*- +;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- ;;;; ************************************************************************* ;;;; FILE IDENTIFICATION ;;;; @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: primitives.cl,v 1.8 2002/03/17 17:33:30 kevin Exp $ +;;;; $Id: primitives.cl,v 1.17 2002/04/28 06:03:13 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -23,7 +23,8 @@ "Macro to define a constant and to export it" `(eval-when (:compile-toplevel :load-toplevel :execute) (defconstant ,name ,value) - ,(if export (list 'export `(quote ,name)) (values)))) + ,(when export (list 'export `(quote ,name))) + ',name)) (defmacro def-type (name type) "Generates a (deftype) statement for CL. Currently, only CMUCL @@ -37,11 +38,8 @@ supports takes advantage of this optimization." ) (defmacro null-char-p (val) - `(if (or (eql ,val 0) - (eq ,val #\Null)) - t - nil)) - + "Returns T if character is NULL" + `(zerop ,val)) (defmacro def-foreign-type (name type) #+lispworks `(fli:define-c-typedef ,name ,(convert-from-uffi-type type :type)) @@ -67,10 +65,13 @@ supports takes advantage of this optimization." (:unsigned-long . (alien:unsigned 32)) (:float . alien:single-float) (:double . alien:double-float) - )) + ) + "Conversions in CMUCL or def-foreign-type are different thatn in def-function") + +(defparameter +type-conversion-list+ nil) #+cmu -(defconstant +type-conversion-list+ +(setq +type-conversion-list+ '((* . *) (:void . c-call:void) (:short . c-call:short) (:pointer-void . (* t)) @@ -78,13 +79,14 @@ supports takes advantage of this optimization." (:char . c-call:char) (:unsigned-char . (alien:unsigned 8)) (:byte . (alien:unsigned 8)) - (:short . c-call:unsigned-short) (:unsigned-short c-call:unsigned-short) + (:short . c-call:unsigned-short) + (:unsigned-short . c-call:unsigned-short) (:int . alien:integer) (:unsigned-int . c-call:unsigned-int) (:long . c-call:long) (:unsigned-long . c-call:unsigned-long) (:float . c-call:float) (:double . c-call:double) (:array . alien:array))) #+allegro -(defconstant +type-conversion-list+ +(setq +type-conversion-list+ '((* . *) (:void . :void) (:short . :short) (:pointer-void . (* :void)) @@ -97,11 +99,12 @@ supports takes advantage of this optimization." (:float . :float) (:double . :double) (:array . :array))) #+lispworks -(defconstant +type-conversion-list+ +(setq +type-conversion-list+ '((* . :pointer) (:void . :void) (:short . :short) - (:pointer-void . (:pointer :unsigned :void)) - (:cstring . (:pointer (:unsigned :char))) + (:pointer-void . (:pointer :void)) + (:cstring . (:reference-pass :ef-mb-string :allow-null t)) + (:cstring-returning . (:reference :ef-mb-string :allow-null t)) (:char . :char) (:byte :byte) (:unsigned-char . (:unsigned :char)) @@ -117,8 +120,11 @@ supports takes advantage of this optimization." (dolist (type +cmu-def-type-list+) (setf (gethash (car type) +cmu-def-type-hash+) (cdr type))) -(defmethod ph (&optional (os *standard-output*)) - (maphash #'(lambda (k v) (format os "~&~S => ~S" k v)) +type-conversion-hash+)) +(defun basic-convert-from-uffi-type (type) + (let ((found-type (gethash type +type-conversion-hash+))) + (if found-type + found-type + type))) (defun convert-from-uffi-type (type context) "Converts from a uffi type to an implementation specific type" @@ -133,17 +139,15 @@ supports takes advantage of this optimization." (let ((cmu-type (gethash type +cmu-def-type-hash+))) (if cmu-type cmu-type - (let ((found-type (gethash type +type-conversion-hash+))) - (if found-type - found-type - type))))) + (basic-convert-from-uffi-type type)))) + #+lispworks + ((and (eq context :return) + (eq type :cstring)) + (basic-convert-from-uffi-type :cstring-returning)) (t - (let ((found-type (gethash type +type-conversion-hash+))) - (if found-type - found-type - type)))) - (cons (convert-from-uffi-type (first type) context) - (convert-from-uffi-type (rest type) context)))) + (basic-convert-from-uffi-type type))) + (cons (convert-from-uffi-type (first type) context) + (convert-from-uffi-type (rest type) context))))