diff --git a/CHANGES.current b/CHANGES.current index bd4aa7b8b..0ddd92cc5 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -1,6 +1,9 @@ Version 1.3.37 (30 December 2008) ================================= +2009-01-12: drjoe + Fixed handling of integer arrays + 2009-01-10: drjoe Fix integer handling in r to deal correctly with signed and unsigned issues diff --git a/Lib/r/r.swg b/Lib/r/r.swg index d7dc04f15..7fd6d761f 100644 --- a/Lib/r/r.swg +++ b/Lib/r/r.swg @@ -56,13 +56,61 @@ SWIG_InitializeModule(0); %typemap(out) void ""; %typemap(in) int *, int[ANY], - long *, long[ANY] %{ - $1 = INTEGER($input); + signed int *, signed int[ANY], + unsigned int *, unsigned int[ANY], + short *, short[ANY], + signed short *, signed short[ANY], + unsigned short *, unsigned short[ANY], + long *, long[ANY], + signed long *, signed long[ANY], + unsigned long *, unsigned long[ANY], + long long *, long long[ANY], + signed long long *, signed long long[ANY], + unsigned long long *, unsigned long long[ANY] + +{ +{ int _rswigi; + int _rswiglen = LENGTH($input); + $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); + for (_rswigi=0; _rswigi< _rswiglen; _rswigi++) { + $1[_rswigi] = INTEGER($input)[_rswigi]; + } +} +} + +%typemap(in) float *, float[ANY], + double *, double[ANY] + +{ +{ int _rswigi; + int _rswiglen = LENGTH($input); + $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); + for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) { + $1[_rswigi] = REAL($input)[_rswigi]; + } +} +} + +%typemap(freearg,noblock=1) int *, int[ANY], + signed int *, signed int[ANY], + unsigned int *, unsigned int[ANY], + short *, short[ANY], + signed short *, signed short[ANY], + unsigned short *, unsigned short[ANY], + long *, long[ANY], + signed long *, signed long[ANY], + unsigned long *, unsigned long[ANY], + long long *, long long[ANY], + signed long long *, signed long long[ANY], + unsigned long long *, unsigned long long[ANY], + float *, float[ANY], + double *, double[ANY] +%{ + free($1); %} -%typemap(in) double *, double[ANY] %{ - $1 = REAL($input); -%} + + /* Shoul dwe recycle to make the length correct. And warn if length() > the dimension. @@ -92,8 +140,6 @@ SWIG_InitializeModule(0); %include %include -%apply int[ANY] { enum SWIGTYPE[ANY] }; - %typemap(in,noblock=1) enum SWIGTYPE[ANY] { $1 = %reinterpret_cast(INTEGER($input), $1_ltype); } diff --git a/Lib/r/rtype.swg b/Lib/r/rtype.swg index 504e7cd04..d388d1eae 100644 --- a/Lib/r/rtype.swg +++ b/Lib/r/rtype.swg @@ -3,7 +3,7 @@ for use in class representations. */ -%typemap("rtype") int, int *, int & "numeric"; +%typemap("rtype") int, int *, int & "integer"; %apply int {size_t} %apply int {std::size_t} %apply int {ptrdiff_t} @@ -13,11 +13,11 @@ %apply int {short} %apply int {unsigned short} -%typemap("rtype") long, long *, long & "numeric"; +%typemap("rtype") long, long *, long & "integer"; %apply long {long long} %apply long {signed long long} %apply long {unsigned long long} -%apply long {unsigned long} +%apply long {signed long} %apply long {unsigned long} %typemap("rtype") double, double*, double & "numeric"; @@ -143,7 +143,24 @@ string &, std::string & std::string, string &, std::string &, - void + void, + signed int, + signed int &, + unsigned int, + unsigned int &, + short, + short &, + unsigned short, + unsigned short &, + long long, + signed long long, + signed long long &, + unsigned long long, + unsigned long long &, + signed long, + signed long &, + unsigned long, + unsigned long & %{ %}