PageRenderTime 43ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/Lib/chicken/typemaps.i

#
Swig | 315 lines | 149 code | 26 blank | 140 comment | 0 complexity | b4608607e4ebf8d7cb6ff95c83454c96 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. /* -----------------------------------------------------------------------------
  2. * typemaps.i
  3. *
  4. * Pointer handling
  5. *
  6. * These mappings provide support for input/output arguments and
  7. * common uses for C/C++ pointers. INOUT mappings allow for C/C++
  8. * pointer variables in addition to input/output arguments.
  9. * ----------------------------------------------------------------------------- */
  10. // INPUT typemaps.
  11. // These remap a C pointer to be an "INPUT" value which is passed by value
  12. // instead of reference.
  13. /*
  14. The following methods can be applied to turn a pointer into a simple
  15. "input" value. That is, instead of passing a pointer to an object,
  16. you would use a real value instead.
  17. int *INPUT
  18. short *INPUT
  19. long *INPUT
  20. long long *INPUT
  21. unsigned int *INPUT
  22. unsigned short *INPUT
  23. unsigned long *INPUT
  24. unsigned long long *INPUT
  25. unsigned char *INPUT
  26. char *INPUT
  27. bool *INPUT
  28. float *INPUT
  29. double *INPUT
  30. To use these, suppose you had a C function like this :
  31. double fadd(double *a, double *b) {
  32. return *a+*b;
  33. }
  34. You could wrap it with SWIG as follows :
  35. %include <typemaps.i>
  36. double fadd(double *INPUT, double *INPUT);
  37. or you can use the %apply directive :
  38. %include <typemaps.i>
  39. %apply double *INPUT { double *a, double *b };
  40. double fadd(double *a, double *b);
  41. */
  42. // OUTPUT typemaps. These typemaps are used for parameters that
  43. // are output only. The output value is appended to the result as
  44. // a list element.
  45. /*
  46. The following methods can be applied to turn a pointer into an "output"
  47. value. When calling a function, no input value would be given for
  48. a parameter, but an output value would be returned. In the case of
  49. multiple output values, they are returned in the form of a Scheme list.
  50. int *OUTPUT
  51. short *OUTPUT
  52. long *OUTPUT
  53. long long *OUTPUT
  54. unsigned int *OUTPUT
  55. unsigned short *OUTPUT
  56. unsigned long *OUTPUT
  57. unsigned long long *OUTPUT
  58. unsigned char *OUTPUT
  59. char *OUTPUT
  60. bool *OUTPUT
  61. float *OUTPUT
  62. double *OUTPUT
  63. For example, suppose you were trying to wrap the modf() function in the
  64. C math library which splits x into integral and fractional parts (and
  65. returns the integer part in one of its parameters).K:
  66. double modf(double x, double *ip);
  67. You could wrap it with SWIG as follows :
  68. %include <typemaps.i>
  69. double modf(double x, double *OUTPUT);
  70. or you can use the %apply directive :
  71. %include <typemaps.i>
  72. %apply double *OUTPUT { double *ip };
  73. double modf(double x, double *ip);
  74. */
  75. // These typemaps contributed by Robin Dunn
  76. //----------------------------------------------------------------------
  77. //
  78. // T_OUTPUT typemap (and helper function) to return multiple argouts as
  79. // a tuple instead of a list.
  80. //
  81. //----------------------------------------------------------------------
  82. // Simple types
  83. %define INOUT_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_)
  84. %typemap(in) type_ *INPUT($*1_ltype temp), type_ &INPUT($*1_ltype temp)
  85. %{ if (!checker ($input)) {
  86. swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'");
  87. }
  88. temp = ($*1_ltype) from_scheme ($input);
  89. $1 = &temp; %}
  90. %typemap(typecheck) type_ *INPUT = type_;
  91. %typemap(typecheck) type_ &INPUT = type_;
  92. %typemap(in, numinputs=0) type_ *OUTPUT($*1_ltype temp), type_ &OUTPUT($*1_ltype temp)
  93. " $1 = &temp;"
  94. #if "storage_" == "0"
  95. %typemap(argout) type_ *OUTPUT, type_ &OUTPUT
  96. %{
  97. if ($1 == NULL) {
  98. swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Argument #$argnum must be non-null");
  99. }
  100. SWIG_APPEND_VALUE(to_scheme (convtype (*$1)));
  101. %}
  102. #else
  103. %typemap(argout) type_ *OUTPUT, type_ &OUTPUT
  104. %{
  105. {
  106. C_word *known_space = C_alloc(storage_);
  107. if ($1 == NULL) {
  108. swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Variable '$1' must be non-null");
  109. }
  110. SWIG_APPEND_VALUE(to_scheme (&known_space, convtype (*$1)));
  111. }
  112. %}
  113. #endif
  114. %enddef
  115. INOUT_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0);
  116. INOUT_TYPEMAP(enum SWIGTYPE, C_num_to_int, C_fix, C_swig_is_number, (int), 0);
  117. INOUT_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0);
  118. INOUT_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM);
  119. INOUT_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM);
  120. INOUT_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (int), C_SIZEOF_FLONUM);
  121. INOUT_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0);
  122. INOUT_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM);
  123. INOUT_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM);
  124. INOUT_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0);
  125. INOUT_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0);
  126. INOUT_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0);
  127. INOUT_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0);
  128. INOUT_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM);
  129. INOUT_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM);
  130. // INOUT
  131. // Mappings for an argument that is both an input and output
  132. // parameter
  133. /*
  134. The following methods can be applied to make a function parameter both
  135. an input and output value. This combines the behavior of both the
  136. "INPUT" and "OUTPUT" methods described earlier. Output values are
  137. returned in the form of a CHICKEN tuple.
  138. int *INOUT
  139. short *INOUT
  140. long *INOUT
  141. long long *INOUT
  142. unsigned int *INOUT
  143. unsigned short *INOUT
  144. unsigned long *INOUT
  145. unsigned long long *INOUT
  146. unsigned char *INOUT
  147. char *INOUT
  148. bool *INOUT
  149. float *INOUT
  150. double *INOUT
  151. For example, suppose you were trying to wrap the following function :
  152. void neg(double *x) {
  153. *x = -(*x);
  154. }
  155. You could wrap it with SWIG as follows :
  156. %include <typemaps.i>
  157. void neg(double *INOUT);
  158. or you can use the %apply directive :
  159. %include <typemaps.i>
  160. %apply double *INOUT { double *x };
  161. void neg(double *x);
  162. As well, you can wrap variables with :
  163. %include <typemaps.i>
  164. %apply double *INOUT { double *y };
  165. extern double *y;
  166. Unlike C, this mapping does not directly modify the input value (since
  167. this makes no sense in CHICKEN). Rather, the modified input value shows
  168. up as the return value of the function. Thus, to apply this function
  169. to a CHICKEN variable you might do this :
  170. x = neg(x)
  171. Note : previous versions of SWIG used the symbol 'BOTH' to mark
  172. input/output arguments. This is still supported, but will be slowly
  173. phased out in future releases.
  174. */
  175. %typemap(in) int *INOUT = int *INPUT;
  176. %typemap(in) enum SWIGTYPE *INOUT = enum SWIGTYPE *INPUT;
  177. %typemap(in) short *INOUT = short *INPUT;
  178. %typemap(in) long *INOUT = long *INPUT;
  179. %typemap(in) long long *INOUT = long long *INPUT;
  180. %typemap(in) unsigned *INOUT = unsigned *INPUT;
  181. %typemap(in) unsigned short *INOUT = unsigned short *INPUT;
  182. %typemap(in) unsigned long *INOUT = unsigned long *INPUT;
  183. %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT;
  184. %typemap(in) unsigned char *INOUT = unsigned char *INPUT;
  185. %typemap(in) char *INOUT = char *INPUT;
  186. %typemap(in) bool *INOUT = bool *INPUT;
  187. %typemap(in) float *INOUT = float *INPUT;
  188. %typemap(in) double *INOUT = double *INPUT;
  189. %typemap(in) int &INOUT = int &INPUT;
  190. %typemap(in) enum SWIGTYPE &INOUT = enum SWIGTYPE &INPUT;
  191. %typemap(in) short &INOUT = short &INPUT;
  192. %typemap(in) long &INOUT = long &INPUT;
  193. %typemap(in) long long &INOUT = long long &INPUT;
  194. %typemap(in) unsigned &INOUT = unsigned &INPUT;
  195. %typemap(in) unsigned short &INOUT = unsigned short &INPUT;
  196. %typemap(in) unsigned long &INOUT = unsigned long &INPUT;
  197. %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT;
  198. %typemap(in) unsigned char &INOUT = unsigned char &INPUT;
  199. %typemap(in) char &INOUT = char &INPUT;
  200. %typemap(in) bool &INOUT = bool &INPUT;
  201. %typemap(in) float &INOUT = float &INPUT;
  202. %typemap(in) double &INOUT = double &INPUT;
  203. %typemap(argout) int *INOUT = int *OUTPUT;
  204. %typemap(argout) enum SWIGTYPE *INOUT = enum SWIGTYPE *OUTPUT;
  205. %typemap(argout) short *INOUT = short *OUTPUT;
  206. %typemap(argout) long *INOUT = long *OUTPUT;
  207. %typemap(argout) long long *INOUT = long long *OUTPUT;
  208. %typemap(argout) unsigned *INOUT = unsigned *OUTPUT;
  209. %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT;
  210. %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT;
  211. %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT;
  212. %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT;
  213. %typemap(argout) bool *INOUT = bool *OUTPUT;
  214. %typemap(argout) float *INOUT = float *OUTPUT;
  215. %typemap(argout) double *INOUT = double *OUTPUT;
  216. %typemap(argout) int &INOUT = int &OUTPUT;
  217. %typemap(argout) enum SWIGTYPE &INOUT = enum SWIGTYPE &OUTPUT;
  218. %typemap(argout) short &INOUT = short &OUTPUT;
  219. %typemap(argout) long &INOUT = long &OUTPUT;
  220. %typemap(argout) long long &INOUT = long long &OUTPUT;
  221. %typemap(argout) unsigned &INOUT = unsigned &OUTPUT;
  222. %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT;
  223. %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT;
  224. %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT;
  225. %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT;
  226. %typemap(argout) char &INOUT = char &OUTPUT;
  227. %typemap(argout) bool &INOUT = bool &OUTPUT;
  228. %typemap(argout) float &INOUT = float &OUTPUT;
  229. %typemap(argout) double &INOUT = double &OUTPUT;
  230. /* Overloading information */
  231. %typemap(typecheck) double *INOUT = double;
  232. %typemap(typecheck) bool *INOUT = bool;
  233. %typemap(typecheck) char *INOUT = char;
  234. %typemap(typecheck) signed char *INOUT = signed char;
  235. %typemap(typecheck) unsigned char *INOUT = unsigned char;
  236. %typemap(typecheck) unsigned long *INOUT = unsigned long;
  237. %typemap(typecheck) unsigned long long *INOUT = unsigned long long;
  238. %typemap(typecheck) unsigned short *INOUT = unsigned short;
  239. %typemap(typecheck) unsigned int *INOUT = unsigned int;
  240. %typemap(typecheck) long *INOUT = long;
  241. %typemap(typecheck) long long *INOUT = long long;
  242. %typemap(typecheck) short *INOUT = short;
  243. %typemap(typecheck) int *INOUT = int;
  244. %typemap(typecheck) enum SWIGTYPE *INOUT = enum SWIGTYPE;
  245. %typemap(typecheck) float *INOUT = float;
  246. %typemap(typecheck) double &INOUT = double;
  247. %typemap(typecheck) bool &INOUT = bool;
  248. %typemap(typecheck) char &INOUT = char;
  249. %typemap(typecheck) signed char &INOUT = signed char;
  250. %typemap(typecheck) unsigned char &INOUT = unsigned char;
  251. %typemap(typecheck) unsigned long &INOUT = unsigned long;
  252. %typemap(typecheck) unsigned long long &INOUT = unsigned long long;
  253. %typemap(typecheck) unsigned short &INOUT = unsigned short;
  254. %typemap(typecheck) unsigned int &INOUT = unsigned int;
  255. %typemap(typecheck) long &INOUT = long;
  256. %typemap(typecheck) long long &INOUT = long long;
  257. %typemap(typecheck) short &INOUT = short;
  258. %typemap(typecheck) int &INOUT = int;
  259. %typemap(typecheck) enum SWIGTYPE &INOUT = enum SWIGTYPE;
  260. %typemap(typecheck) float &INOUT = float;