1/* Define a C preprocessor symbol that can be used in interface files
2   to distinguish between the SWIG language modules. */
3
4#define SWIG_CFFI
5
6/* Typespecs for basic types. */
7
8%typemap(cin) void ":void";
9
10%typemap(cin) char ":char";
11%typemap(cin) char * ":string";
12%typemap(cin) unsigned char ":unsigned-char";
13%typemap(cin) signed char ":char";
14
15%typemap(cin) short ":short";
16%typemap(cin) signed short ":short";
17%typemap(cin) unsigned short ":unsigned-short";
18
19%typemap(cin) int ":int";
20%typemap(cin) signed int ":int";
21%typemap(cin) unsigned int ":unsigned-int";
22
23%typemap(cin) long ":long";
24%typemap(cin) signed long ":long";
25%typemap(cin) unsigned long ":unsigned-long";
26
27%typemap(cin) long long ":long-long";
28%typemap(cin) signed long long ":long-long";
29%typemap(cin) unsigned long long ":unsigned-long-long";
30
31%typemap(cin) float ":float";
32%typemap(cin) double ":double";
33%typemap(cin) SWIGTYPE ":pointer";
34
35%typemap(cout) void ":void";
36
37%typemap(cout) char ":char";
38%typemap(cout) char * ":string";
39%typemap(cout) unsigned char ":unsigned-char";
40%typemap(cout) signed char ":char";
41
42%typemap(cout) short ":short";
43%typemap(cout) signed short ":short";
44%typemap(cout) unsigned short ":unsigned-short";
45
46%typemap(cout) int ":int";
47%typemap(cout) signed int ":int";
48%typemap(cout) unsigned int ":unsigned-int";
49
50%typemap(cout) long ":long";
51%typemap(cout) signed long ":long";
52%typemap(cout) unsigned long ":unsigned-long";
53
54%typemap(cout) long long ":long-long";
55%typemap(cout) signed long long ":long-long";
56%typemap(cout) unsigned long long ":unsigned-long-long";
57
58%typemap(cout) float ":float";
59%typemap(cout) double ":double";
60%typemap(cout) SWIGTYPE ":pointer";
61
62
63%typemap(ctype) bool                       "int";
64%typemap(ctype) char, unsigned char, signed char,
65                short, signed short, unsigned short,
66                int, signed int, unsigned int,
67                long, signed long, unsigned long,
68                float, double, long double, char *, void *, void,
69                enum SWIGTYPE, SWIGTYPE *,
70                SWIGTYPE[ANY], SWIGTYPE &  "$1_ltype";
71%typemap(ctype) SWIGTYPE                   "$&1_type";
72
73%typemap(in) bool                          "$1 = (bool)$input;";
74%typemap(in) char, unsigned char, signed char,
75             short, signed short, unsigned short,
76             int, signed int, unsigned int,
77             long, signed long, unsigned long,
78             float, double, long double, char *, void *, void,
79             enum SWIGTYPE, SWIGTYPE *,
80             SWIGTYPE[ANY], SWIGTYPE &     "$1 = $input;";
81%typemap(in) SWIGTYPE                      "$1 = *$input;";
82
83%typemap(out) void                         "";
84%typemap(out) bool                          "$result = (int)$1;";
85%typemap(out) char, unsigned char, signed char,
86              short, signed short, unsigned short,
87              int, signed int, unsigned int,
88              long, signed long, unsigned long,
89              float, double, long double, char *, void *,
90              enum SWIGTYPE, SWIGTYPE *,
91              SWIGTYPE[ANY], SWIGTYPE &    "$result = $1;";
92#ifdef __cplusplus
93%typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
94#else
95%typemap(out) SWIGTYPE {
96  $result = ($&1_ltype) malloc(sizeof($1_type));
97  memmove($result, &$1, sizeof($1_type));
98}
99#endif
100
101%typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; };
102%typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; };
103%typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; };
104%typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; };
105%typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; };
106%typecheck(SWIG_TYPECHECK_INTEGER)
107                    unsigned char, signed char,
108                    short, signed short, unsigned short,
109                    int, signed int, unsigned int,
110                    long, signed long, unsigned long,
111                    enum SWIGTYPE { $1 = 1; };
112%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &,
113                                   SWIGTYPE[ANY], SWIGTYPE { $1 = 1; };
114/* This maps C/C++ types to Lisp classes for overload dispatch */
115
116%typemap(lisptype) bool "cl:boolean";
117%typemap(lisptype) char "cl:character";
118%typemap(lisptype) unsigned char "cl:integer";
119%typemap(lisptype) signed char "cl:integer";
120
121%typemap(lispclass) bool "t";
122%typemap(lispclass) char "cl:character";
123%typemap(lispclass) unsigned char, signed char,
124                    short, signed short, unsigned short,
125                    int, signed int, unsigned int,
126                    long, signed long, unsigned long,
127                    enum SWIGTYPE       "cl:integer";
128/* CLOS methods can't be specialized on single-float or double-float */
129%typemap(lispclass) float "cl:number";
130%typemap(lispclass) double "cl:number";
131%typemap(lispclass) char * "cl:string";
132
133/* Array reference typemaps */
134%apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) }
135
136/* const pointers */
137%apply SWIGTYPE * { SWIGTYPE *const }
138
139%{
140
141#ifdef __cplusplus
142#  define EXTERN   extern "C"
143#else
144#  define EXTERN   extern
145#endif
146
147#define EXPORT   EXTERN SWIGEXPORT
148
149#include <string.h>
150%}
151
152%insert("swiglisp") %{
153;;;SWIG wrapper code starts here
154
155(cl:defmacro defanonenum (cl:&body enums)
156   "Converts anonymous enums to defconstants."
157  `(cl:progn ,@(cl:loop for value in enums
158                        for index = 0 then (cl:1+ index)
159                        when (cl:listp value) do (cl:setf index (cl:second value)
160                                                          value (cl:first value))
161                        collect `(cl:defconstant ,value ,index))))
162
163(cl:eval-when (:compile-toplevel :load-toplevel)
164  (cl:unless (cl:fboundp 'swig-lispify)
165    (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*))
166      (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst)))
167                    (cl:cond
168                      ((cl:null lst)
169                       rest)
170                      ((cl:upper-case-p c)
171                       (helper (cl:cdr lst) 'upper
172                               (cl:case last
173                                 ((lower digit) (cl:list* c #\- rest))
174                                 (cl:t (cl:cons c rest)))))
175                      ((cl:lower-case-p c)
176                       (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest)))
177                      ((cl:digit-char-p c)
178                       (helper (cl:cdr lst) 'digit
179                               (cl:case last
180                                 ((upper lower) (cl:list* c #\- rest))
181                                 (cl:t (cl:cons c rest)))))
182                      ((cl:char-equal c #\_)
183                       (helper (cl:cdr lst) '_ (cl:cons #\- rest)))
184                      (cl:t
185                       (cl:error "Invalid character: ~A" c)))))
186        (cl:let ((fix (cl:case flag
187                        ((constant enumvalue) "+")
188                        (variable "*")
189                        (cl:t ""))))
190          (cl:intern
191           (cl:concatenate
192            'cl:string
193            fix
194            (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil))
195            fix)
196           package))))))
197
198;;;SWIG wrapper code ends here
199%}
200
201#ifdef __cplusplus
202%typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
203#else
204%typemap(out) SWIGTYPE {
205  $result = ($&1_ltype) malloc(sizeof($1_type));
206  memmove($result, &$1, sizeof($1_type));
207}
208#endif
209
210//////////////////////////////////////////////////////////////
211
212/* name conversion for overloaded operators. */
213#ifdef __cplusplus
214%rename(__add__)	     *::operator+;
215%rename(__pos__)	     *::operator+();
216%rename(__pos__)	     *::operator+() const;
217
218%rename(__sub__)	     *::operator-;
219%rename(__neg__)	     *::operator-() const;
220%rename(__neg__)	     *::operator-();
221
222%rename(__mul__)	     *::operator*;
223%rename(__deref__)	     *::operator*();
224%rename(__deref__)	     *::operator*() const;
225
226%rename(__div__)	     *::operator/;
227%rename(__mod__)	     *::operator%;
228%rename(__logxor__)	     *::operator^;
229%rename(__logand__)	     *::operator&;
230%rename(__logior__)	     *::operator|;
231%rename(__lognot__)	     *::operator~();
232%rename(__lognot__)	     *::operator~() const;
233
234%rename(__not__)	     *::operator!();
235%rename(__not__)	     *::operator!() const;
236
237%rename(__assign__)	     *::operator=;
238
239%rename(__add_assign__)      *::operator+=;
240%rename(__sub_assign__)	     *::operator-=;
241%rename(__mul_assign__)	     *::operator*=;
242%rename(__div_assign__)	     *::operator/=;
243%rename(__mod_assign__)	     *::operator%=;
244%rename(__logxor_assign__)   *::operator^=;
245%rename(__logand_assign__)   *::operator&=;
246%rename(__logior_assign__)   *::operator|=;
247
248%rename(__lshift__)	     *::operator<<;
249%rename(__lshift_assign__)   *::operator<<=;
250%rename(__rshift__)	     *::operator>>;
251%rename(__rshift_assign__)   *::operator>>=;
252
253%rename(__eq__)		     *::operator==;
254%rename(__ne__)		     *::operator!=;
255%rename(__lt__)		     *::operator<;
256%rename(__gt__)		     *::operator>;
257%rename(__lte__)	     *::operator<=;
258%rename(__gte__)	     *::operator>=;
259
260%rename(__and__)	     *::operator&&;
261%rename(__or__)		     *::operator||;
262
263%rename(__preincr__)	     *::operator++();
264%rename(__postincr__)	     *::operator++(int);
265%rename(__predecr__)	     *::operator--();
266%rename(__postdecr__)	     *::operator--(int);
267
268%rename(__comma__)	     *::operator,();
269%rename(__comma__)	     *::operator,() const;
270
271%rename(__member_ref__)      *::operator->;
272%rename(__member_func_ref__) *::operator->*;
273
274%rename(__funcall__)	     *::operator();
275%rename(__aref__)	     *::operator[];
276#endif
277
278
279%{
280
281#ifdef __cplusplus
282#  define EXTERN   extern "C"
283#else
284#  define EXTERN   extern
285#endif
286
287#define EXPORT   EXTERN SWIGEXPORT
288
289#include <string.h>
290#include <stdlib.h>
291%}
292