diff options
Diffstat (limited to 'share/swig/2.0.11/uffi/uffi.swg')
-rw-r--r-- | share/swig/2.0.11/uffi/uffi.swg | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/share/swig/2.0.11/uffi/uffi.swg b/share/swig/2.0.11/uffi/uffi.swg new file mode 100644 index 0000000..41b0859 --- /dev/null +++ b/share/swig/2.0.11/uffi/uffi.swg @@ -0,0 +1,101 @@ +/* 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 %{ +(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 +%} |