diff options
Diffstat (limited to 'share/swig/2.0.11/allegrocl/inout_typemaps.i')
-rw-r--r-- | share/swig/2.0.11/allegrocl/inout_typemaps.i | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/share/swig/2.0.11/allegrocl/inout_typemaps.i b/share/swig/2.0.11/allegrocl/inout_typemaps.i new file mode 100644 index 0000000..d8d61fe --- /dev/null +++ b/share/swig/2.0.11/allegrocl/inout_typemaps.i @@ -0,0 +1,111 @@ +/* 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)); |