|
|
/* Define a C preprocessor symbol that can be used in interface files |
|
|
to distinguish between the SWIG language modules. */ |
|
|
|
|
|
#define SWIG_UFFI |
|
|
|
|
|
/* Typespecs for basic types. */ |
|
|
|
|
|
%typemap(ffitype) char ":char"; |
|
|
%typemap(ffitype) unsigned char ":unsigned-char"; |
|
|
%typemap(ffitype) signed char ":char"; |
|
|
%typemap(ffitype) short ":short"; |
|
|
%typemap(ffitype) signed short ":short"; |
|
|
%typemap(ffitype) unsigned short ":unsigned-short"; |
|
|
%typemap(ffitype) int ":int"; |
|
|
%typemap(ffitype) signed int ":int"; |
|
|
%typemap(ffitype) unsigned int ":unsigned-int"; |
|
|
%typemap(ffitype) long ":long"; |
|
|
%typemap(ffitype) signed long ":long"; |
|
|
%typemap(ffitype) unsigned long ":unsigned-long"; |
|
|
%typemap(ffitype) float ":float"; |
|
|
%typemap(ffitype) double ":double"; |
|
|
%typemap(ffitype) char * ":cstring"; |
|
|
%typemap(ffitype) void * ":pointer-void"; |
|
|
%typemap(ffitype) void ":void"; |
|
|
|
|
|
// FIXME: This is guesswork |
|
|
typedef long size_t; |
|
|
|
|
|
%wrapper %{ |
|
|
;; $Id: uffi.swg 7358 2005-08-09 15:09:15Z mkoeppe $ |
|
|
|
|
|
(eval-when (compile eval) |
|
|
|
|
|
;;; You can define your own identifier converter if you want. |
|
|
;;; Use the -identifier-converter command line argument to |
|
|
;;; specify its name. |
|
|
|
|
|
(defun identifier-convert-null (id &key type) |
|
|
(declare (ignore type)) |
|
|
(read-from-string id)) |
|
|
|
|
|
(defun identifier-convert-lispify (cname &key type) |
|
|
(assert (stringp cname)) |
|
|
(if (eq type :constant) |
|
|
(setf cname (format nil "*~A*" cname))) |
|
|
(setf cname (replace-regexp cname "_" "-")) |
|
|
(let ((lastcase :other) |
|
|
newcase char res) |
|
|
(dotimes (n (length cname)) |
|
|
(setf char (schar cname n)) |
|
|
(if* (alpha-char-p char) |
|
|
then |
|
|
(setf newcase (if (upper-case-p char) :upper :lower)) |
|
|
|
|
|
(when (or (and (eq lastcase :upper) (eq newcase :lower)) |
|
|
(and (eq lastcase :lower) (eq newcase :upper))) |
|
|
;; case change... add a dash |
|
|
(push #\- res) |
|
|
(setf newcase :other)) |
|
|
|
|
|
(push (char-downcase char) res) |
|
|
|
|
|
(setf lastcase newcase) |
|
|
|
|
|
else |
|
|
(push char res) |
|
|
(setf lastcase :other))) |
|
|
(read-from-string (coerce (nreverse res) 'string)))) |
|
|
|
|
|
(defun identifier-convert-low-level (cname &key type) |
|
|
(assert (stringp cname)) |
|
|
(if (eq type :constant) |
|
|
(setf cname (format nil "+~A+" cname))) |
|
|
(setf cname (substitute #\- #\_ cname)) |
|
|
(if (eq type :operator) |
|
|
(setf cname (format nil "%~A" cname))) |
|
|
(if (eq type :constant-function) |
|
|
nil) |
|
|
(read-from-string cname)) |
|
|
|
|
|
|
|
|
|
|
|
(defmacro swig-defconstant (string value &key (export T)) |
|
|
(let ((symbol (funcall *swig-identifier-converter* string :type :constant))) |
|
|
`(eval-when (compile load eval) |
|
|
(uffi:def-constant ,symbol ,value ,export)))) |
|
|
|
|
|
(defmacro swig-defun (name &rest rest) |
|
|
(let ((symbol (funcall *swig-identifier-converter* name :type :operator))) |
|
|
`(eval-when (compile load eval) |
|
|
(uffi:def-function (,name ,symbol) ,@rest) |
|
|
(export (quote ,symbol))))) |
|
|
|
|
|
(defmacro swig-def-struct (name &rest fields) |
|
|
"Declare a struct object" |
|
|
(let ((symbol (funcall *swig-identifier-converter* name :type :type))) |
|
|
`(eval-when (compile load eval) |
|
|
(uffi:def-struct ,symbol ,@fields) |
|
|
(export (quote ,symbol))))) |
|
|
|
|
|
|
|
|
) ;; eval-when |
|
|
%}
|
|
|
|