/* ----------------------------------------------------------------------------- * tcl8.swg * * Tcl8 configuration module. * ----------------------------------------------------------------------------- */ %runtime "precommon.swg" %runtime "common.swg" %runtime "swigtcl8.swg" /* ----------------------------------------------------------------------------- * --- standard typemaps --- * ----------------------------------------------------------------------------- */ /* Input arguments */ /* For primitive types, the Tcl module uses a special function SWIG_GetArgs(Tcl_Interp *, int objc, Tcl_Obj *CONST objv[], const char *fmt, ...) The fmt field contains special conversion characters i,h,l,b,f,d,c,p, and o that are used to marshal different types. The parse codes below correspond to these special codes */ %typemap(in,parse="i") int, unsigned int ""; %typemap(in,parse="h") short, unsigned short ""; %typemap(in,parse="l") long, unsigned long ""; %typemap(in,parse="b") signed char, unsigned char ""; %typemap(in,parse="f") float ""; %typemap(in,parse="d") double ""; %typemap(in,parse="c") char ""; %typemap(in,parse="s") char *, char [ANY] ""; /* Pointers */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] "if ((SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor,SWIG_POINTER_EXCEPTION | $disown) != TCL_OK)) SWIG_fail;"; %typemap(in) void * "if ((SWIG_ConvertPtr($input, (void **) &$1, 0,SWIG_POINTER_EXCEPTION | $disown) != TCL_OK)) SWIG_fail;"; /* For bools, we first convert to an integer and then to a bool. There is no guarantee that a bool is the same size as an int so we have to do this */ %typemap(in) bool (int tempb) "if (Tcl_GetIntFromObj(interp,$input,&tempb) == TCL_ERROR) SWIG_fail; $1 = tempb ? true : false;"; /* These will pass an integer as an unsigned long. However, the implementation is crippled due to limited precision in Tcl */ %typemap(in) long long "$1 = ($1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0);"; %typemap(in) unsigned long long "$1 = ($1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL), 0, 0);"; /* Enum parsing. Note: internally SWIG converts enums to/from integers so it's okay to use the "i" parse code here */ %typemap(in,parse="i") enum SWIGTYPE ""; /* Unknown type. We convert from a pointer */ %typemap(in) SWIGTYPE ($&1_ltype argp) "if ((SWIG_ConvertPtr($input, (void **) &argp, $&1_descriptor,SWIG_POINTER_EXCEPTION ) != TCL_OK)) SWIG_fail; $1 = *argp; "; /* Member pointer */ %typemap(in) SWIGTYPE (CLASS::*) "if ((SWIG_ConvertPacked($input, (void *) &$1, sizeof($1_type), $1_descriptor, SWIG_POINTER_EXCEPTION)) != TCL_OK) SWIG_fail;"; /* Special constant variations. These typemaps can be used to parse objects that are both constants or values. A Hash table lookup will occur. */ %typemap(in,parse="I") int CONSTANT, unsigned int CONSTANT ""; %typemap(in,parse="H") short CONSTANT, unsigned short CONSTANT ""; %typemap(in,parse="L") long CONSTANT, unsigned long CONSTANT ""; %typemap(in,parse="B") signed char CONSTANT, unsigned char CONSTANT ""; %typemap(in,parse="F") float CONSTANT ""; %typemap(in,parse="D") double CONSTANT ""; %typemap(in,parse="C") char CONSTANT ""; %typemap(in,parse="S") char * CONSTANT ""; %typemap(in,parse="P") SWIGTYPE *CONSTANT, SWIGTYPE &CONSTANT, SWIGTYPE CONSTANT [] ""; %typemap(in,parse="I") enum SWIGTYPE CONSTANT ""; /* Constant references. Passed by value */ /* Const primitive references. Passed by value */ %typemap(in) const int & (int temp), const short & (short temp), const long & (long temp), const unsigned int & (unsigned int temp), const unsigned short & (unsigned short temp), const unsigned long & (unsigned long temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp) { long ltemp; if (Tcl_GetLongFromObj(interp, $input, <emp) != TCL_OK) { SWIG_fail; } temp = ($*1_ltype) ltemp; $1 = &temp; } %typemap(in) const bool & (bool temp) { long ltemp; if (Tcl_GetLongFromObj(interp, $input, <emp) != TCL_OK) { SWIG_fail; } temp = ltemp ? true : false; $1 = &temp; } %typemap(in) const float & (float temp), const double & (double temp) { double dtemp; if (Tcl_GetDoubleFromObj(interp, $input, &dtemp) != TCL_OK) { SWIG_fail; } temp = ($*1_ltype) dtemp; $1 = &temp; } %typemap(in) const long long & ($*1_ltype temp) "temp = ($*1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp;"; %typemap(in) const unsigned long long & ($*1_ltype temp) "temp = ($*1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp;"; %typemap(in) const char &(char temp) { char *stemp = Tcl_GetStringFromObj($input,NULL); temp = *stemp; $1 = &temp; } /* Output values */ %typemap(out) bool, int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE "Tcl_SetObjResult(interp,Tcl_NewIntObj((long) $1));"; %typemap(out) long long { char temp[256]; sprintf(temp,"%lld", $1); Tcl_SetObjResult(interp,Tcl_NewStringObj(temp,-1)); } %typemap(out) unsigned long long { char temp[256]; sprintf(temp,"%llu", $1); Tcl_SetObjResult(interp,Tcl_NewStringObj(temp,-1)); } %typemap(out) char "Tcl_SetObjResult(interp,Tcl_NewStringObj(&$1,1));"; %typemap(out) float, double "Tcl_SetObjResult(interp,Tcl_NewDoubleObj((double) $1));"; %typemap(out) char * "Tcl_SetObjResult(interp,Tcl_NewStringObj($1,-1));"; %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] "Tcl_SetObjResult(interp,SWIG_NewPointerObj((void *) $1, $1_descriptor,0));"; %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); Tcl_SetObjResult(interp,SWIG_NewPointerObj((void *) $1, ty,0)); } %typemap(out) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE INSTANCE[] "Tcl_SetObjResult(interp,SWIG_NewInstanceObj((void *) $1, $1_descriptor,0));"; %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] "Tcl_SetObjResult(interp,SWIG_NewInstanceObj((void *) $1, $1_descriptor,0));"; %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); Tcl_SetObjResult(interp,SWIG_NewInstanceObj((void *) $1, ty,0)); } %typemap(out) SWIGTYPE (CLASS::*) "Tcl_SetObjResult(interp, SWIG_NewPackedObj((void *) &$1, sizeof($1_type), $1_descriptor, 0));"; %typemap(out) void ""; /* Primitive types--return by value */ %typemap(out) SWIGTYPE NOINSTANCE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); Tcl_SetObjResult(interp,SWIG_NewPointerObj((void*) resultptr, $&1_descriptor,0)); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); Tcl_SetObjResult(interp,SWIG_NewPointerObj((void*) resultptr, $&1_descriptor,0)); } #endif /* Primitive types--return by value */ %typemap(out) SWIGTYPE INSTANCE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); Tcl_SetObjResult(interp,SWIG_NewInstanceObj((void*) resultptr, $&1_descriptor,1)); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); Tcl_SetObjResult(interp,SWIG_NewInstanceObj((void*) resultptr, $&1_descriptor,1)); } #endif %typemap(out) SWIGTYPE = SWIGTYPE INSTANCE; /* Special typemap for character array returns */ %typemap(out) char [ANY] "Tcl_SetObjResult(interp,Tcl_NewStringObj($1,-1));" /* Primitive references */ %typemap(out) const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const signed char &, const unsigned char &, const bool & "Tcl_SetObjResult(interp,Tcl_NewIntObj((long) *($1)));"; %typemap(out) const float &, const double & "Tcl_SetObjResult(interp,Tcl_NewDoubleObj((double) *($1)));"; %typemap(out) const long long & { char temp[256]; sprintf(temp,"%lld", *($1)); Tcl_SetObjResult(interp,Tcl_NewStringObj(temp,-1)); } %typemap(out) const unsigned long long & { char temp[256]; sprintf(temp,"%llu", *($1)); Tcl_SetObjResult(interp,Tcl_NewStringObj(temp,-1)); } %typemap(out) const char & "Tcl_SetObjResult(interp,Tcl_NewStringObj($1,1));"; /* --- Variable output --- */ %typemap(varout) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, enum SWIGTYPE "$result = Tcl_NewIntObj((long) $1);"; %typemap(varout) long long { char temp[256]; sprintf(temp,"%lld", $1); $result = Tcl_NewStringObj(temp,-1); } %typemap(varout) unsigned long long { char temp[256]; sprintf(temp,"%llu", $1); $result = Tcl_NewStringObj(temp,-1); } %typemap(varout) double,float "$result = Tcl_NewDoubleObj((double) $1);"; %typemap(varout) char * "$result = Tcl_NewStringObj((char*) $1,-1);"; %typemap(varout) char [ANY] "$result = Tcl_NewStringObj((char *) $1,-1);"; %typemap(varout) char "$result = Tcl_NewStringObj(&$1,1);"; %typemap(varout) SWIGTYPE *, SWIGTYPE [] "$result = SWIG_NewPointerObj((void *) $1, $1_descriptor,0);"; %typemap(varout) SWIGTYPE & "$result = SWIG_NewPointerObj((void *) &$1, $1_descriptor,0);"; %typemap(varout) SWIGTYPE *INSTANCE, SWIGTYPE INSTANCE[] "$result = SWIG_NewInstanceObj((void *) $1, $1_descriptor,0);"; %typemap(varout) SWIGTYPE &INSTANCE "$result = SWIG_NewInstanceObj((void *) &$1, $1_descriptor,0);"; %typemap(varout) SWIGTYPE INSTANCE "$result = SWIG_NewInstanceObj((void *) &$1, $&1_descriptor,0);"; %typemap(varout) SWIGTYPE "$result = SWIG_NewInstanceObj((void *) &$1, $&1_descriptor,0);"; %typemap(varout) SWIGTYPE (CLASS::*) "$result = SWIG_NewPackedObj((void *) &$1, sizeof($1_type), $1_descriptor, 0);"; /* -- Variable input --- */ %typemap(varin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE { long temp; if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) { return (char*) "Type error. expected an integer"; } $1 = ($1_type) temp; } %typemap(varin) bool { long temp; if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) { return (char*) "Type error. expected an integer"; } $1 = temp ? true : false; } %typemap(varin) long long "$1 = ($1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0);"; %typemap(varin) unsigned long long "$1 = ($1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL),0,0);"; %typemap(varin) double, float { double temp; if (Tcl_GetDoubleFromObj(interp, $input, &temp) != TCL_OK) { return (char*) "Type error. expected a double."; } $1 = ($1_type) temp; } %typemap(varin) char * #ifdef __cplusplus { char *temp = Tcl_GetStringFromObj($input,NULL); if ($1) delete [] $1; $1 = ($1_type) new char[strlen(temp)+1]; strcpy((char *) $1,temp); } #else { char *temp = Tcl_GetStringFromObj($input,NULL); if ($1) free((char*)$1); $1 = ($1_type) malloc(strlen(temp)+1); strcpy((char *) $1,temp); } #endif %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * #ifdef __cplusplus { char *temp = Tcl_GetStringFromObj($input,NULL); $1 = ($1_type) new char[strlen(temp)+1]; strcpy((char *) $1,temp); } #else { char *temp = Tcl_GetStringFromObj($input,NULL); $1 = ($1_type) malloc(strlen(temp)+1); strcpy((char *) $1,temp); } #endif %typemap(varin) char [ANY] { char *temp = Tcl_GetStringFromObj($input,NULL); strncpy((char*)$1,temp,$1_dim0); } %typemap(varin) char { char *temp = Tcl_GetStringFromObj($input,NULL); $1 = *temp; } %typemap(varin) SWIGTYPE * { void *temp; if (SWIG_ConvertPtr($input,&temp,$1_descriptor, SWIG_POINTER_EXCEPTION | SWIG_POINTER_DISOWN) != TCL_OK) { return (char*)"Type error. Expected $1_ltype"; } $1 = ($1_type) temp; } %typemap(varin) void * { void *temp; if (SWIG_ConvertPtr($input,&temp,0, SWIG_POINTER_EXCEPTION | SWIG_POINTER_DISOWN) != TCL_OK) { return (char*)"Type error. Expected $1_ltype"; } $1 = ($1_type) temp; } %typemap(varin) SWIGTYPE & { void *temp; if (SWIG_ConvertPtr($input,&temp,$1_descriptor, SWIG_POINTER_EXCEPTION) != TCL_OK) { return (char*)"Type error. Expected $1_ltype"; } $1 = *($1_ltype) temp; } %typemap(varin) SWIGTYPE { void *temp; if (SWIG_ConvertPtr($input,&temp,$&1_descriptor, SWIG_POINTER_EXCEPTION) != TCL_OK) { return (char*)"Type error. Expected $&1_ltype"; } $1 = *(($&1_type) temp); } %typemap(varin) SWIGTYPE [ANY] { void *temp; if (SWIG_ConvertPtr($input,&temp,$1_descriptor, SWIG_POINTER_EXCEPTION) != TCL_OK) { return (char *)"Type error. Expected $1_ltype"; } memmove((void *) $1,temp,$1_size*sizeof($1_basetype)); } %typemap(varin) SWIGTYPE (CLASS::*) { char temp[sizeof($1_type)]; if (SWIG_ConvertPacked($input, temp, sizeof($1_type), $1_descriptor, SWIG_POINTER_EXCEPTION) != TCL_OK) { return (char *) "Type error. Expected $1_ltype"; } memmove((void *) &$1, temp, sizeof($1_type)); } /* --- Constants --- */ %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, bool, enum SWIGTYPE { SWIG_TCL_INT, (char *)"$symname", (long) $value, 0, 0, 0} %typemap(consttab) float, double { SWIG_TCL_FLOAT, (char*)"$symname", 0, (double) $value, 0, 0} %typemap(consttab) char, char * { SWIG_TCL_STRING, (char*)"$symname", 0, 0, (void *)"$value", 0} %typemap(consttab) long long, unsigned long long { SWIG_TCL_STRING, (char *) "$symname", 0, 0, (void *)"$value", 0} %typemap(consttab) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { SWIG_TCL_POINTER, (char*)"$symname", 0, 0, (void *)$value, &$1_descriptor} %typemap(consttab) SWIGTYPE (CLASS::*) { SWIG_TCL_BINARY, (char *)"$symname", sizeof($type), 0, (void *)&$value, &$1_descriptor} /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH) { int temp; $1 = ($1_ltype) Tcl_GetStringFromObj($input,&temp); $2 = ($2_ltype) temp; } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %typemap(in) size_t (int temp) "if (Tcl_GetIntFromObj(interp,$input,&temp) == TCL_ERROR) return TCL_ERROR; $1 = (size_t) temp;"; %typemap(out) size_t = long; %typemap(varin) size_t = long; %typemap(varout) size_t = long; %typemap(consttab) size_t = long; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE, bool, const bool & { long tmp; if (Tcl_GetLongFromObj(NULL,$input,&tmp) == TCL_ERROR) $1 = 0; else $1 = 1; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { double tmp; if (Tcl_GetDoubleFromObj(NULL,$input,&tmp) == TCL_ERROR) $1 = 0; else $1 = 1; } %typecheck(SWIG_TYPECHECK_CHAR) char { char *tmp; int len; tmp = Tcl_GetStringFromObj($input,&len); $1 = (len == 1) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $1_descriptor, 0) == TCL_ERROR) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $&1_descriptor, 0) == TCL_ERROR) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, 0, 0) == TCL_ERROR) { $1 = 0; } else { $1 = 1; } } /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { Tcl_SetObjResult(interp, Tcl_NewIntObj((long) $1)); SWIG_fail; } %typemap(throws) SWIGTYPE CLASS { $&1_ltype temp = new $1_ltype($1); Tcl_SetObjResult(interp, SWIG_NewInstanceObj((void *) temp, $&1_descriptor, 1)); SWIG_fail; } %typemap(throws) SWIGTYPE { Tcl_SetObjResult(interp, Tcl_NewStringObj((char*) "$1_type", -1)); SWIG_fail; } %typemap(throws) char * { Tcl_SetObjResult(interp, Tcl_NewStringObj((char*) $1, -1)); SWIG_fail; } // Some special reserved words in classes %include "tcl8kw.swg" /* C++ overloaded operators. These declarations define how SWIG is going to rename C++ overloaded operators in Tcl. Since Tcl allows identifiers to be essentially any valid string, we'll just use the normal operator names */ #ifdef __cplusplus %rename("+") *::operator+; //%rename("u+") *::operator+(); // Unary + //%rename("u+") *::operator+() const; // Unary + %rename("-") *::operator-; //%rename("u-") *::operator-(); // Unary - //%rename("u-") *::operator-() const; // Unary - %rename("*") *::operator*; %rename("/") *::operator/; %rename("<<") *::operator<<; %rename(">>") *::operator>>; %rename("&") *::operator&; %rename("|") *::operator|; %rename("^") *::operator^; %rename("%") *::operator%; %rename("=") *::operator=; #endif /* This initialization code exports the module initialization function */ %header %{ #ifdef __cplusplus extern "C" { #endif #ifdef MAC_TCL #pragma export on #endif SWIGEXPORT(int) SWIG_init(Tcl_Interp *); #ifdef MAC_TCL #pragma export off #endif #ifdef __cplusplus } #endif %} /* Start the initialization function */ %init %{ SWIGEXPORT(int) SWIG_init(Tcl_Interp *interp) { int i; static int _init = 0; if (interp == 0) return TCL_ERROR; #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, (char*)"8.1", 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(interp, (char*)SWIG_name, (char*)SWIG_version); #ifdef SWIG_namespace Tcl_Eval(interp, "namespace eval " SWIG_namespace " { }"); #endif if (!_init) { for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } _init = 1; } for (i = 0; swig_commands[i].name; i++) { Tcl_CreateObjCommand(interp, (char *) swig_commands[i].name, (swig_wrapper_func) swig_commands[i].wrapper, swig_commands[i].clientdata, NULL); } for (i = 0; swig_variables[i].name; i++) { Tcl_SetVar(interp, (char *) swig_variables[i].name, (char *) "", TCL_GLOBAL_ONLY); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_READS | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].get, (ClientData) swig_variables[i].addr); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_WRITES | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].set, (ClientData) swig_variables[i].addr); } SWIG_InstallConstants(interp, swig_constants); %} /* Note: the initialization function is closed after all code is generated */