#+mcl `(ccl:%int-to-ptr ,addr)
)
-(defmacro pointer-address (ptr)
- #+allegro ptr
- #+(or cmu scl) `(system:sap-int (alien:alien-sap ,ptr))
- #+sbcl `(sb-sys:sap-int (sb-alien:alien-sap ,ptr))
- #+lispworks `(fli:pointer-address ,ptr)
- #+mcl `(ccl:%ptr-to-int ,ptr))
(defmacro char-array-to-pointer (obj)
#+(or cmu scl) `(alien:cast ,obj (* (alien:unsigned 8)))
#+mcl `(ccl:pref ,ptr ,(convert-from-uffi-type type :deref))
)
-#+mcl
+#+(and mcl (not openmcl))
(defmacro deref-pointer-set (ptr type value)
`(setf (ccl:pref ,ptr ,(convert-from-uffi-type type :deref)) ,value))
-#+mcl
+#+(and mcl (not openmcl))
(defsetf deref-pointer deref-pointer-set)
-#+lispworks
(defmacro ensure-char-character (obj)
+ #+(or (and mcl (not openmcl))) obj
+ #+(or allegro cmu sbcl scl openmcl) `(code-char ,obj)
+ ;; lispworks varies whether deref'ing array vs. slot access of a char
+ #+lispworks
`(if (characterp ,obj) ,obj (code-char ,obj)))
-
-#+(and mcl (not openmcl))
-(defmacro ensure-char-character (obj)
- obj)
-
-#+(or allegro cmu sbcl scl openmcl)
-(defmacro ensure-char-character (obj)
- `(code-char ,obj))
-#+(or lispworks (and mcl (not openmcl)))
(defmacro ensure-char-integer (obj)
- `(char-code ,obj))
+ #+(or (and mcl (not openmcl))) `(char-code ,obj)
+ #+(or allegro cmu sbcl scl openmcl) obj
+ `(if (characterp ,obj) (char-code ,obj) ,obj))
-#+(or allegro cmu sbcl scl openmcl)
-(defmacro ensure-char-integer (obj)
- obj)
+(defmacro ensure-char-storable (obj)
+ #+(or lispworks (and mcl (not openmcl))) obj
+ #+(or allegro cmu sbcl scl openmcl) `(char-code ,obj))
(defmacro pointer-address (obj)
#+(or cmu scl)
(progn ,@body)
(free-foreign-object ,var)))
#+(or cmu scl)
- (let ((obj (gensym)))
- `(alien:with-alien ((,obj ,(convert-from-uffi-type (eval type) :allocate)))
- (let ((,var (alien:addr ,obj)))
- ,@body)))
+ (let ((obj (gensym))
+ (ctype (convert-from-uffi-type (eval type) :allocate)))
+ (if (and (consp ctype) (eq 'array (car ctype)))
+ `(alien:with-alien ((,obj ,ctype))
+ (let* ((,var ,obj))
+ ,@body))
+ `(alien:with-alien ((,obj ,ctype))
+ (let* ((,var (alien:addr ,obj)))
+ ,@body))))
#+sbcl
- (let ((obj (gensym)))
- `(sb-alien:with-alien ((,obj ,(convert-from-uffi-type (eval type) :allocate)))
- (let ((,var (sb-alien:addr ,obj)))
- ,@body)))
+ (let ((obj (gensym))
+ (ctype (convert-from-uffi-type (eval type) :allocate)))
+ (if (and (consp ctype) (eq 'array (car ctype)))
+ `(sb-alien:with-alien ((,obj ,ctype))
+ (let* ((,var ,obj))
+ ,@body))
+ `(sb-alien:with-alien ((,obj ,ctype))
+ (let* ((,var (sb-alien:addr ,obj)))
+ ,@body))))
#+lispworks
`(fli:with-dynamic-foreign-objects ((,var ,(convert-from-uffi-type
(eval type) :allocate)))
`(let ((,binding-name ,pointer))
,@body))
-#-(or lispworks cmu scl sbcl allegro)
+#-(or lispworks cmu scl sbcl allegro openmcl)
(defmacro with-cast-pointer ((binding-name pointer type) &body body)
- (declare (ignore binding-name pointer type))
+ (declare (ignore binding-name pointer type body))
'(error "WITH-CAST-POINTER not (yet) implemented for ~A"
(lisp-implementation-type)))
:module ,module)
(define-symbol-macro ,lisp-name (fli:dereference (,lisp-name)
:copy-foreign-object nil)))
- #-(or allegro cmu scl sbcl lispworks)
+ #+(and openmcl darwinppc-target)
+ (setf foreign-name (concatenate 'string "_" foreign-name))
+ #+openmcl
+ `(define-symbol-macro ,lisp-name
+ (deref-pointer (ccl:foreign-symbol-address ,foreign-name) ,var-type))
+ #-(or allegro cmu scl sbcl lispworks openmcl)
`(define-symbol-macro ,lisp-name
'(error "DEF-FOREIGN-VAR not (yet) defined for ~A"
(lisp-implementation-type)))))