You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
4.3 KiB
112 lines
4.3 KiB
4 years ago
|
/* inout_typemaps.i
|
||
|
|
||
|
Support for INPUT, OUTPUT, and INOUT typemaps. OUTPUT variables are returned
|
||
|
as multiple values.
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Note that this macro automatically adds a pointer to the type passed in.
|
||
|
As a result, INOUT typemaps for char are for 'char *'. The definition
|
||
|
of typemaps for 'char' takes advantage of this, believing that it's more
|
||
|
likely to see an INOUT argument for strings, than a single char. */
|
||
|
%define INOUT_TYPEMAP(type_, OUTresult_, INbind_)
|
||
|
// OUTPUT map.
|
||
|
%typemap(lin,numinputs=0) type_ *OUTPUT, type_ &OUTPUT
|
||
|
%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c)))
|
||
|
$body
|
||
|
OUTresult_
|
||
|
(ff:free-fobject $out)) %}
|
||
|
|
||
|
// INPUT map.
|
||
|
%typemap(in) type_ *INPUT, type_ &INPUT
|
||
|
%{ $1 = &$input; %}
|
||
|
|
||
|
%typemap(ctype) type_ *INPUT, type_ &INPUT "$*1_ltype";
|
||
|
|
||
|
|
||
|
// INOUT map.
|
||
|
// careful here. the input string is converted to a C string
|
||
|
// with length equal to the input string. This should be large
|
||
|
// enough to contain whatever OUTPUT value will be stored in it.
|
||
|
%typemap(lin,numinputs=1) type_ *INOUT, type_ &INOUT
|
||
|
%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c)))
|
||
|
INbind_
|
||
|
$body
|
||
|
OUTresult_
|
||
|
(ff:free-fobject $out)) %}
|
||
|
|
||
|
%enddef
|
||
|
|
||
|
// $in, $out, $lclass,
|
||
|
// $in_fftype, $*in_fftype
|
||
|
|
||
|
INOUT_TYPEMAP(int,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(short,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(long,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(unsigned int,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(unsigned short,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(unsigned long,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
// char * mapping for passing strings. didn't quite work
|
||
|
// INOUT_TYPEMAP(char,
|
||
|
// (cl::push (excl:native-to-string $out) ACL_result),
|
||
|
// (cl::setf (ff:fslot-value-typed (cl::quote $in_fftype) :c $out)
|
||
|
// (excl:string-to-native $in)))
|
||
|
INOUT_TYPEMAP(float,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(double,
|
||
|
(cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|
||
|
INOUT_TYPEMAP(bool,
|
||
|
(cl::push (not (zerop (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out)))
|
||
|
ACL_result),
|
||
|
(cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) (if $in 1 0)));
|
||
|
|
||
|
%typemap(lisptype) bool *INPUT, bool &INPUT "boolean";
|
||
|
|
||
|
// long long support not yet complete
|
||
|
// INOUT_TYPEMAP(long long);
|
||
|
// INOUT_TYPEMAP(unsigned long long);
|
||
|
|
||
|
// char *OUTPUT map.
|
||
|
// for this to work, swig needs to know how large an array to allocate.
|
||
|
// you can fake this by
|
||
|
// %typemap(ffitype) char *myarg "(:array :char 30)";
|
||
|
// %apply char *OUTPUT { char *myarg };
|
||
|
%typemap(lin,numinputs=0) char *OUTPUT, char &OUTPUT
|
||
|
%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c)))
|
||
|
$body
|
||
|
(cl::push (excl:native-to-string $out) ACL_result)
|
||
|
(ff:free-fobject $out)) %}
|
||
|
|
||
|
// char *INPUT map.
|
||
|
%typemap(in) char *INPUT, char &INPUT
|
||
|
%{ $1 = &$input; %}
|
||
|
%typemap(ctype) char *INPUT, char &INPUT "$*1_ltype";
|
||
|
|
||
|
// char *INOUT map.
|
||
|
%typemap(lin,numinputs=1) char *INOUT, char &INOUT
|
||
|
%{(cl::let (($out (excl:string-to-native $in)))
|
||
|
$body
|
||
|
(cl::push (excl:native-to-string $out) ACL_result)
|
||
|
(ff:free-fobject $out)) %}
|
||
|
|
||
|
// uncomment this if you want INOUT mappings for chars instead of strings.
|
||
|
// INOUT_TYPEMAP(char,
|
||
|
// (cl::push (code-char (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out))
|
||
|
// ACL_result),
|
||
|
// (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
|