r9396: add ensure-char-storage function, new tests
[uffi.git] / src / objects.lisp
index 82a9d0e8270960c5041310aa0bc1d59c0ef81527..940c941cc42f6d09338c22f90b8bc0d9e45949e0 100644 (file)
@@ -98,15 +98,9 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   #+sbcl `(sb-alien:sap-alien (sb-sys:int-sap ,addr) (* ,(convert-from-uffi-type (eval type) :type)))
   #+lispworks `(fli:make-pointer :address ,addr :type (quote ,(convert-from-uffi-type (eval type) :type)))
   #+allegro addr
-  #+mcl `(ccl:%int-to-ptr addr)
+  #+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)))
@@ -134,25 +128,21 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
 #+mcl
 (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)
@@ -232,7 +222,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
            ,pointer (* ,(convert-from-uffi-type (eval type) :type)))))
     ,@body))
 
-#+allegro
+#+(or allegro openmcl)
 (defmacro with-cast-pointer ((binding-name pointer type) &body body)
   (declare (ignore type))
   `(let ((,binding-name ,pointer))