From 130fbcd798fcc0e9513d01519e0837fe7300938b Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Mon, 30 Sep 2002 07:56:21 +0000 Subject: [PATCH] r2905: *** empty log message *** --- debian/changelog | 8 +- debian/rules | 5 +- doc/html.tar.gz | Bin 21436 -> 21460 bytes src-mcl/Makefile | 6 - src-mcl/aggregates.cl | 176 ------------------- src-mcl/functions.cl | 93 ---------- src-mcl/libraries.cl | 102 ----------- src-mcl/objects.cl | 130 -------------- src-mcl/package.cl | 72 -------- src-mcl/primitives.cl | 157 ----------------- src-mcl/strings.cl | 202 ---------------------- {src-main => src}/.cvsignore | 0 {src-main => src}/Makefile | 0 {src-main => src}/aggregates.cl | 71 +++++++- {src-corman => src/corman}/corman-uffi.cl | 2 +- {src-main => src}/functions.cl | 41 ++++- {src-main => src}/libraries.cl | 36 ++-- src/objects-mcl.cl | 42 +++++ {src-main => src}/objects.cl | 73 ++++++-- {src-main => src}/package.cl | 0 {src-main => src}/primitives.cl | 101 +++++++++-- src/readmacros-mcl.cl | 39 +++++ src/readmacros-mcl.lisp | 39 +++++ {src-main => src}/strings.cl | 44 ++++- uffi.asd | 39 ++--- 25 files changed, 454 insertions(+), 1024 deletions(-) delete mode 100644 src-mcl/Makefile delete mode 100644 src-mcl/aggregates.cl delete mode 100644 src-mcl/functions.cl delete mode 100644 src-mcl/libraries.cl delete mode 100644 src-mcl/objects.cl delete mode 100644 src-mcl/package.cl delete mode 100644 src-mcl/primitives.cl delete mode 100644 src-mcl/strings.cl rename {src-main => src}/.cvsignore (100%) rename {src-main => src}/Makefile (100%) rename {src-main => src}/aggregates.cl (59%) rename {src-corman => src/corman}/corman-uffi.cl (99%) rename {src-main => src}/functions.cl (67%) rename {src-main => src}/libraries.cl (82%) create mode 100644 src/objects-mcl.cl rename {src-main => src}/objects.cl (66%) rename {src-main => src}/package.cl (100%) rename {src-main => src}/primitives.cl (67%) create mode 100644 src/readmacros-mcl.cl create mode 100644 src/readmacros-mcl.lisp rename {src-main => src}/strings.cl (84%) diff --git a/debian/changelog b/debian/changelog index a5881c0..86bad87 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,15 @@ +cl-uffi (0.9.0-1) unstable; urgency=low + + * Reorganize directories, merge MCL/OpenMCL into main code + + -- Kevin M. Rosenberg Mon, 30 Sep 2002 01:32:03 -0600 + cl-uffi (0.8.6-1) unstable; urgency=low * Fix :pointer-self for OpenMCL. * Multiple changes to support OpenMCL with CLSQL - -- Kevin M. Rosenberg Sun, 29 Sep 2002 14:14:01 -0600 + -- Kevin M. Rosenberg Mon, 30 Sep 2002 01:31:37 -0600 cl-uffi (0.8.5-1) unstable; urgency=low diff --git a/debian/rules b/debian/rules index 6ba6132..1148184 100755 --- a/debian/rules +++ b/debian/rules @@ -46,12 +46,11 @@ install: build dh_testroot dh_clean -k dh_installdirs --all $(clc-systems) $(clc-source) - dh_installdirs -p $(debpkg) $(doc-dir) $(clc-uffi)/src-main $(clc-uffi)/src-mcl + dh_installdirs -p $(debpkg) $(doc-dir) $(clc-uffi)/src # Add here commands to install the package into debian/uffi. dh_install uffi.asd $(clc-uffi) - dh_install "src-main/*.cl" $(clc-uffi)/src-main - dh_install "src-mcl/*.cl" $(clc-uffi)/src-mcl + dh_install "src/*.cl" $(clc-uffi)/src dh_link $(clc-uffi)/uffi.asd $(clc-systems)/uffi.asd rm -rf doc/html diff --git a/doc/html.tar.gz b/doc/html.tar.gz index 128cbdb440ce3c4951236dcba060d05825fb4be4..17d994684b017d5322d1c63d3fb7b0a9b652d48c 100644 GIT binary patch delta 19797 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 A4*&oF delta 19773 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�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 diff --git a/src-mcl/Makefile b/src-mcl/Makefile deleted file mode 100644 index 31dc910..0000000 --- a/src-mcl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -SUBDIRS := - -include ../Makefile.common - -.PHONY: distclean -distclean: clean diff --git a/src-mcl/aggregates.cl b/src-mcl/aggregates.cl deleted file mode 100644 index 428013c..0000000 --- a/src-mcl/aggregates.cl +++ /dev/null @@ -1,176 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: aggregates.cl -;;;; Purpose: UFFI source to handle aggregate types -;;;; Programmers: Kevin M. Rosenberg and John DeSoi -;;;; Date Started: Feb 2002 -;;;; -;;;; $Id: aggregates.cl,v 1.3 2002/09/30 01:57:32 kevin Exp $ -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; and John DeSoi -;;;; -;;;; 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-enum (enum-name args &key (separator-string "#")) - "Creates a constants for a C type enum list, symbols are created -in the created in the current package. The symbol is the concatenation -of the enum-name name, separator-string, and field-name" - (let ((counter 0) - (cmds nil) - (constants nil)) - (declare (fixnum counter)) - (dolist (arg args) - (let ((name (if (listp arg) (car arg) arg)) - (value (if (listp arg) - (prog1 - (setq counter (cadr arg)) - (incf counter)) - (prog1 - counter - (incf counter))))) - (setq name (intern (concatenate 'string - (symbol-name enum-name) - separator-string - (symbol-name name)))) - (push `(uffi:def-constant ,name ,value) constants))) - (setf cmds (append '(progn) - #+allegro `((ff:def-foreign-type ,enum-name :int)) - #+lispworks `((fli:define-c-typedef ,enum-name :int)) - #+cmu `((alien:def-alien-type ,enum-name alien:signed)) - #-openmcl `((def-mcl-type ,enum-name :integer)) - #+openmcl `((ccl::def-foreign-type ,enum-name :int)) - (nreverse constants))) - cmds)) - - - -(defmacro def-array-pointer (name-array type) - #-openmcl - `(def-mcl-type ,name-array '(:array ,type)) - #+openmcl - `(ccl::def-foreign-type ,name-array (:array ,(convert-from-uffi-type type :array)))) - - - -; so we could allow '(:array :long) or deref with other type like :long only -(defun array-type (type) - (let ((result type)) - (when (listp type) - (let ((type-list (if (eq (car type) 'quote) (nth 1 type) type))) - (when (and (listp type-list) (eq (car type-list) :array)) - (setf result (cadr type-list))))) - result)) - - -(defmacro deref-array (obj type i) - "Returns a field from a row" - (let* ((array-type (array-type type)) - (local-type (convert-from-uffi-type array-type :allocation)) - (accessor (first (macroexpand `(ccl:pref obj ,local-type))))) - `(,accessor - ,obj - (* (the fixnum ,i) ,(size-of-foreign-type local-type))))) - - -; this expands to the %set-xx functions which has different params than %put-xx -(defmacro deref-array-set (obj type i value) - (let* ((array-type (array-type type)) - (local-type (convert-from-uffi-type array-type :allocation)) - (accessor (first (macroexpand `(ccl:pref obj ,local-type)))) - (settor (first (macroexpand `(setf (,accessor obj ,local-type) value))))) - `(,settor - ,obj - (* (the fixnum ,i) ,(size-of-foreign-type local-type)) - ,value))) - -(defsetf deref-array deref-array-set) - - -(defun process-struct-fields (name fields variant) - (let (processed) - (dolist (field fields) - (let* ((field-name (car field)) - (type (cadr field)) - (def (append (list field-name) - (cond - ((eq type :pointer-self) - #+cmu `((* (alien:struct ,name))) - #+openmcl `((:* (:struct ,name))) - #-(or cmu openmcl) `((* ,name)) - ) - (t - `(,(convert-from-uffi-type type :struct))))))) - (if variant - (push (list def) processed) - (push def processed)))) - (nreverse processed))) - -#-openmcl -(defmacro def-struct (name &rest fields) - `(ccl:defrecord ,name ,@(process-struct-fields name fields nil))) - -#-openmcl -(defmacro def-union (name &rest fields) - `(ccl:defrecord ,name (:variant ,@(process-struct-fields name fields t)))) - - -#+openmcl -(defmacro def-struct (name &rest fields) - `(ccl::def-foreign-type nil - (:struct ,name ,@(process-struct-fields name fields nil)))) - -#+openmcl -(defmacro def-union (name &rest fields) - `(ccl::def-foreign-type nil - (:union ,name ,@(process-struct-fields name fields nil)))) - -; Assuming everything is pointer based - no support for Mac handles -(defmacro get-slot-value (obj type slot) ;use setf to set values - `(ccl:pref ,obj ,(read-from-string (format nil ":~a.~a" (keyword type) (keyword slot))))) - -(defmacro set-slot-value (obj type slot value) ;use setf to set values - `(setf (ccl:pref ,obj ,(read-from-string (format nil ":~a.~a" (keyword type) (keyword slot)))) ,value)) - - -(defsetf get-slot-value set-slot-value) - - -#-openmcl -(defmacro get-slot-pointer (obj type slot) - `(ccl:%int-to-ptr (+ (ccl:%ptr-to-int ,obj) (the fixnum (ccl:field-info ,type ,slot))))) - -#+openmcl -(defmacro get-slot-pointer (obj type slot) - `(let ((field (ccl::%find-foreign-record-type-field ,type ,slot))) - (ccl:%int-to-ptr (+ (ccl:%ptr-to-int ,obj) (the fixnum (ccl::foreign-record-field-offset field)))))) - - - -#| a few simple tests -(def-union union - (l1 :long) - (s1 :short)) - -(def-struct struct - (s1 :short) - (l1 :long) - (u1 :union)) - -(defvar s (allocate-foreign-object :struct)) -(setf (get-slot-value s :struct :s1) 3) -(get-slot-value s :struct :s1) -(setf (get-slot-value s :struct :u1.s1) 5) -(get-slot-value s :struct :u1.s1) - -|# diff --git a/src-mcl/functions.cl b/src-mcl/functions.cl deleted file mode 100644 index 693f15d..0000000 --- a/src-mcl/functions.cl +++ /dev/null @@ -1,93 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: function.cl -;;;; Purpose: UFFI source to C function defintions -;;;; Programmers: Kevin M. Rosenberg and John DeSoi -;;;; Date Started: Feb 2002 -;;;; -;;;; $Id: functions.cl,v 1.2 2002/09/20 04:51:14 kevin Exp $ -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; and John DeSoi -;;;; -;;;; 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) - - -(defun make-lisp-name (name) - (let ((converted (substitute #\- #\_ name))) - (intern - #+case-sensitive converted - #-case-sensitive (string-upcase converted)))) - -#-openmcl -(defun process-function-args (args) - (if (null args) - nil - (let (processed) - (dolist (arg args) - (push (process-one-function-arg arg) processed)) - (nreverse processed)))) - -#-openmcl -(defun process-one-function-arg (arg) - (let ((name (car arg)) - (type (convert-from-uffi-type (cadr arg) :routine))) - (if (and (listp type) (listp (car type))) - (append (list name) type) - (list name type)) - )) - - -;; name is either a string representing foreign name, or a list -;; of foreign-name as a string and lisp name as a symbol -#-openmcl -(defmacro def-function (names args &key module returning) - (declare (ignore module)) - (let* ((result-type (convert-from-uffi-type returning :return)) - (function-args (process-function-args args)) - (foreign-name (if (atom names) names (car names))) - (lisp-name (if (atom names) (make-lisp-name names) (cadr names)))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (ccl:define-entry-point (,lisp-name ,foreign-name) - ,function-args - ,result-type)))) - - - -#+openmcl -(defun process-function-args (args) - (if (null args) - (values nil nil) - (let ((processed nil) - (params nil) - name type) - (dolist (arg args) - (setf name (car arg)) - (setf type (convert-from-uffi-type (cadr arg) :routine)) - ;(when (and (listp type) (eq (car type) :address)) - ;(setf type :address)) - (push name params) - (push type processed) - (push name processed)) - (values (nreverse params) (nreverse processed))))) - - -#+openmcl -(defmacro def-function (names args &key module returning) - (declare (ignore module)) - (let* ((result-type (convert-from-uffi-type returning :return)) - (foreign-name (if (atom names) names (car names))) - (lisp-name (if (atom names) (make-lisp-name names) (cadr names)))) - #+darwinppc-target - (setf foreign-name (concatenate 'string "_" foreign-name)) - (multiple-value-bind (params args) (process-function-args args) - `(defun ,lisp-name ,params - (ccl::external-call ,foreign-name ,@args ,result-type))))) diff --git a/src-mcl/libraries.cl b/src-mcl/libraries.cl deleted file mode 100644 index 3226552..0000000 --- a/src-mcl/libraries.cl +++ /dev/null @@ -1,102 +0,0 @@ -;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: libraries.cl -;;;; Purpose: UFFI source to load foreign libraries -;;;; Programmers: Kevin M. Rosenberg and John DeSoi -;;;; Date Started: Feb 2002 -;;;; -;;;; $Id: libraries.cl,v 1.4 2002/09/30 01:57:32 kevin Exp $ -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; and John DeSoi -;;;; -;;;; 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) - -(defvar *loaded-libraries* nil - "List of foreign libraries loaded. Used to prevent reloading a library") - -;in MCL calling this more than once for the same library does not do anything -#-openmcl -(defun load-foreign-library (filename &key module supporting-libraries force-load) - (declare (ignore module supporting-libraries force-load)) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (when (ccl:add-to-shared-library-search-path filename t) - (pushnew filename *loaded-libraries*)))) - - -; Note we are not dealing with OpenMCL's ability to close the library -; As of v0.13 .dylibs can't be closed but bundles can. See the docs for the latest. -#+openmcl -(defun load-foreign-library (filename &key module supporting-libraries force-load) - (declare (ignore module supporting-libraries force-load)) - (let ((path (if (pathnamep filename) (namestring filename) filename))) - (when (stringp path) - (if (position path *loaded-libraries* :test #'string-equal) - t - (when (ccl:open-shared-library path) - (pushnew path *loaded-libraries*) - t))))) - - -(defun find-foreign-library (names directories &key types drive-letters) - "Looks for a foreign library. directories can be a single -string or a list of strings of candidate directories. Use default -library type if type is not specified." - (unless types - (setq types (default-foreign-library-type))) - (unless (listp types) - (setq types (list types))) - (unless (listp names) - (setq names (list names))) - (unless (listp directories) - (setq directories (list directories))) - #+(or win32 mswindows) - (unless (listp drive-letters) - (setq drive-letters (list drive-letters))) - #-(or win32 mswindows) - (setq drive-letters '(nil)) - (dolist (drive-letter drive-letters) - (dolist (name names) - (dolist (dir directories) - (dolist (type types) - (let ((path (make-pathname - #+lispworks :host - #+lispworks (when drive-letter drive-letter) - #-lispworks :device - #-lispworks (when drive-letter drive-letter) - :name name - :type type - :directory - (etypecase dir - (pathname - (pathname-directory dir)) - (list - dir) - (string - (pathname-directory - (parse-namestring dir))))))) - (when (probe-file path) - (return-from find-foreign-library path))))))) - nil) - - - -(defun default-foreign-library-type () - "Returns string naming default library type for platform" - #+(or win32 mswindows) "dll" - #-(or win32 mswindows mcl) "so" - #+openmcl '("dylib" "so" nil) - #-openmcl '(nil)) - - - - - diff --git a/src-mcl/objects.cl b/src-mcl/objects.cl deleted file mode 100644 index 82adf16..0000000 --- a/src-mcl/objects.cl +++ /dev/null @@ -1,130 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: objects.cl -;;;; Purpose: UFFI source to handle objects and pointers -;;;; Programmers: Kevin M. Rosenberg and John DeSoi -;;;; Date Started: Feb 2002 -;;;; -;;;; $Id: objects.cl,v 1.2 2002/09/20 04:51:14 kevin Exp $ -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; and John DeSoi -;;;; -;;;; 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) - - -;;; -;;; Some MCL specific utilities -;;; - -; trap macros don't work right directly in the macros -(eval-when (:compile-toplevel :load-toplevel :execute) - -#-openmcl -(defun new-ptr (size) - (#_NewPtr size)) - -#-openmcl -(defun dispose-ptr (ptr) - (#_DisposePtr ptr)) - -#+openmcl -(defmacro new-ptr (size) - `(ccl::malloc ,size)) - -#+openmcl -(defmacro dispose-ptr (ptr) - `(ccl::free ,ptr)) - -) - -;;; -;;; Start of standard UFFI -;;; -(defun size-of-foreign-type (type) - "Returns the size for the specified mcl type or record type" - #+openmcl - (ccl::%foreign-type-or-record-size type :bytes) - #-openmcl - (let ((mcl-type (ccl:find-mactype type nil t))) - (if mcl-type - (ccl::mactype-record-size mcl-type) - (ccl::record-descriptor-length (ccl:find-record-descriptor type t t)) ) ) ) ;error if not a record - - - -(defmacro allocate-foreign-object (type &optional (size :unspecified)) - "Allocates an instance of TYPE. If size is specified, then allocate -an array of TYPE with size SIZE." - (if (eq size :unspecified) - `(new-ptr ,(size-of-foreign-type (convert-from-uffi-type type :allocation))) - `(new-ptr (* ,size ,(size-of-foreign-type (convert-from-uffi-type type :allocation)))))) - - - -(defmacro free-foreign-object (obj) - `(dispose-ptr ,obj)) - -(defmacro null-pointer-p (obj) - `(ccl:%null-ptr-p ,obj)) - - -(defmacro make-null-pointer (type) - (declare (ignore type)) - `(ccl:%null-ptr)) - - -;already a macptr -(defmacro char-array-to-pointer (obj) - obj) - - -(defmacro deref-pointer (ptr type) - `(ccl:pref ,ptr ,(convert-from-uffi-type type :deref))) - -(defmacro deref-pointer-set (ptr type value) - `(setf (ccl:pref ,ptr ,(convert-from-uffi-type type :deref)) ,value)) - -(defsetf deref-pointer deref-pointer-set) - - -(defmacro ensure-char-character (obj) - #-openmcl obj - #+openmcl `(code-char ,obj)) - - -(defmacro ensure-char-integer (obj) - #-openmcl `(char-code ,obj) - #+openmcl obj) - - -(defmacro pointer-address (obj) - `(ccl:%ptr-to-int ,obj)) - - - -(defmacro with-foreign-objects (bindings &rest body) - (let ((params nil) type count) - (dolist (spec (reverse bindings)) ;keep order - macroexpands to let* - (setf type (convert-from-uffi-type (eval (nth 1 spec)) :allocate)) - (setf count 1) - (when (and (listp type) (eq (first type) :array)) - (setf count (nth 2 type)) - (unless (integerp count) (error "Invalid size for array: ~a" type)) - (setf type (nth 1 type))) - (push (list (first spec) (* count (size-of-foreign-type type))) params)) - `(ccl:%stack-block ,params ,@body))) - - -(defmacro with-foreign-object ((var type) &rest body) - `(with-foreign-objects ((,var ,type)) - ,@body)) - diff --git a/src-mcl/package.cl b/src-mcl/package.cl deleted file mode 100644 index 02849bc..0000000 --- a/src-mcl/package.cl +++ /dev/null @@ -1,72 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: package.cl -;;;; Purpose: Defines UFFI package -;;;; Programmer: Kevin M. Rosenberg -;;;; Date Started: Feb 2002 -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; -;;;; 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 :cl-user) - -(defpackage :uffi - (:use :cl) - (:export - - ;; immediate types - #:def-constant - #:def-foreign-type - #:def-type - #:null-char-p - - ;; aggregate types - #:def-enum - #:def-struct - #:get-slot-value - #:get-slot-pointer - #:def-array-pointer - #:deref-array - #:def-union - - ;; objects - #:allocate-foreign-object - #:free-foreign-object - #:with-foreign-object - #:with-foreign-objects - #:size-of-foreign-type - #:pointer-address - #:deref-pointer - #:ensure-char-character - #:ensure-char-integer - #:null-pointer-p - #:make-null-pointer - #:+null-cstring-pointer+ - #:char-array-to-pointer - - ;; string functions - #:convert-from-cstring - #:convert-to-cstring - #:free-cstring - #:with-cstring - #:with-cstrings - #:convert-from-foreign-string - #:convert-to-foreign-string - #:allocate-foreign-string - #:with-foreign-string - - ;; function call - #:def-function - - ;; Libraries - #:find-foreign-library - #:load-foreign-library - #:default-foreign-library-type - )) diff --git a/src-mcl/primitives.cl b/src-mcl/primitives.cl deleted file mode 100644 index 6cbe03e..0000000 --- a/src-mcl/primitives.cl +++ /dev/null @@ -1,157 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: primitives.cl -;;;; Purpose: UFFI source to handle immediate types -;;;; Programmers: Kevin M. Rosenberg and John DeSoi -;;;; Date Started: Feb 2002 -;;;; -;;;; $Id: primitives.cl,v 1.4 2002/09/30 01:57:32 kevin Exp $ -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; and John DeSoi -;;;; -;;;; 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) - - -(defvar *keyword-package* (find-package "KEYWORD")) - -; MCL and OpenMCL expect a lot of FFI elements to be keywords (e.g. struct field names in OpenMCL) -; So this provides a function to convert any quoted symbols to keywords. -(defun keyword (obj) - (cond ((keywordp obj) - obj) - ((null obj) - nil) - ((symbolp obj) - (intern (symbol-name obj) *keyword-package*)) - ((and (listp obj) (eq (car obj) 'cl:quote)) - (keyword (cadr obj))) - ((stringp obj) - (intern obj *keyword-package*)) - (t - obj))) - - -; Wrapper for unexported function we have to use -#-openmcl -(defmacro def-mcl-type (name type) - `(ccl::def-mactype ,(keyword name) (ccl:find-mactype ,type))) - - -(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) - ,(if export (list 'export `(quote ,name)) (values)))) - -(defmacro def-type (name type) - "Generates a (deftype) statement for CL. Currently, only CMUCL -supports takes advantage of this optimization." - (declare (ignore type)) - `(deftype ,name () t)) - -(defmacro null-char-p (val) - "Returns T if character is NULL" - `(zerop ,val)) - - -(defmacro def-foreign-type (name uffi-type) - (let ((type (convert-from-uffi-type uffi-type :type))) - (unless (or (keywordp type) (consp type)) - (setf type `(quote ,type))) - #-openmcl - `(def-mcl-type ,(keyword name) ,type) - #+openmcl - `(ccl::def-foreign-type ,(keyword name) ,type))) - - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar +type-conversion-hash+ (make-hash-table :size 20))) - -#-openmcl -(defconstant +type-conversion-list+ - '((* . :pointer) (:void . :void) - (:short . :short) (:unsigned-short . :unsigned-short) - (:pointer-void . :pointer) - (:cstring . :string) - (:char . :character) - (:unsigned-char . :unsigned-byte) - (:byte . :signed-byte) (:unsigned-byte . :unsigned-byte) - (:int . :long) (:unsigned-int . :unsigned-long) - (:long . :long) (:unsigned-long . :unsigned-long) - (:float . :single-float) (:double . :double-float) - (:array . :array))) - -#+openmcl -(defconstant +type-conversion-list+ - '((* . :address) (:void . :void) - (:short . :short) (:unsigned-short . :unsigned-short) - (:pointer-void . :address) - (:cstring . :address) - (:char . :signed-char) - (:unsigned-char . :unsigned-char) - (:byte . :signed-byte) (:unsigned-byte . :unsigned-byte) - (:int . :int) (:unsigned-int . :unsigned-int) - (:long . :long) (:unsigned-long . :unsigned-long) - (:long-long . :signed-doubleword) (:unsigned-long-long . :unsigned-doubleword) - (:float . :single-float) (:double . :double-float) - (:array . :array))) - - -(dolist (type +type-conversion-list+) - (setf (gethash (car type) +type-conversion-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 - (keyword type)))) - -(defun %convert-from-uffi-type (type context) - "Converts from a uffi type to an implementation specific type" - (if (atom type) - (cond - #-openmcl ((and (eq type :void) (eq context :return)) nil) - (t (basic-convert-from-uffi-type type))) - (let ((sub-type (car type))) - (case sub-type - (cl:quote - (%convert-from-uffi-type (cadr type) context)) - (:struct-pointer - #+openmcl `(:* (:struct ,(convert-from-uffi-type (cadr type) :struct))) - #-openmcl `(,(convert-from-uffi-type (list '* (cadr type)) :struct)) - ) - (:struct - #+openmcl `(:struct ,(convert-from-uffi-type (cadr type) :struct)) - #-openmcl `(,(convert-from-uffi-type (cadr type) :struct)) - ) - (t - (cons (%convert-from-uffi-type (first type) context) - (%convert-from-uffi-type (rest type) context))))))) - -(defun convert-from-uffi-type (type context) - (let ((result (%convert-from-uffi-type type context))) - (cond - ((atom result) result) - #+openmcl - ((eq (car result) :address) - (if (eq context :struct) - (append '(:*) (cdr result)) - :address)) - #-openmcl - ((and (eq (car result) :pointer) (eq context :allocation) :pointer)) - (t result)))) diff --git a/src-mcl/strings.cl b/src-mcl/strings.cl deleted file mode 100644 index 0c9a1c6..0000000 --- a/src-mcl/strings.cl +++ /dev/null @@ -1,202 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- -;;;; ************************************************************************* -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: strings.cl -;;;; Purpose: UFFI source to handle strings, cstring and foreigns -;;;; Programmers: Kevin M. Rosenberg and John DeSoi -;;;; Date Started: Feb 2002 -;;;; -;;;; $Id: strings.cl,v 1.3 2002/09/29 18:54:17 kevin Exp $ -;;;; -;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg -;;;; and John DeSoi -;;;; -;;;; 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) - - -(defvar +null-cstring-pointer+ (ccl:%null-ptr)) - -(defmacro convert-from-cstring (obj) - "Converts a string from a c-call. Same as convert-from-foreign-string, except -that CMU automatically converts strings from c-calls." - #+cmu obj - #+lispworks - (let ((stored (gensym))) - `(let ((,stored ,obj)) - (if (fli:null-pointer-p ,stored) - nil - (fli:convert-from-foreign-string ,stored)))) - #+allegro - (let ((stored (gensym))) - `(let ((,stored ,obj)) - (if (zerop ,stored) - nil - (values (excl:native-to-string ,stored))))) - #+mcl - (let ((stored (gensym))) - `(let ((,stored ,obj)) - (if (ccl:%null-ptr-p ,stored) - nil - (values (ccl:%get-cstring ,stored))))) - - - ) - -(defmacro convert-to-cstring (obj) - #+lispworks - `(if (null ,obj) - +null-cstring-pointer+ - (fli:convert-to-foreign-string ,obj)) - #+allegro - `(if (null ,obj) - 0 - (values (excl:string-to-native ,obj))) - #+cmu - (declare (ignore obj)) - #+mcl - `(if (null ,obj) - +null-cstring-pointer+ - (let ((ptr (new-ptr (1+ (length ,obj))))) - (ccl:%put-cstring ptr ,obj) - ptr)) - ) - -(defmacro free-cstring (obj) - #+lispworks - `(unless (fli:null-pointer-p ,obj) - (fli:free-foreign-object ,obj)) - #+allegro - `(unless (zerop obj) - (ff:free-fobject ,obj)) - #+cmu - (declare (ignore obj)) - #+mcl - `(unless (ccl:%null-ptr-p ,obj) - (dispose-ptr ,obj)) - - ) - -;; Either length or null-terminated-p must be non-nil -(defmacro convert-from-foreign-string (obj &key - length - (null-terminated-p t)) - #+allegro - `(if (zerop ,obj) - nil - (values (excl:native-to-string - ,obj - ,@(if length (list :length length) (values)) - :truncate (not ,null-terminated-p)))) - #+lispworks - `(if (fli:null-pointer-p ,obj) - nil - (fli:convert-from-foreign-string - ,obj - ,@(if length (list :length length) (values)) - :null-terminated-p ,null-terminated-p - :external-format '(:latin-1 :eol-style :lf))) - #+cmu - `(cmucl-naturalize-cstring (alien:alien-sap ,obj) - :length ,length - :null-terminated-p ,null-terminated-p) - #+mcl - (declare (ignore null-terminated-p)) - #+mcl - `(if (ccl:%null-ptr-p ,obj) - nil - (ccl:%get-cstring ,obj 0 ,@(if length (list length) nil))) - ) - -(defmacro convert-to-foreign-string (obj) - #+lispworks - `(if (null ,obj) - +null-cstring-pointer+ - (fli:convert-to-foreign-string ,obj)) - #+allegro - `(if (null ,obj) - 0 - (values (excl:string-to-native ,obj))) - #+cmu - (let ((size (gensym)) - (storage (gensym)) - (i (gensym))) - `(when (stringp ,obj) - (let* ((,size (length ,obj)) - (,storage (alien:make-alien char (1+ ,size)))) - (setq ,storage (alien:cast ,storage (* char))) - (dotimes (,i ,size) - (declare (fixnum ,i) - (optimize (speed 3) (safety 0))) - (setf (alien:deref ,storage ,i) (char-code (char ,obj ,i)))) - (setf (alien:deref ,storage ,size) 0) - ,storage))) - #+mcl - `(if (null ,obj) - +null-cstring-pointer+ - (let ((ptr (new-ptr (1+ (length ,obj))))) - (ccl:%put-cstring ptr ,obj) - ptr)) - ) - - -(defmacro allocate-foreign-string (size &key (unsigned t)) - #+cmu - (let ((array-def (gensym))) - `(let ((,array-def (list 'alien:array 'c-call:char ,size))) - (eval `(alien:cast (alien:make-alien ,,array-def) - ,(if ,unsigned - '(* (alien:unsigned 8)) - '(* (alien:signed 8))))))) - #+lispworks - `(fli:allocate-foreign-object :type - ,(if unsigned - ''(:unsigned :char) - :char) - :nelems ,size) - #+allegro - (declare (ignore unsigned)) - #+allegro - `(ff:allocate-fobject :char :c ,size) - #+mcl - (declare (ignore unsigned)) - #+mcl - `(new-ptr ,size) - - ) - - -; I'm sure there must be a better way to write this... -(defmacro with-cstring ((foreign-string lisp-string) &body body) - `(if (stringp ,lisp-string) - (ccl:with-cstrs ((,foreign-string ,lisp-string)) - ,@body) - (let ((,foreign-string +null-cstring-pointer+)) - ,@body))) - - -(defmacro with-cstrings (bindings &rest body) - (if bindings - `(with-cstring ,(car bindings) - (with-cstrings ,(cdr bindings) - ,@body)) - `(progn ,@body))) - -(defmacro with-foreign-string ((foreign-string lisp-string) &body body) - (let ((result (gensym))) - `(let* ((,foreign-string (convert-to-foreign-string ,lisp-string)) - (,result (progn ,@body))) - (declare (dynamic-extent ,foreign-string)) - (free-foreign-object ,foreign-string) - ,result))) - - - - - diff --git a/src-main/.cvsignore b/src/.cvsignore similarity index 100% rename from src-main/.cvsignore rename to src/.cvsignore diff --git a/src-main/Makefile b/src/Makefile similarity index 100% rename from src-main/Makefile rename to src/Makefile diff --git a/src-main/aggregates.cl b/src/aggregates.cl similarity index 59% rename from src-main/aggregates.cl rename to src/aggregates.cl index e4e96f2..bdc7704 100644 --- a/src-main/aggregates.cl +++ b/src/aggregates.cl @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: aggregates.cl,v 1.4 2002/09/30 02:45:24 kevin Exp $ +;;;; $Id: aggregates.cl,v 1.14 2002/09/30 07:51:01 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -45,6 +45,8 @@ of the enum-name name, separator-string, and field-name" #+allegro `((ff:def-foreign-type ,enum-name :int)) #+lispworks `((fli:define-c-typedef ,enum-name :int)) #+cmu `((alien:def-alien-type ,enum-name alien:signed)) + #+(and mcl (not openmcl)) `((def-mcl-type ,enum-name :integer)) + #+openmcl `((ccl::def-foreign-type ,enum-name :int)) (nreverse constants))) cmds)) @@ -59,6 +61,10 @@ of the enum-name name, separator-string, and field-name" #+cmu `(alien:def-alien-type ,name-array (* ,(convert-from-uffi-type type :array))) + #+(and mcl (not openmcl)) + `(def-mcl-type ,name-array '(:array ,type)) + #+openmcl + `(ccl::def-foreign-type ,name-array (:array ,(convert-from-uffi-type type :array))) ) (defun process-struct-fields (name fields) @@ -69,7 +75,8 @@ of the enum-name name, separator-string, and field-name" (push (append (list field-name) (if (eq type :pointer-self) #+cmu `((* (alien:struct ,name))) - #-cmu `((* ,name)) + #+mcl `((:* (:struct ,name))) + #-(or cmu mcl) `((* ,name)) `(,(convert-from-uffi-type type :struct)))) processed))) (nreverse processed))) @@ -82,6 +89,11 @@ of the enum-name name, separator-string, and field-name" `(ff:def-foreign-type ,name (:struct ,@(process-struct-fields name fields))) #+lispworks `(fli:define-c-struct ,name ,@(process-struct-fields name fields)) + #+(and mcl (not openmcl)) + `(ccl:defrecord ,name ,@(process-struct-fields name fields nil)) + #+openmcl + `(ccl::def-foreign-type nil + (:struct ,name ,@(process-struct-fields name fields nil))) ) @@ -93,8 +105,18 @@ of the enum-name name, separator-string, and field-name" `(fli:foreign-slot-value ,obj ,slot) #+cmu `(alien:slot ,obj ,slot) + #+mcl + `(ccl:pref ,obj ,(read-from-string (format nil ":~a.~a" (keyword type) (keyword slot)))) ) +#+mcl +(defmacro set-slot-value (obj type slot value) ;use setf to set values + `(setf (ccl:pref ,obj ,(read-from-string (format nil ":~a.~a" (keyword type) (keyword slot)))) ,value)) + +#+mcl +(defsetf get-slot-value set-slot-value) + + (defmacro get-slot-pointer (obj type slot) #+(or lispworks cmu) (declare (ignore type)) #+allegro @@ -103,7 +125,23 @@ of the enum-name name, separator-string, and field-name" `(fli:foreign-slot-pointer ,obj ,slot) #+cmu `(alien:slot ,obj ,slot) - ) + #+(and mcl (not openmcl)) + `(ccl:%int-to-ptr (+ (ccl:%ptr-to-int ,obj) (the fixnum (ccl:field-info ,type ,slot)))) + #+openmcl + `(let ((field (ccl::%find-foreign-record-type-field ,type ,slot))) + (ccl:%int-to-ptr (+ (ccl:%ptr-to-int ,obj) (the fixnum (ccl::foreign-record-field-offset field))))) +) + +; so we could allow '(:array :long) or deref with other type like :long only +#+mcl +(defun array-type (type) + (let ((result type)) + (when (listp type) + (let ((type-list (if (eq (car type) 'quote) (nth 1 type) type))) + (when (and (listp type-list) (eq (car type-list) :array)) + (setf result (cadr type-list))))) + result)) + (defmacro deref-array (obj type i) "Returns a field from a row" @@ -111,8 +149,30 @@ of the enum-name name, separator-string, and field-name" #+cmu `(alien:deref ,obj ,i) #+lispworks `(fli:dereference ,obj :index ,i) #+allegro `(ff:fslot-value-typed (quote ,(convert-from-uffi-type type :type)) :c ,obj ,i) + #+mcl + (let* ((array-type (array-type type)) + (local-type (convert-from-uffi-type array-type :allocation)) + (accessor (first (macroexpand `(ccl:pref obj ,local-type))))) + `(,accessor + ,obj + (* (the fixnum ,i) ,(size-of-foreign-type local-type)))) ) +; this expands to the %set-xx functions which has different params than %put-xx +#+mcl +(defmacro deref-array-set (obj type i value) + (let* ((array-type (array-type type)) + (local-type (convert-from-uffi-type array-type :allocation)) + (accessor (first (macroexpand `(ccl:pref obj ,local-type)))) + (settor (first (macroexpand `(setf (,accessor obj ,local-type) value))))) + `(,settor + ,obj + (* (the fixnum ,i) ,(size-of-foreign-type local-type)) + ,value))) + +#+mcl +(defsetf deref-array deref-array-set) + (defmacro def-union (name &rest fields) #+allegro `(ff:def-foreign-type ,name (:union ,@(process-struct-fields name fields))) @@ -120,4 +180,9 @@ of the enum-name name, separator-string, and field-name" `(fli:define-c-union ,name ,@(process-struct-fields name fields)) #+cmu `(alien:def-alien-type ,name (alien:union ,name ,@(process-struct-fields name fields))) + #+(and mcl (not openmcl)) + `(ccl:defrecord ,name (:variant ,@(process-struct-fields name fields t))) + #+openmcl + `(ccl::def-foreign-type nil + (:union ,name ,@(process-struct-fields name fields nil))) ) diff --git a/src-corman/corman-uffi.cl b/src/corman/corman-uffi.cl similarity index 99% rename from src-corman/corman-uffi.cl rename to src/corman/corman-uffi.cl index 5694d60..d91d41a 100644 --- a/src-corman/corman-uffi.cl +++ b/src/corman/corman-uffi.cl @@ -35,7 +35,7 @@ Content-Transfer-Encoding: 7bit +;;;; Programmer: "Joe Marshall" +;;;; Date Started: Feb 2002 +;;;; -+;;;; $Id: corman-uffi.cl,v 1.1 2002/09/16 17:57:43 kevin Exp $ ++;;;; $Id: corman-uffi.cl,v 1.5 2002/09/30 07:52:34 kevin Exp $ +;;;; +;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg +;;;; diff --git a/src-main/functions.cl b/src/functions.cl similarity index 67% rename from src-main/functions.cl rename to src/functions.cl index a535876..a797a39 100644 --- a/src-main/functions.cl +++ b/src/functions.cl @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: functions.cl,v 1.1 2002/09/16 17:54:30 kevin Exp $ +;;;; $Id: functions.cl,v 1.10 2002/09/30 07:51:01 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -24,21 +24,41 @@ #+lispworks nil #+allegro '(:void) #+cmu nil + #+(and mcl (not openmcl)) nil + #+mcl (values nil nil) + + ;; args not null + #+(or lispworks allegro cmu (and mcl (not openmcl))) (let (processed) (dolist (arg args) (push (process-one-function-arg arg) processed)) - (nreverse processed)))) + (nreverse processed)) + #+openmcl + (let ((processed nil) + (params nil) + name type) + (dolist (arg args) + (setf name (car arg)) + (setf type (convert-from-uffi-type (cadr arg) :routine)) + ;;(when (and (listp type) (eq (car type) :address)) + ;;(setf type :address)) + (push name params) + (push type processed) + (push name processed)) + (values (nreverse params) (nreverse processed))) + )) (defun process-one-function-arg (arg) (let ((name (car arg)) (type (convert-from-uffi-type (cadr arg) :routine))) #+cmu (list name type :in) - #+(or allegro lispworks) + #+(or allegro lispworks (and mcl (not openmcl))) (if (and (listp type) (listp (car type))) (append (list name) type) (list name type)) - )) + )) + (defun allegro-convert-return-type (type) (if (and (listp type) (not (listp (car type)))) @@ -48,7 +68,7 @@ ;; name is either a string representing foreign name, or a list ;; of foreign-name as a string and lisp name as a symbol (defmacro def-function (names args &key module returning) - #+(or cmu allegro) (declare (ignore module)) + #+(or cmu allegro mcl) (declare (ignore module)) (let* ((result-type (convert-from-uffi-type returning :return)) (function-args (process-function-args args)) @@ -71,6 +91,17 @@ ,@(if module (list :module module) (values)) :result-type ,result-type :calling-convention :cdecl) + #+(and mcl (not openmcl)) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (ccl:define-entry-point (,lisp-name ,foreign-name) + ,function-args + ,result-type)) + #+(and openmcl darwinppc-target) + (setf foreign-name (concatenate 'string "_" foreign-name)) + #+openmcl + (multiple-value-bind (params args) (process-function-args args) + `(defun ,lisp-name ,params + (ccl::external-call ,foreign-name ,@args ,result-type))) )) diff --git a/src-main/libraries.cl b/src/libraries.cl similarity index 82% rename from src-main/libraries.cl rename to src/libraries.cl index 0cf1e0c..96807ee 100644 --- a/src-main/libraries.cl +++ b/src/libraries.cl @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: libraries.cl,v 1.3 2002/09/30 01:57:32 kevin Exp $ +;;;; $Id: libraries.cl,v 1.18 2002/09/30 07:51:01 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -25,8 +25,9 @@ (defun default-foreign-library-type () "Returns string naming default library type for platform" #+(or win32 mswindows) "dll" + #+macosx "dylib" #-(or win32 mswindows macosx) "so" - #+macosx "dylib") +) (defun find-foreign-library (names directories &key types drive-letters) "Looks for a foreign library. directories can be a single @@ -75,6 +76,7 @@ library type if type is not specified." #+allegro (declare (ignore module supporting-libraries)) #+lispworks (declare (ignore supporting-libraries)) #+cmu (declare (ignore module)) + #+openmcl (declare (ignore module supporting-libraries)) (when (and filename (probe-file filename)) (if (pathnamep filename) ;; ensure filename is a string to check if @@ -84,22 +86,22 @@ library type if type is not specified." (find filename *loaded-libraries* :test #'string-equal)) t ;; return T, but don't reload library (progn - #+cmu - (let ((type (pathname-type (parse-namestring filename)))) - (if (equal type "so") - (sys::load-object-file filename) - (alien:load-foreign filename - :libraries - (convert-supporting-libraries-to-string - supporting-libraries)))) - #+lispworks (fli:register-module module :real-name filename) - #+allegro (load filename) - #+openmcl (ccl:open-shared-library filename) - #+(and mcl (not openmcl)) (ccl:add-to-shared-library-search-path filename t) + (when + #+cmu + (let ((type (pathname-type (parse-namestring filename)))) + (if (equal type "so") + (sys::load-object-file filename) + (alien:load-foreign filename + :libraries + (convert-supporting-libraries-to-string + supporting-libraries)))) + #+lispworks (fli:register-module module :real-name filename) + #+allegro (load filename) + #+openmcl (ccl:open-shared-library filename) + #+(and mcl (not openmcl)) (ccl:add-to-shared-library-search-path filename t) - (push filename *loaded-libraries*) - t))) - ) + (push filename *loaded-libraries*) + t))))) (defun convert-supporting-libraries-to-string (libs) (let (lib-load-list) diff --git a/src/objects-mcl.cl b/src/objects-mcl.cl new file mode 100644 index 0000000..75eccb2 --- /dev/null +++ b/src/objects-mcl.cl @@ -0,0 +1,42 @@ +;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- +;;;; ************************************************************************* +;;;; FILE IDENTIFICATION +;;;; +;;;; Name: readmacros-mcl.cl +;;;; Purpose: UFFI source to handle objects and pointers +;;;; Programmer: Kevin M. Rosenberg +;;;; Date Started: Feb 2002 +;;;; +;;;; $Id: objects-mcl.cl,v 1.1 2002/09/30 07:51:01 kevin Exp $ +;;;; +;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg +;;;; +;;;; 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) + +;; trap macros don't work right directly in the macros +(eval-when (:compile-toplevel :load-toplevel :execute) + + #+(and mcl (not openmcl)) + (defun new-ptr (size) + (#_NewPtr size)) + + #+(and mcl (not openmcl)) + (defun dispose-ptr (ptr) + (#_DisposePtr ptr)) + + #+openmcl + (defmacro new-ptr (size) + `(ccl::malloc ,size)) + + #+openmcl + (defmacro dispose-ptr (ptr) + `(ccl::free ,ptr)) + ) + + diff --git a/src-main/objects.cl b/src/objects.cl similarity index 66% rename from src-main/objects.cl rename to src/objects.cl index d9af1dc..3500301 100644 --- a/src-main/objects.cl +++ b/src/objects.cl @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: objects.cl,v 1.1 2002/09/16 17:54:30 kevin Exp $ +;;;; $Id: objects.cl,v 1.24 2002/09/30 07:51:01 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -29,7 +29,10 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." #+lispworks `(fli:allocate-foreign-object :type ',(convert-from-uffi-type type :allocate)) #+allegro - `(ff:allocate-fobject ,(convert-from-uffi-type type :allocate) :c)) + `(ff:allocate-fobject ,(convert-from-uffi-type type :allocate) :c) + #+mcl + `(new-ptr ,(size-of-foreign-type (convert-from-uffi-type type :allocation))) + ) (progn #+cmu `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size) @@ -37,8 +40,9 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." `(fli:allocate-foreign-object :type ',(convert-from-uffi-type type :allocate) :nelems ,size) #+allegro `(ff:allocate-fobject '(:array ,(convert-from-uffi-type (eval type) :allocate) ,(eval size)) :c) - ) - )) + #+mcl + `(new-ptr (* ,size ,(size-of-foreign-type (convert-from-uffi-type type :allocation)))) + ))) (defmacro free-foreign-object (obj) #+cmu @@ -47,12 +51,15 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." `(fli:free-foreign-object ,obj) #+allegro `(ff:free-fobject ,obj) + #+mcl + `(dispose-ptr ,obj) ) (defmacro null-pointer-p (obj) #+lispworks `(fli:null-pointer-p ,obj) #+allegro `(zerop ,obj) #+cmu `(alien:null-alien ,obj) + #+mcl `(ccl:%null-ptr-p ,obj) ) (defmacro size-of-foreign-type (type) @@ -60,15 +67,22 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." #+allegro `(ff:sizeof-fobject ,type) #+cmu `(alien:alien-size ,type) #+clisp `(values (ffi:size-of ,type)) + #+(and mcl (not openmcl)) + `(let ((mcl-type (ccl:find-mactype ,type nil t))) + (if mcl-type + (ccl::mactype-record-size mcl-type) + (ccl::record-descriptor-length (ccl:find-record-descriptor ,type t t)))) ;error if not a record + #+opencml `(ccl::%foreign-type-or-record-size ,type :bytes) ) (defmacro make-null-pointer (type) - #+(or allegro cmu) (declare (ignore type)) + #+(or allegro cmu mcl) (declare (ignore type)) #+cmu `(system:int-sap 0) #+allegro 0 #+lispworks `(fli:make-pointer :address 0 :type ,type) + #+mcl `(ccl:%null-ptr) ) (defmacro char-array-to-pointer (obj) @@ -76,6 +90,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." #+lispworks `(fli:make-pointer :type '(:unsigned :char) :address (fli:pointer-address ,obj)) #+allegro obj + #+mcl obj ) (defmacro deref-pointer (ptr type) @@ -84,26 +99,31 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." #+cmu `(alien:deref ,ptr) #+lispworks `(fli:dereference ,ptr) #+allegro `(ff:fslot-value-typed ,(convert-from-uffi-type type :deref) :c ,ptr) -) + #+mcl `(ccl:pref ,ptr ,(convert-from-uffi-type type :deref)) + ) + +#+mcl +(defmacro deref-pointer-set (ptr type value) + `(setf (ccl:pref ,ptr ,(convert-from-uffi-type type :deref)) ,value)) + +#+mcl +(defsetf deref-pointer deref-pointer-set) -#+lispworks ;; with LW, deref is a character +#+(or lispworks (and mcl (not openmcl))) ;; with LW, deref is a character (defmacro ensure-char-character (obj) - obj - ) + obj) -#+(or allegro cmu) +#+(or allegro cmu openmcl) (defmacro ensure-char-character (obj) - `(code-char ,obj) - ) + `(code-char ,obj)) -#+lispworks +#+(or lispworks (and mcl (not openmcl))) (defmacro ensure-char-integer (obj) `(char-code ,obj)) -#+(or allegro cmu) +#+(or allegro cmu openmcl) (defmacro ensure-char-integer (obj) - obj - ) ;; (* :char) dereference is already an integer + obj) (defmacro pointer-address (obj) #+cmu @@ -112,9 +132,12 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." `(fli:pointer-address ,obj) #+allegro obj + #+mcl + `(ccl:%ptr-to-int ,obj) ) ;; TYPE is evaluated. +#-mcl (defmacro with-foreign-object ((var type) &rest body) #-(or cmu lispworks) ; default version `(let ((,var (allocate-foreign-object ,type))) @@ -132,7 +155,12 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." ,@body) ) +#+mcl +(defmacro with-foreign-object ((var type) &rest body) + `(with-foreign-objects ((,var ,type)) + ,@body)) +#-mcl (defmacro with-foreign-objects (bindings &rest body) (if bindings `(with-foreign-object ,(car bindings) @@ -140,5 +168,16 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated." ,@body)) `(progn ,@body))) - +#+mcl +(defmacro with-foreign-objects (bindings &rest body) + (let ((params nil) type count) + (dolist (spec (reverse bindings)) ;keep order - macroexpands to let* + (setf type (convert-from-uffi-type (eval (nth 1 spec)) :allocate)) + (setf count 1) + (when (and (listp type) (eq (first type) :array)) + (setf count (nth 2 type)) + (unless (integerp count) (error "Invalid size for array: ~a" type)) + (setf type (nth 1 type))) + (push (list (first spec) (* count (size-of-foreign-type type))) params)) + `(ccl:%stack-block ,params ,@body))) diff --git a/src-main/package.cl b/src/package.cl similarity index 100% rename from src-main/package.cl rename to src/package.cl diff --git a/src-main/primitives.cl b/src/primitives.cl similarity index 67% rename from src-main/primitives.cl rename to src/primitives.cl index 08ef00b..9a982be 100644 --- a/src-main/primitives.cl +++ b/src/primitives.cl @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: primitives.cl,v 1.3 2002/09/30 02:45:24 kevin Exp $ +;;;; $Id: primitives.cl,v 1.24 2002/09/30 07:51:01 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -19,6 +19,31 @@ (declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0))) (in-package :uffi) +#+mcl +(defvar *keyword-package* (find-package "KEYWORD")) + +#+mcl +; MCL and OpenMCL expect a lot of FFI elements to be keywords (e.g. struct field names in OpenMCL) +; So this provides a function to convert any quoted symbols to keywords. +(defun keyword (obj) + (cond ((keywordp obj) + obj) + ((null obj) + nil) + ((symbolp obj) + (intern (symbol-name obj) *keyword-package*)) + ((and (listp obj) (eq (car obj) 'cl:quote)) + (keyword (cadr obj))) + ((stringp obj) + (intern obj *keyword-package*)) + (t + obj))) + +; Wrapper for unexported function we have to use +#+(and mcl (not openmcl)) +(defmacro def-mcl-type (name type) + `(ccl::def-mactype ,(keyword name) (ccl:find-mactype ,type))) + (defmacro def-constant (name value &key (export nil)) "Macro to define a constant and to export it" `(eval-when (:compile-toplevel :load-toplevel :execute) @@ -29,9 +54,9 @@ (defmacro def-type (name type) "Generates a (deftype) statement for CL. Currently, only CMUCL supports takes advantage of this optimization." - #+(or lispworks allegro) + #+(or lispworks allegro mcl) (declare (ignore type)) - #+(or lispworks allegro) + #+(or lispworks allegro mcl) `(deftype ,name () t) #+cmu `(deftype ,name () '(alien:alien ,(convert-from-uffi-type type :declare))) @@ -48,6 +73,14 @@ supports takes advantage of this optimization." #+allegro `(ff:def-foreign-type ,name ,(convert-from-uffi-type type :type)) #+cmu `(alien:def-alien-type ,name ,(convert-from-uffi-type type :type)) #+sbcl `(sb-alien:def-alien-type ,name ,(convert-from-uffi-type type :type)) + #+mcl + (let ((type (convert-from-uffi-type uffi-type :type))) + (unless (or (keywordp type) (consp type)) + (setf type `(quote ,type))) + #+(and mcl (not openmcl)) + `(def-mcl-type ,(keyword name) ,type) + #+openmcl + `(ccl::def-foreign-type ,(keyword name) ,type)) ) (eval-when (:compile-toplevel :load-toplevel :execute) @@ -138,6 +171,7 @@ supports takes advantage of this optimization." (:long . :long) (:unsigned-long . :unsigned-long) (:float . :float) (:double . :double) (:array . :array))) + #+lispworks (setq +type-conversion-list+ '((* . :pointer) (:void . :void) @@ -155,6 +189,35 @@ supports takes advantage of this optimization." (:float . :float) (:double . :double) (:array . :c-array))) +#+(and mcl (not openmcl)) +(defconstant +type-conversion-list+ + '((* . :pointer) (:void . :void) + (:short . :short) (:unsigned-short . :unsigned-short) + (:pointer-void . :pointer) + (:cstring . :string) + (:char . :character) + (:unsigned-char . :unsigned-byte) + (:byte . :signed-byte) (:unsigned-byte . :unsigned-byte) + (:int . :long) (:unsigned-int . :unsigned-long) + (:long . :long) (:unsigned-long . :unsigned-long) + (:float . :single-float) (:double . :double-float) + (:array . :array))) + +#+openmcl +(defconstant +type-conversion-list+ + '((* . :address) (:void . :void) + (:short . :short) (:unsigned-short . :unsigned-short) + (:pointer-void . :address) + (:cstring . :address) + (:char . :signed-char) + (:unsigned-char . :unsigned-char) + (:byte . :signed-byte) (:unsigned-byte . :unsigned-byte) + (:int . :int) (:unsigned-int . :unsigned-int) + (:long . :long) (:unsigned-long . :unsigned-long) + (:long-long . :signed-doubleword) (:unsigned-long-long . :unsigned-doubleword) + (:float . :single-float) (:double . :double-float) + (:array . :array))) + (dolist (type +type-conversion-list+) (setf (gethash (car type) +type-conversion-hash+) (cdr type))) @@ -166,9 +229,10 @@ supports takes advantage of this optimization." (let ((found-type (gethash type +type-conversion-hash+))) (if found-type found-type - type))) + #-mcl type + #+mcl (keyword type)))) -(defun convert-from-uffi-type (type context) +(defun %convert-from-uffi-type (type context) "Converts from a uffi type to an implementation specific type" (if (atom type) (cond @@ -186,6 +250,8 @@ supports takes advantage of this optimization." ((and (eq context :return) (eq type :cstring)) (basic-convert-from-uffi-type :cstring-returning)) + #+(and mcl (not openmcl)) + ((and (eq type :void) (eq context :return)) nil) (t (basic-convert-from-uffi-type type))) (let ((sub-type (car type))) @@ -193,14 +259,27 @@ supports takes advantage of this optimization." (cl:quote (convert-from-uffi-type (cadr type) context)) (:struct-pointer - #+openmcl `(:* (:struct ,(convert-from-uffi-type (cadr type) :struct))) - #-openmcl (convert-from-uffi-type (list '* (cadr type)) :struct) + #+mcl `(:* (:struct ,(%convert-from-uffi-type (cadr type) :struct))) + #-mcl (%convert-from-uffi-type (list '* (cadr type)) :struct) ) (:struct - #+openmcl `(:struct ,(convert-from-uffi-type (cadr type) :struct)) - #-openmcl (convert-from-uffi-type (cadr type) :struct) + #+mcl `(:struct ,(%convert-from-uffi-type (cadr type) :struct)) + #-mcl (%convert-from-uffi-type (cadr type) :struct) ) (t - (cons (convert-from-uffi-type (first type) context) - (convert-from-uffi-type (rest type) context))))))) + (cons (%convert-from-uffi-type (first type) context) + (%convert-from-uffi-type (rest type) context))))))) + +(defun convert-from-uffi-type (type context) + (let ((result (%convert-from-uffi-type type context))) + (cond + ((atom result) result) + #+openmcl + ((eq (car result) :address) + (if (eq context :struct) + (append '(:*) (cdr result)) + :address)) + #+(and mcl (not openmcl)) + ((and (eq (car result) :pointer) (eq context :allocation) :pointer)) + (t result)))) diff --git a/src/readmacros-mcl.cl b/src/readmacros-mcl.cl new file mode 100644 index 0000000..74dc32f --- /dev/null +++ b/src/readmacros-mcl.cl @@ -0,0 +1,39 @@ +;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- +;;;; ************************************************************************* +;;;; FILE IDENTIFICATION +;;;; +;;;; Name: readmacros-mcl.cl +;;;; Purpose: This file holds functions using read macros for MCL +;;;; Programmer: Kevin M. Rosenberg/John Desoi +;;;; Date Started: Feb 2002 +;;;; +;;;; $Id: readmacros-mcl.cl,v 1.1 2002/09/30 07:56:21 kevin Exp $ +;;;; +;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg +;;;; +;;;; 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) + + +;; trap macros don't work right directly in the macros +#+(and mcl (not openmcl)) +(defun new-ptr (size) + (#_NewPtr size)) + +#+(and mcl (not openmcl)) +(defun dispose-ptr (ptr) + (#_DisposePtr ptr)) + +#+openmcl +(defmacro new-ptr (size) + `(ccl::malloc ,size)) + +#+openmcl +(defmacro dispose-ptr (ptr) + `(ccl::free ,ptr)) + diff --git a/src/readmacros-mcl.lisp b/src/readmacros-mcl.lisp new file mode 100644 index 0000000..ac20c36 --- /dev/null +++ b/src/readmacros-mcl.lisp @@ -0,0 +1,39 @@ +;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: UFFI -*- +;;;; ************************************************************************* +;;;; FILE IDENTIFICATION +;;;; +;;;; Name: readmacros-mcl.cl +;;;; Purpose: This file holds functions using read macros for MCL +;;;; Programmer: Kevin M. Rosenberg/John Desoi +;;;; Date Started: Feb 2002 +;;;; +;;;; $Id: readmacros-mcl.lisp,v 1.1 2002/09/30 07:51:01 kevin Exp $ +;;;; +;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg +;;;; +;;;; 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) + + +;; trap macros don't work right directly in the macros +#+(and mcl (not openmcl)) +(defun new-ptr (size) + (#_NewPtr size)) + +#+(and mcl (not openmcl)) +(defun dispose-ptr (ptr) + (#_DisposePtr ptr)) + +#+openmcl +(defmacro new-ptr (size) + `(ccl::malloc ,size)) + +#+openmcl +(defmacro dispose-ptr (ptr) + `(ccl::free ,ptr)) + diff --git a/src-main/strings.cl b/src/strings.cl similarity index 84% rename from src-main/strings.cl rename to src/strings.cl index 3061644..b47b863 100644 --- a/src-main/strings.cl +++ b/src/strings.cl @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Feb 2002 ;;;; -;;;; $Id: strings.cl,v 1.2 2002/09/19 03:33:25 kevin Exp $ +;;;; $Id: strings.cl,v 1.22 2002/09/30 07:51:01 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -24,7 +24,8 @@ #+cmu nil #+allegro 0 #+lispworks (fli:make-pointer :address 0 :type '(:unsigned :char)) - #-(or cmu allegro lispworks) nil + #+mcl (ccl:%nul-ptr) + #-(or cmu allegro lispworks mcl) nil ) (defmacro convert-from-cstring (obj) @@ -38,6 +39,12 @@ that LW/CMU automatically converts strings from c-calls." (if (zerop ,stored) nil (values (excl:native-to-string ,stored))))) + #+mcl + (let ((stored (gensym))) + `(let ((,stored ,obj)) + (if (ccl:%null-ptr-p ,stored) + nil + (values (ccl:%get-cstring ,stored))))) ) (defmacro convert-to-cstring (obj) @@ -47,6 +54,12 @@ that LW/CMU automatically converts strings from c-calls." `(if (null ,obj) 0 (values (excl:string-to-native ,obj))) + #+mcl + `(if (null ,obj) + +null-cstring-pointer+ + (let ((ptr (new-ptr (1+ (length ,obj))))) + (ccl:%put-cstring ptr ,obj) + ptr)) ) (defmacro free-cstring (obj) @@ -55,6 +68,9 @@ that LW/CMU automatically converts strings from c-calls." #+allegro `(unless (zerop obj) (ff:free-fobject ,obj)) + #+mcl + `(unless (ccl:%null-ptr-p ,obj) + (dispose-ptr ,obj)) ) (defmacro with-cstring ((cstring lisp-string) &body body) @@ -67,6 +83,12 @@ that LW/CMU automatically converts strings from c-calls." `(excl:with-native-string (,acl-native ,lisp-string) (let ((,cstring (if ,lisp-string ,acl-native 0))) ,@body))) + #+mcl + `(if (stringp ,lisp-string) + (ccl:with-cstrs ((,foreign-string ,lisp-string)) + ,@body) + (let ((,foreign-string +null-cstring-pointer+)) + ,@body)) ) (defmacro with-cstrings (bindings &rest body) @@ -105,7 +127,13 @@ that LW/CMU automatically converts strings from c-calls." (setf (alien:deref ,storage ,i) (char-code (char ,obj ,i)))) (setf (alien:deref ,storage ,size) 0)) ,storage)))) - ) + #+mcl + `(if (null ,obj) + +null-cstring-pointer+ + (let ((ptr (new-ptr (1+ (length ,obj))))) + (ccl:%put-cstring ptr ,obj) + ptr)) + ) ;; Either length or null-terminated-p must be non-nil @@ -133,6 +161,12 @@ that LW/CMU automatically converts strings from c-calls." (cmucl-naturalize-cstring (alien:alien-sap ,obj) :length ,length :null-terminated-p ,null-terminated-p)) + #+mcl + (declare (ignore null-terminated-p)) + #+mcl + `(if (ccl:%null-ptr-p ,obj) + nil + (ccl:%get-cstring ,obj 0 ,@(if length (list length) nil))) ) @@ -155,6 +189,10 @@ that LW/CMU automatically converts strings from c-calls." (declare (ignore unsigned)) #+allegro `(ff:allocate-fobject :char :c ,size) + #+mcl + (declare (ignore unsigned)) + #+mcl + `(new-ptr ,size) ) (defmacro with-foreign-string ((foreign-string lisp-string) &body body) diff --git a/uffi.asd b/uffi.asd index a373571..dfb8608 100644 --- a/uffi.asd +++ b/uffi.asd @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Aug 2002 ;;;; -;;;; $Id: uffi.asd,v 1.15 2002/09/25 12:44:59 kevin Exp $ +;;;; $Id: uffi.asd,v 1.16 2002/09/30 07:51:00 kevin Exp $ ;;;; ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -19,7 +19,7 @@ (declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0))) (in-package :asdf) -#+(or allegro lispworks cmu openmcl mcl) +#+(or allegro lispworks cmu mcl) (defsystem uffi :name "cl-uffi" :author "Kevin M. Rosenberg " @@ -33,27 +33,16 @@ (pushnew :uffi cl:*features*)) :components - ( - #+(or cmu sbcl allegro lispworks) - (:module :src-main - :components - ((:file "package") - (:file "primitives" :depends-on ("package")) - (:file "strings" :depends-on ("primitives")) - (:file "objects" :depends-on ("primitives")) - (:file "aggregates" :depends-on ("primitives")) - (:file "functions" :depends-on ("primitives")) - (:file "libraries" :depends-on ("package")))) - #+mcl - (:module :src-mcl - :components - ((:file "package") - (:file "primitives" :depends-on ("package")) - (:file "strings" :depends-on ("primitives")) - (:file "objects" :depends-on ("primitives")) - (:file "aggregates" :depends-on ("primitives")) - (:file "functions" :depends-on ("primitives")) - (:file "libraries" :depends-on ("package")))) + ((:module :src + :components + ((:file "package") + (:file "primitives" :depends-on ("package")) + #+mcl (:file "readmacros-mcl" :depends-on ("package")) + (:file "strings" :depends-on ("primitives")) + (:file "objects" :depends-on ("primitives")) + (:file "aggregates" :depends-on ("primitives")) + (:file "functions" :depends-on ("primitives")) + (:file "libraries" :depends-on ("package")))) #+cormanlisp (:module :src-corman :components @@ -61,11 +50,11 @@ )) -#+(or allegro lispworks cmu openmcl mcl) +#+(or allegro lispworks cmu mcl) (defmethod source-file-type ((c cl-source-file) (s (eql (find-system :uffi)))) "cl") -#+(or allegro lispworks cmu openmcl mcl) +#+(or allegro lispworks cmu mcl) (when (ignore-errors (find-class 'load-compiled-op)) (defmethod perform :after ((op load-compiled-op) (c (eql (find-system :uffi)))) (pushnew :uffi cl:*features*))) -- 2.34.1