1 /* ----------------------------------------------------------------------------- 2 * typemaps.i 3 * 4 * SWIG typemap library for Tcl8. This file contains various sorts 5 * of typemaps for modifying SWIG's code generation. 6 * ----------------------------------------------------------------------------- */ 7 8 #if !defined(SWIG_USE_OLD_TYPEMAPS) 9 %include <typemaps/typemaps.swg> 10 #else 11 12 /* 13 The SWIG typemap library provides a language independent mechanism for 14 supporting output arguments, input values, and other C function 15 calling mechanisms. The primary use of the library is to provide a 16 better interface to certain C function--especially those involving 17 pointers. 18 */ 19 20 // INPUT typemaps. 21 // These remap a C pointer to be an "INPUT" value which is passed by value 22 // instead of reference. 23 24 /* 25 The following methods can be applied to turn a pointer into a simple 26 "input" value. That is, instead of passing a pointer to an object, 27 you would use a real value instead. 28 29 int *INPUT 30 short *INPUT 31 long *INPUT 32 long long *INPUT 33 unsigned int *INPUT 34 unsigned short *INPUT 35 unsigned long *INPUT 36 unsigned long long *INPUT 37 unsigned char *INPUT 38 bool *INPUT 39 float *INPUT 40 double *INPUT 41 42 To use these, suppose you had a C function like this : 43 44 double fadd(double *a, double *b) { 45 return *a+*b; 46 } 47 48 You could wrap it with SWIG as follows : 49 50 %include typemaps.i 51 double fadd(double *INPUT, double *INPUT); 52 53 or you can use the %apply directive : 54 55 %include typemaps.i 56 %apply double *INPUT { double *a, double *b }; 57 double fadd(double *a, double *b); 58 59 */ 60 61 %typemap(in) double *INPUT(double temp), double &INPUT(double temp) 62 { 63 if (Tcl_GetDoubleFromObj(interp,$input,&temp) == TCL_ERROR) { 64 SWIG_fail; 65 } 66 $1 = &temp; 67 } 68 69 %typemap(in) float *INPUT(double dvalue, float temp), float &INPUT(double dvalue, float temp) 70 { 71 if (Tcl_GetDoubleFromObj(interp,$input,&dvalue) == TCL_ERROR) { 72 SWIG_fail; 73 } 74 temp = (float) dvalue; 75 $1 = &temp; 76 } 77 78 %typemap(in) int *INPUT(int temp), int &INPUT(int temp) 79 { 80 if (Tcl_GetIntFromObj(interp,$input,&temp) == TCL_ERROR) { 81 SWIG_fail; 82 } 83 $1 = &temp; 84 } 85 86 %typemap(in) short *INPUT(int ivalue, short temp), short &INPUT(int ivalue, short temp) 87 { 88 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 89 SWIG_fail; 90 } 91 temp = (short) ivalue; 92 $1 = &temp; 93 } 94 95 %typemap(in) long *INPUT(int ivalue, long temp), long &INPUT(int ivalue, long temp) 96 { 97 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 98 SWIG_fail; 99 } 100 temp = (long) ivalue; 101 $1 = &temp; 102 } 103 104 %typemap(in) unsigned int *INPUT(int ivalue, unsigned int temp), 105 unsigned int &INPUT(int ivalue, unsigned int temp) 106 { 107 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 108 SWIG_fail; 109 } 110 temp = (unsigned int) ivalue; 111 $1 = &temp; 112 } 113 114 %typemap(in) unsigned short *INPUT(int ivalue, unsigned short temp), 115 unsigned short &INPUT(int ivalue, unsigned short temp) 116 { 117 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 118 SWIG_fail; 119 } 120 temp = (unsigned short) ivalue; 121 $1 = &temp; 122 } 123 124 %typemap(in) unsigned long *INPUT(int ivalue, unsigned long temp), 125 unsigned long &INPUT(int ivalue, unsigned long temp) 126 { 127 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 128 SWIG_fail; 129 } 130 temp = (unsigned long) ivalue; 131 $1 = &temp; 132 } 133 134 %typemap(in) unsigned char *INPUT(int ivalue, unsigned char temp), 135 unsigned char &INPUT(int ivalue, unsigned char temp) 136 { 137 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 138 SWIG_fail; 139 } 140 temp = (unsigned char) ivalue; 141 $1 = &temp; 142 } 143 144 %typemap(in) signed char *INPUT(int ivalue, signed char temp), 145 signed char &INPUT(int ivalue, signed char temp) 146 { 147 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 148 SWIG_fail; 149 } 150 temp = (signed char) ivalue; 151 $1 = &temp; 152 } 153 154 %typemap(in) bool *INPUT(int ivalue, bool temp), 155 bool &INPUT(int ivalue, bool temp) 156 { 157 if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { 158 SWIG_fail; 159 } 160 temp = ivalue ? true : false; 161 $1 = &temp; 162 } 163 164 %typemap(in) long long *INPUT($*1_ltype temp), 165 long long &INPUT($*1_ltype temp) 166 { 167 temp = ($*1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0); 168 $1 = &temp; 169 } 170 171 %typemap(in) unsigned long long *INPUT($*1_ltype temp), 172 unsigned long long &INPUT($*1_ltype temp) 173 { 174 temp = ($*1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL),0,0); 175 $1 = &temp; 176 } 177 178 // OUTPUT typemaps. These typemaps are used for parameters that 179 // are output only. The output value is appended to the result as 180 // a list element. 181 182 /* 183 The following methods can be applied to turn a pointer into an "output" 184 value. When calling a function, no input value would be given for 185 a parameter, but an output value would be returned. In the case of 186 multiple output values, they are returned in the form of a Tcl list. 187 188 int *OUTPUT 189 short *OUTPUT 190 long *OUTPUT 191 long long *OUTPUT 192 unsigned int *OUTPUT 193 unsigned short *OUTPUT 194 unsigned long *OUTPUT 195 unsigned long long *OUTPUT 196 unsigned char *OUTPUT 197 bool *OUTPUT 198 float *OUTPUT 199 double *OUTPUT 200 201 For example, suppose you were trying to wrap the modf() function in the 202 C math library which splits x into integral and fractional parts (and 203 returns the integer part in one of its parameters).K: 204 205 double modf(double x, double *ip); 206 207 You could wrap it with SWIG as follows : 208 209 %include typemaps.i 210 double modf(double x, double *OUTPUT); 211 212 or you can use the %apply directive : 213 214 %include typemaps.i 215 %apply double *OUTPUT { double *ip }; 216 double modf(double x, double *ip); 217 218 The Tcl output of the function would be a list containing both 219 output values. 220 221 */ 222 223 %typemap(in,numinputs=0) int *OUTPUT(int temp), 224 short *OUTPUT(short temp), 225 long *OUTPUT(long temp), 226 unsigned int *OUTPUT(unsigned int temp), 227 unsigned short *OUTPUT(unsigned short temp), 228 unsigned long *OUTPUT(unsigned long temp), 229 unsigned char *OUTPUT(unsigned char temp), 230 signed char *OUTPUT(signed char temp), 231 bool *OUTPUT(bool temp), 232 float *OUTPUT(float temp), 233 double *OUTPUT(double temp), 234 long long *OUTPUT($*1_ltype temp), 235 unsigned long long *OUTPUT($*1_ltype temp), 236 int &OUTPUT(int temp), 237 short &OUTPUT(short temp), 238 long &OUTPUT(long temp), 239 unsigned int &OUTPUT(unsigned int temp), 240 unsigned short &OUTPUT(unsigned short temp), 241 unsigned long &OUTPUT(unsigned long temp), 242 signed char &OUTPUT(signed char temp), 243 bool &OUTPUT(bool temp), 244 unsigned char &OUTPUT(unsigned char temp), 245 float &OUTPUT(float temp), 246 double &OUTPUT(double temp), 247 long long &OUTPUT($*1_ltype temp), 248 unsigned long long &OUTPUT($*1_ltype temp) 249 "$1 = &temp;"; 250 251 %typemap(argout) int *OUTPUT, int &OUTPUT, 252 short *OUTPUT, short &OUTPUT, 253 long *OUTPUT, long &OUTPUT, 254 unsigned int *OUTPUT, unsigned int &OUTPUT, 255 unsigned short *OUTPUT, unsigned short &OUTPUT, 256 unsigned long *OUTPUT, unsigned long &OUTPUT, 257 unsigned char *OUTPUT, unsigned char &OUTPUT, 258 signed char *OUTPUT, signed char &OUTPUT, 259 bool *OUTPUT, bool &OUTPUT 260 { 261 Tcl_Obj *o; 262 o = Tcl_NewIntObj((int) *($1)); 263 Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); 264 } 265 266 %typemap(argout) float *OUTPUT, float &OUTPUT, 267 double *OUTPUT, double &OUTPUT 268 { 269 Tcl_Obj *o; 270 o = Tcl_NewDoubleObj((double) *($1)); 271 Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); 272 } 273 274 %typemap(argout) long long *OUTPUT, long long &OUTPUT 275 { 276 char temp[256]; 277 Tcl_Obj *o; 278 sprintf(temp,"%lld",(long long)*($1)); 279 o = Tcl_NewStringObj(temp,-1); 280 Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); 281 } 282 283 %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT 284 { 285 char temp[256]; 286 Tcl_Obj *o; 287 sprintf(temp,"%llu",(unsigned long long)*($1)); 288 o = Tcl_NewStringObj(temp,-1); 289 Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); 290 } 291 292 // INOUT 293 // Mappings for an argument that is both an input and output 294 // parameter 295 296 /* 297 The following methods can be applied to make a function parameter both 298 an input and output value. This combines the behavior of both the 299 "INPUT" and "OUTPUT" methods described earlier. Output values are 300 returned in the form of a Tcl list. 301 302 int *INOUT 303 short *INOUT 304 long *INOUT 305 long long *INOUT 306 unsigned int *INOUT 307 unsigned short *INOUT 308 unsigned long *INOUT 309 unsigned long long *INOUT 310 unsigned char *INOUT 311 bool *INOUT 312 float *INOUT 313 double *INOUT 314 315 For example, suppose you were trying to wrap the following function : 316 317 void neg(double *x) { 318 *x = -(*x); 319 } 320 321 You could wrap it with SWIG as follows : 322 323 %include typemaps.i 324 void neg(double *INOUT); 325 326 or you can use the %apply directive : 327 328 %include typemaps.i 329 %apply double *INOUT { double *x }; 330 void neg(double *x); 331 332 Unlike C, this mapping does not directly modify the input value (since 333 this makes no sense in Tcl). Rather, the modified input value shows 334 up as the return value of the function. Thus, to apply this function 335 to a Tcl variable you might do this : 336 337 set x [neg $x] 338 339 */ 340 341 342 %typemap(in) int *INOUT = int *INPUT; 343 %typemap(in) short *INOUT = short *INPUT; 344 %typemap(in) long *INOUT = long *INPUT; 345 %typemap(in) unsigned int *INOUT = unsigned int *INPUT; 346 %typemap(in) unsigned short *INOUT = unsigned short *INPUT; 347 %typemap(in) unsigned long *INOUT = unsigned long *INPUT; 348 %typemap(in) unsigned char *INOUT = unsigned char *INPUT; 349 %typemap(in) signed char *INOUT = signed char *INPUT; 350 %typemap(in) bool *INOUT = bool *INPUT; 351 %typemap(in) float *INOUT = float *INPUT; 352 %typemap(in) double *INOUT = double *INPUT; 353 %typemap(in) long long *INOUT = long long *INPUT; 354 %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; 355 356 %typemap(in) int &INOUT = int &INPUT; 357 %typemap(in) short &INOUT = short &INPUT; 358 %typemap(in) long &INOUT = long &INPUT; 359 %typemap(in) unsigned int &INOUT = unsigned int &INPUT; 360 %typemap(in) unsigned short &INOUT = unsigned short &INPUT; 361 %typemap(in) unsigned long &INOUT = unsigned long &INPUT; 362 %typemap(in) unsigned char &INOUT = unsigned char &INPUT; 363 %typemap(in) signed char &INOUT = signed char &INPUT; 364 %typemap(in) bool &INOUT = bool &INPUT; 365 %typemap(in) float &INOUT = float &INPUT; 366 %typemap(in) double &INOUT = double &INPUT; 367 %typemap(in) long long &INOUT = long long &INPUT; 368 %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; 369 370 %typemap(argout) int *INOUT = int *OUTPUT; 371 %typemap(argout) short *INOUT = short *OUTPUT; 372 %typemap(argout) long *INOUT = long *OUTPUT; 373 %typemap(argout) unsigned int *INOUT = unsigned int *OUTPUT; 374 %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; 375 %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; 376 %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; 377 %typemap(argout) signed char *INOUT = signed char *OUTPUT; 378 %typemap(argout) bool *INOUT = bool *OUTPUT; 379 %typemap(argout) float *INOUT = float *OUTPUT; 380 %typemap(argout) double *INOUT = double *OUTPUT; 381 %typemap(argout) long long *INOUT = long long *OUTPUT; 382 %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; 383 384 %typemap(argout) int &INOUT = int &OUTPUT; 385 %typemap(argout) short &INOUT = short &OUTPUT; 386 %typemap(argout) long &INOUT = long &OUTPUT; 387 %typemap(argout) unsigned int &INOUT = unsigned int &OUTPUT; 388 %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; 389 %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; 390 %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; 391 %typemap(argout) signed char &INOUT = signed char &OUTPUT; 392 %typemap(argout) bool &INOUT = bool &OUTPUT; 393 %typemap(argout) float &INOUT = float &OUTPUT; 394 %typemap(argout) double &INOUT = double &OUTPUT; 395 %typemap(argout) long long &INOUT = long long &OUTPUT; 396 %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; 397 398 399 /* Overloading information */ 400 401 %typemap(typecheck) double *INPUT = double; 402 %typemap(typecheck) bool *INPUT = bool; 403 %typemap(typecheck) signed char *INPUT = signed char; 404 %typemap(typecheck) unsigned char *INPUT = unsigned char; 405 %typemap(typecheck) unsigned long *INPUT = unsigned long; 406 %typemap(typecheck) unsigned short *INPUT = unsigned short; 407 %typemap(typecheck) unsigned int *INPUT = unsigned int; 408 %typemap(typecheck) long *INPUT = long; 409 %typemap(typecheck) short *INPUT = short; 410 %typemap(typecheck) int *INPUT = int; 411 %typemap(typecheck) float *INPUT = float; 412 %typemap(typecheck) long long *INPUT = long long; 413 %typemap(typecheck) unsigned long long *INPUT = unsigned long long; 414 415 %typemap(typecheck) double &INPUT = double; 416 %typemap(typecheck) bool &INPUT = bool; 417 %typemap(typecheck) signed char &INPUT = signed char; 418 %typemap(typecheck) unsigned char &INPUT = unsigned char; 419 %typemap(typecheck) unsigned long &INPUT = unsigned long; 420 %typemap(typecheck) unsigned short &INPUT = unsigned short; 421 %typemap(typecheck) unsigned int &INPUT = unsigned int; 422 %typemap(typecheck) long &INPUT = long; 423 %typemap(typecheck) short &INPUT = short; 424 %typemap(typecheck) int &INPUT = int; 425 %typemap(typecheck) float &INPUT = float; 426 %typemap(typecheck) long long &INPUT = long long; 427 %typemap(typecheck) unsigned long long &INPUT = unsigned long long; 428 429 %typemap(typecheck) double *INOUT = double; 430 %typemap(typecheck) bool *INOUT = bool; 431 %typemap(typecheck) signed char *INOUT = signed char; 432 %typemap(typecheck) unsigned char *INOUT = unsigned char; 433 %typemap(typecheck) unsigned long *INOUT = unsigned long; 434 %typemap(typecheck) unsigned short *INOUT = unsigned short; 435 %typemap(typecheck) unsigned int *INOUT = unsigned int; 436 %typemap(typecheck) long *INOUT = long; 437 %typemap(typecheck) short *INOUT = short; 438 %typemap(typecheck) int *INOUT = int; 439 %typemap(typecheck) float *INOUT = float; 440 %typemap(typecheck) long long *INOUT = long long; 441 %typemap(typecheck) unsigned long long *INOUT = unsigned long long; 442 443 %typemap(typecheck) double &INOUT = double; 444 %typemap(typecheck) bool &INOUT = bool; 445 %typemap(typecheck) signed char &INOUT = signed char; 446 %typemap(typecheck) unsigned char &INOUT = unsigned char; 447 %typemap(typecheck) unsigned long &INOUT = unsigned long; 448 %typemap(typecheck) unsigned short &INOUT = unsigned short; 449 %typemap(typecheck) unsigned int &INOUT = unsigned int; 450 %typemap(typecheck) long &INOUT = long; 451 %typemap(typecheck) short &INOUT = short; 452 %typemap(typecheck) int &INOUT = int; 453 %typemap(typecheck) float &INOUT = float; 454 %typemap(typecheck) long long &INOUT = long long; 455 %typemap(typecheck) unsigned long long &INOUT = unsigned long long; 456 457 #endif 458 459 // -------------------------------------------------------------------- 460 // Special types 461 // -------------------------------------------------------------------- 462 463 %include <tclinterp.i> 464 %include <tclresult.i> 465