--- old-cffi/src/cffi-clisp.lisp	2008-04-05 04:10:45.000000000 +0100
+++ new-cffi/src/cffi-clisp.lisp	2008-04-05 04:10:45.000000000 +0100
@@ -276,6 +276,35 @@
     `(,(find-cffi-symbol '#:foreign-library-handle)
        (,(find-cffi-symbol '#:get-foreign-library) ',name))))
 
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  ;; version 2.40 (CVS 2006-09-03, to be more precise) added a
+  ;; PROPERTIES argument to FFI::FOREIGN-LIBRARY-FUNCTION.
+  (defun post-2.40-ffi-interface-p ()
+    (let ((f-l-f (find-symbol (string '#:foreign-library-function) '#:ffi)))
+      (if (and f-l-f (= (length (ext:arglist f-l-f)) 5))
+          '(:and)
+          '(:or))))
+  ;; FFI::FOREIGN-LIBRARY-FUNCTION and FFI::FOREIGN-LIBRARY-VARIABLE
+  ;; were deprecated in 2.41 and removed in 2.45.
+  (defun post-2.45-ffi-interface-p ()
+    (if (find-symbol (string '#:foreign-library-function) '#:ffi)
+        '(:or)
+        '(:and))))
+
+#+#.(cffi-sys::post-2.45-ffi-interface-p)
+(defun %foreign-funcall-aux (name type library)
+  `(ffi::find-foreign-function ,name ,type nil ,library nil nil))
+
+#-#.(cffi-sys::post-2.45-ffi-interface-p)
+(defun %foreign-funcall-aux (name type library)
+  `(ffi::foreign-library-function
+    ,name ,library nil
+    #+#.(cffi-sys::post-2.40-ffi-interface-p)
+    nil
+    ,type))
+
+;;;;; ADD MACRO FOR (FFI:PARSE-C-TYPE (C-FUNCTION-TYPE ...))
+
 (defmacro %foreign-funcall (name args &key library calling-convention)
   "Invoke a foreign function called NAME, taking pairs of
 foreign-type/value pairs from ARGS.  If a single element is left
@@ -286,21 +315,13 @@
     `(funcall
       (load-time-value
        (handler-case
-           (ffi::foreign-library-function
-            ,name
-            ,(if (eq library :default)
+           ,(%foreign-funcall-aux
+             name
+             `(ffi:parse-c-type
+               ',(c-function-type types rettype calling-convention))
+             (if (eq library :default)
                  :default
-                 (library-handle-form library))
-            nil
-            ;; As of version 2.40 (CVS 2006-09-03, to be more precise),
-            ;; FFI::FOREIGN-LIBRARY-FUNCTION takes an additional
-            ;; 'PROPERTIES' argument.
-            #+#.(cl:if (cl:= (cl:length (ext:arglist
-                                         'ffi::foreign-library-function)) 5)
-                       '(and) '(or))
-            nil
-            (ffi:parse-c-type ',(c-function-type
-                                 types rettype calling-convention)))
+                 (library-handle-form library)))
          (error (err)
            (warn "~A" err))))
       ,@fargs)))
@@ -383,6 +404,9 @@
 (defun %load-foreign-library (name path)
   "Load a foreign library from PATH."
   (declare (ignore name))
+  #+#.(cffi-sys::post-2.45-ffi-interface-p)
+  (ffi:open-foreign-library path)
+  #-#.(cffi-sys::post-2.45-ffi-interface-p)
   (ffi::foreign-library path))
 
 (defun %close-foreign-library (handle)
@@ -398,5 +422,7 @@
   "Returns a pointer to a foreign symbol NAME."
   (prog1 (ignore-errors
            (ffi:foreign-address
-            (ffi::foreign-library-variable
-             name library nil nil)))))
+            #+#.(cffi-sys::post-2.45-ffi-interface-p)
+            (ffi::find-foreign-variable name nil library nil nil)
+            #-#.(cffi-sys::post-2.45-ffi-interface-p)
+            (ffi::foreign-library-variable name library nil nil)))))

