diff --git a/wxPython/SWIG/README.txt b/wxPython/SWIG/README.txt new file mode 100644 index 0000000000..2343c669bb --- /dev/null +++ b/wxPython/SWIG/README.txt @@ -0,0 +1,6 @@ + +Some minor tweaks were made to these files to allow wxPython to build +with Python 1.6. Just put these in your swig_lib/python dir and +you'll be all set. These are from SWIG 1.1-810, (yes, I am a bit +behind.) + diff --git a/wxPython/SWIG/pyexp.swg b/wxPython/SWIG/pyexp.swg new file mode 100644 index 0000000000..ab6ecf5400 --- /dev/null +++ b/wxPython/SWIG/pyexp.swg @@ -0,0 +1,29 @@ +/* Definitions for Windows/Unix exporting */ +#if defined(__WIN32__) +# if defined(_MSC_VER) +# define SWIGEXPORT(a) __declspec(dllexport) a +# else +# if defined(__BORLANDC__) +# define SWIGEXPORT(a) a _export +# else +# define SWIGEXPORT(a) a +# endif +# endif +#else +# define SWIGEXPORT(a) a +#endif + +#include "Python.h" + +#ifdef __cplusplus +extern "C" { +#endif +extern void SWIG_MakePtr(char *, void *, char *); +extern void SWIG_RegisterMapping(char *, char *, void *(*)(void *)); +extern char *SWIG_GetPtr(char *, void **, char *); +extern char *SWIG_GetPtrObj(PyObject *, void **, char *); +extern void SWIG_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *)); +extern PyObject *SWIG_newvarlink(void); +#ifdef __cplusplus +} +#endif diff --git a/wxPython/SWIG/typemaps.i b/wxPython/SWIG/typemaps.i new file mode 100644 index 0000000000..041a00a818 --- /dev/null +++ b/wxPython/SWIG/typemaps.i @@ -0,0 +1,561 @@ +// +// SWIG Typemap library +// Dave Beazley +// May 5, 1997 +// +// Python implementation +// +// This library provides standard typemaps for modifying SWIG's behavior. +// With enough entries in this file, I hope that very few people actually +// ever need to write a typemap. +// +// Disclaimer : Unless you really understand how typemaps work, this file +// probably isn't going to make much sense. +// +#ifdef AUTODOC +%section "Typemap Library (Python)",info,after,pre,nosort,skip=1,chop_left=3,chop_right=0,chop_top=0,chop_bottom=0 +%text %{ +%include typemaps.i + +The SWIG typemap library provides a language independent mechanism for +supporting output arguments, input values, and other C function +calling mechanisms. The primary use of the library is to provide a +better interface to certain C function--especially those involving +pointers. +%} + +#endif + +// ------------------------------------------------------------------------ +// Pointer handling +// +// These mappings provide support for input/output arguments and common +// uses for C/C++ pointers. +// ------------------------------------------------------------------------ + +// INPUT typemaps. +// These remap a C pointer to be an "INPUT" value which is passed by value +// instead of reference. + + +#ifdef AUTODOC +%subsection "Input Methods" + +%text %{ +The following methods can be applied to turn a pointer into a simple +"input" value. That is, instead of passing a pointer to an object, +you would use a real value instead. + + int *INPUT + short *INPUT + long *INPUT + unsigned int *INPUT + unsigned short *INPUT + unsigned long *INPUT + unsigned char *INPUT + float *INPUT + double *INPUT + +To use these, suppose you had a C function like this : + + double fadd(double *a, double *b) { + return *a+*b; + } + +You could wrap it with SWIG as follows : + + %include typemaps.i + double fadd(double *INPUT, double *INPUT); + +or you can use the %apply directive : + + %include typemaps.i + %apply double *INPUT { double *a, double *b }; + double fadd(double *a, double *b); + +%} +#endif + +%typemap(python,in) double *INPUT(double temp) +{ + temp = PyFloat_AsDouble($source); + $target = &temp; +} + +%typemap(python,in) float *INPUT(float temp) +{ + temp = (float) PyFloat_AsDouble($source); + $target = &temp; +} + +%typemap(python,in) int *INPUT(int temp) +{ + temp = (int) PyInt_AsLong($source); + $target = &temp; +} + +%typemap(python,in) short *INPUT(short temp) +{ + temp = (short) PyInt_AsLong($source); + $target = &temp; +} + +%typemap(python,in) long *INPUT(long temp) +{ + temp = (long) PyInt_AsLong($source); + $target = &temp; +} +%typemap(python,in) unsigned int *INPUT(unsigned int temp) +{ + temp = (unsigned int) PyInt_AsLong($source); + $target = &temp; +} +%typemap(python,in) unsigned short *INPUT(unsigned short temp) +{ + temp = (unsigned short) PyInt_AsLong($source); + $target = &temp; +} +%typemap(python,in) unsigned long *INPUT(unsigned long temp) +{ + temp = (unsigned long) PyInt_AsLong($source); + $target = &temp; +} +%typemap(python,in) unsigned char *INPUT(unsigned char temp) +{ + temp = (unsigned char) PyInt_AsLong($source); + $target = &temp; +} + +%typemap(python,in) signed char *INPUT(signed char temp) +{ + temp = (unsigned char) PyInt_AsLong($source); + $target = &temp; +} + +// OUTPUT typemaps. These typemaps are used for parameters that +// are output only. The output value is appended to the result as +// a list element. + +#ifdef AUTODOC +%subsection "Output Methods" + +%text %{ +The following methods can be applied to turn a pointer into an "output" +value. When calling a function, no input value would be given for +a parameter, but an output value would be returned. In the case of +multiple output values, they are returned in the form of a Python tuple. + + int *OUTPUT + short *OUTPUT + long *OUTPUT + unsigned int *OUTPUT + unsigned short *OUTPUT + unsigned long *OUTPUT + unsigned char *OUTPUT + float *OUTPUT + double *OUTPUT + +A Python List can also be returned by using L_OUTPUT instead of OUTPUT. + +For example, suppose you were trying to wrap the modf() function in the +C math library which splits x into integral and fractional parts (and +returns the integer part in one of its parameters).K: + + double modf(double x, double *ip); + +You could wrap it with SWIG as follows : + + %include typemaps.i + double modf(double x, double *OUTPUT); + +or you can use the %apply directive : + + %include typemaps.i + %apply double *OUTPUT { double *ip }; + double modf(double x, double *ip); + +The Python output of the function would be a tuple containing both +output values. +%} +#endif + +// Helper function for List output + +%{ +static PyObject* l_output_helper(PyObject* target, PyObject* o) { + PyObject* o2; + if (!target) { + target = o; + } else if (target == Py_None) { + Py_DECREF(Py_None); + target = o; + } else { + if (!PyList_Check(target)) { + o2 = target; + target = PyList_New(0); + PyList_Append(target, o2); + Py_XDECREF(o2); + } + PyList_Append(target,o); + Py_XDECREF(o); + } + return target; +} +%} + +// Force the argument to be ignored. + +%typemap(python,ignore) int *L_OUTPUT(int temp), + short *L_OUTPUT(short temp), + long *L_OUTPUT(long temp), + unsigned int *L_OUTPUT(unsigned int temp), + unsigned short *L_OUTPUT(unsigned short temp), + unsigned long *L_OUTPUT(unsigned long temp), + unsigned char *L_OUTPUT(unsigned char temp), + signed char *L_OUTPUT(signed char temp), + float *L_OUTPUT(float temp), + double *L_OUTPUT(double temp) +{ + $target = &temp; +} + +%typemap(python,argout) int *L_OUTPUT, + short *L_OUTPUT, + long *L_OUTPUT, + unsigned int *L_OUTPUT, + unsigned short *L_OUTPUT, + unsigned long *L_OUTPUT, + unsigned char *L_OUTPUT, + signed char *L_OUTPUT +{ + PyObject *o; + o = PyInt_FromLong((long) (*$source)); + l_output_helper($target,o); +} + +%typemap(python,argout) float *L_OUTPUT, + double *L_OUTPUT +{ + PyObject *o; + o = PyFloat_FromDouble((double) (*$source)); + $target = l_output_helper($target,o); +} + +// These typemaps contributed by Robin Dunn +//---------------------------------------------------------------------- +// +// T_OUTPUT typemap (and helper function) to return multiple argouts as +// a tuple instead of a list. +// +// Author: Robin Dunn +//---------------------------------------------------------------------- + +%{ +static PyObject* t_output_helper(PyObject* target, PyObject* o) { + PyObject* o2; + PyObject* o3; + + if (!target) { + target = o; + } else if (target == Py_None) { + Py_DECREF(Py_None); + target = o; + } else { + if (!PyTuple_Check(target)) { + o2 = target; + target = PyTuple_New(1); + PyTuple_SetItem(target, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SetItem(o3, 0, o); + + o2 = target; + target = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return target; +} +%} + +// Force the argument to be ignored. +%typemap(python,ignore) int *T_OUTPUT(int temp), + short *T_OUTPUT(short temp), + long *T_OUTPUT(long temp), + unsigned int *T_OUTPUT(unsigned int temp), + unsigned short *T_OUTPUT(unsigned short temp), + unsigned long *T_OUTPUT(unsigned long temp), + unsigned char *T_OUTPUT(unsigned char temp), + float *T_OUTPUT(float temp), + double *T_OUTPUT(double temp) +{ + $target = &temp; +} + +%typemap(python,argout) int *T_OUTPUT, + short *T_OUTPUT, + long *T_OUTPUT, + unsigned int *T_OUTPUT, + unsigned short *T_OUTPUT, + unsigned long *T_OUTPUT, + unsigned char *T_OUTPUT +{ + PyObject *o; + o = PyInt_FromLong((long) (*$source)); + $target = t_output_helper($target, o); +} + +%typemap(python,argout) float *T_OUTPUT, + double *T_OUTPUT +{ + PyObject *o; + o = PyFloat_FromDouble((double) (*$source)); + $target = t_output_helper($target, o); +} + +// Set the default output typemap + +#ifdef OUTPUT_LIST +%typemap(python,ignore) int *OUTPUT = int *L_OUTPUT; +%typemap(python,ignore) short *OUTPUT = short *L_OUTPUT; +%typemap(python,ignore) long *OUTPUT = long *L_OUTPUT; +%typemap(python,ignore) unsigned *OUTPUT = unsigned *L_OUTPUT; +%typemap(python,ignore) unsigned short *OUTPUT = unsigned short *L_OUTPUT; +%typemap(python,ignore) unsigned long *OUTPUT = unsigned long *L_OUTPUT; +%typemap(python,ignore) unsigned char *OUTPUT = unsigned char *L_OUTPUT; +%typemap(python,ignore) signed char *OUTPUT = signed char *L_OUTPUT; +%typemap(python,ignore) double *OUTPUT = double *L_OUTPUT; +%typemap(python,ignore) float *OUTPUT = float *L_OUTPUT; + +%typemap(python,argout) int *OUTPUT = int *L_OUTPUT; +%typemap(python,argout) short *OUTPUT = short *L_OUTPUT; +%typemap(python,argout) long *OUTPUT = long *L_OUTPUT; +%typemap(python,argout) unsigned *OUTPUT = unsigned *L_OUTPUT; +%typemap(python,argout) unsigned short *OUTPUT = unsigned short *L_OUTPUT; +%typemap(python,argout) unsigned long *OUTPUT = unsigned long *L_OUTPUT; +%typemap(python,argout) unsigned char *OUTPUT = unsigned char *L_OUTPUT; +%typemap(python,argout) signed char *OUTPUT = signed char *L_OUTPUT; +%typemap(python,argout) double *OUTPUT = double *L_OUTPUT; +%typemap(python,argout) float *OUTPUT = float *L_OUTPUT; +#else +%typemap(python,ignore) int *OUTPUT = int *T_OUTPUT; +%typemap(python,ignore) short *OUTPUT = short *T_OUTPUT; +%typemap(python,ignore) long *OUTPUT = long *T_OUTPUT; +%typemap(python,ignore) unsigned *OUTPUT = unsigned *T_OUTPUT; +%typemap(python,ignore) unsigned short *OUTPUT = unsigned short *T_OUTPUT; +%typemap(python,ignore) unsigned long *OUTPUT = unsigned long *T_OUTPUT; +%typemap(python,ignore) unsigned char *OUTPUT = unsigned char *T_OUTPUT; +%typemap(python,ignore) signed char *OUTPUT = signed char *T_OUTPUT; +%typemap(python,ignore) double *OUTPUT = double *T_OUTPUT; +%typemap(python,ignore) float *OUTPUT = float *T_OUTPUT; + +%typemap(python,argout) int *OUTPUT = int *T_OUTPUT; +%typemap(python,argout) short *OUTPUT = short *T_OUTPUT; +%typemap(python,argout) long *OUTPUT = long *T_OUTPUT; +%typemap(python,argout) unsigned *OUTPUT = unsigned *T_OUTPUT; +%typemap(python,argout) unsigned short *OUTPUT = unsigned short *T_OUTPUT; +%typemap(python,argout) unsigned long *OUTPUT = unsigned long *T_OUTPUT; +%typemap(python,argout) unsigned char *OUTPUT = unsigned char *T_OUTPUT; +%typemap(python,argout) signed char *OUTPUT = signed char *T_OUTPUT; +%typemap(python,argout) double *OUTPUT = double *T_OUTPUT; +%typemap(python,argout) float *OUTPUT = float *T_OUTPUT; +#endif + +// INOUT +// Mappings for an argument that is both an input and output +// parameter + + +#ifdef AUTODOC +%subsection "Input/Output Methods" + +%text %{ +The following methods can be applied to make a function parameter both +an input and output value. This combines the behavior of both the +"INPUT" and "OUTPUT" methods described earlier. Output values are +returned in the form of a Python tuple. To return a Python list, +using L_INOUT instead. + + int *INOUT + short *INOUT + long *INOUT + unsigned int *INOUT + unsigned short *INOUT + unsigned long *INOUT + unsigned char *INOUT + float *INOUT + double *INOUT + +For example, suppose you were trying to wrap the following function : + + void neg(double *x) { + *x = -(*x); + } + +You could wrap it with SWIG as follows : + + %include typemaps.i + void neg(double *INOUT); + +or you can use the %apply directive : + + %include typemaps.i + %apply double *INOUT { double *x }; + void neg(double *x); + +Unlike C, this mapping does not directly modify the input value (since +this makes no sense in Python). Rather, the modified input value shows +up as the return value of the function. Thus, to apply this function +to a Python variable you might do this : + + x = neg(x) + +Note : previous versions of SWIG used the symbol 'BOTH' to mark +input/output arguments. This is still supported, but will be slowly +phased out in future releases. +%} + +#endif + +%typemap(python,in) int *INOUT = int *INPUT; +%typemap(python,in) short *INOUT = short *INPUT; +%typemap(python,in) long *INOUT = long *INPUT; +%typemap(python,in) unsigned *INOUT = unsigned *INPUT; +%typemap(python,in) unsigned short *INOUT = unsigned short *INPUT; +%typemap(python,in) unsigned long *INOUT = unsigned long *INPUT; +%typemap(python,in) unsigned char *INOUT = unsigned char *INPUT; +%typemap(python,in) float *INOUT = float *INPUT; +%typemap(python,in) double *INOUT = double *INPUT; + +%typemap(python,argout) int *INOUT = int *OUTPUT; +%typemap(python,argout) short *INOUT = short *OUTPUT; +%typemap(python,argout) long *INOUT = long *OUTPUT; +%typemap(python,argout) unsigned *INOUT = unsigned *OUTPUT; +%typemap(python,argout) unsigned short *INOUT = unsigned short *OUTPUT; +%typemap(python,argout) unsigned long *INOUT = unsigned long *OUTPUT; +%typemap(python,argout) unsigned char *INOUT = unsigned char *OUTPUT; +%typemap(python,argout) float *INOUT = float *OUTPUT; +%typemap(python,argout) double *INOUT = double *OUTPUT; + +%typemap(python,in) int *T_INOUT = int *INPUT; +%typemap(python,in) short *T_INOUT = short *INPUT; +%typemap(python,in) long *T_INOUT = long *INPUT; +%typemap(python,in) unsigned *T_INOUT = unsigned *INPUT; +%typemap(python,in) unsigned short *T_INOUT = unsigned short *INPUT; +%typemap(python,in) unsigned long *T_INOUT = unsigned long *INPUT; +%typemap(python,in) unsigned char *T_INOUT = unsigned char *INPUT; +%typemap(python,in) float *T_INOUT = float *INPUT; +%typemap(python,in) double *T_INOUT = double *INPUT; + +%typemap(python,argout) int *T_INOUT = int *T_OUTPUT; +%typemap(python,argout) short *T_INOUT = short *T_OUTPUT; +%typemap(python,argout) long *T_INOUT = long *T_OUTPUT; +%typemap(python,argout) unsigned *T_INOUT = unsigned *T_OUTPUT; +%typemap(python,argout) unsigned short *T_INOUT = unsigned short *T_OUTPUT; +%typemap(python,argout) unsigned long *T_INOUT = unsigned long *T_OUTPUT; +%typemap(python,argout) unsigned char *T_INOUT = unsigned char *T_OUTPUT; +%typemap(python,argout) float *T_INOUT = float *T_OUTPUT; +%typemap(python,argout) double *T_INOUT = double *T_OUTPUT; + +%typemap(python,in) int *L_INOUT = int *INPUT; +%typemap(python,in) short *L_INOUT = short *INPUT; +%typemap(python,in) long *L_INOUT = long *INPUT; +%typemap(python,in) unsigned *L_INOUT = unsigned *INPUT; +%typemap(python,in) unsigned short *L_INOUT = unsigned short *INPUT; +%typemap(python,in) unsigned long *L_INOUT = unsigned long *INPUT; +%typemap(python,in) unsigned char *L_INOUT = unsigned char *INPUT; +%typemap(python,in) float *L_INOUT = float *INPUT; +%typemap(python,in) double *L_INOUT = double *INPUT; + +%typemap(python,argout) int *L_INOUT = int *L_OUTPUT; +%typemap(python,argout) short *L_INOUT = short *L_OUTPUT; +%typemap(python,argout) long *L_INOUT = long *L_OUTPUT; +%typemap(python,argout) unsigned *L_INOUT = unsigned *L_OUTPUT; +%typemap(python,argout) unsigned short *L_INOUT = unsigned short *L_OUTPUT; +%typemap(python,argout) unsigned long *L_INOUT = unsigned long *L_OUTPUT; +%typemap(python,argout) unsigned char *L_INOUT = unsigned char *L_OUTPUT; +%typemap(python,argout) float *L_INOUT = float *L_OUTPUT; +%typemap(python,argout) double *L_INOUT = double *L_OUTPUT; + +// Backwards compatibility + +%typemap(python,in) int *BOTH = int *INOUT; +%typemap(python,in) short *BOTH = short *INOUT; +%typemap(python,in) long *BOTH = long *INOUT; +%typemap(python,in) unsigned *BOTH = unsigned *INOUT; +%typemap(python,in) unsigned short *BOTH = unsigned short *INOUT; +%typemap(python,in) unsigned long *BOTH = unsigned long *INOUT; +%typemap(python,in) unsigned char *BOTH = unsigned char *INOUT; +%typemap(python,in) float *BOTH = float *INOUT; +%typemap(python,in) double *BOTH = double *INOUT; + +%typemap(python,argout) int *BOTH = int *INOUT; +%typemap(python,argout) short *BOTH = short *INOUT; +%typemap(python,argout) long *BOTH = long *INOUT; +%typemap(python,argout) unsigned *BOTH = unsigned *INOUT; +%typemap(python,argout) unsigned short *BOTH = unsigned short *INOUT; +%typemap(python,argout) unsigned long *BOTH = unsigned long *INOUT; +%typemap(python,argout) unsigned char *BOTH = unsigned char *INOUT; +%typemap(python,argout) float *BOTH = float *INOUT; +%typemap(python,argout) double *BOTH = double *INOUT; + +%typemap(python,in) int *T_BOTH = int *T_INOUT; +%typemap(python,in) short *T_BOTH = short *T_INOUT; +%typemap(python,in) long *T_BOTH = long *T_INOUT; +%typemap(python,in) unsigned *T_BOTH = unsigned *T_INOUT; +%typemap(python,in) unsigned short *T_BOTH = unsigned short *T_INOUT; +%typemap(python,in) unsigned long *T_BOTH = unsigned long *T_INOUT; +%typemap(python,in) unsigned char *T_BOTH = unsigned char *T_INOUT; +%typemap(python,in) float *T_BOTH = float *T_INOUT; +%typemap(python,in) double *T_BOTH = double *T_INOUT; + +%typemap(python,argout) int *T_BOTH = int *T_INOUT; +%typemap(python,argout) short *T_BOTH = short *T_INOUT; +%typemap(python,argout) long *T_BOTH = long *T_INOUT; +%typemap(python,argout) unsigned *T_BOTH = unsigned *T_INOUT; +%typemap(python,argout) unsigned short *T_BOTH = unsigned short *T_INOUT; +%typemap(python,argout) unsigned long *T_BOTH = unsigned long *T_INOUT; +%typemap(python,argout) unsigned char *T_BOTH = unsigned char *T_INOUT; +%typemap(python,argout) float *T_BOTH = float *T_INOUT; +%typemap(python,argout) double *T_BOTH = double *T_INOUT; + +// -------------------------------------------------------------------- +// Special types +// +// -------------------------------------------------------------------- + +#ifdef AUTODOC +%subsection "Special Methods" + +%text %{ +The typemaps.i library also provides the following mappings : + +PyObject * + + When a PyObject * appears as either an input value or return + value of a function, SWIG passes it through unmodified. Thus, + if you want to write a C function that operates on PyObjects, + it is easy to write. For example : + + %include typemaps.i + PyObject *spam(PyObject *obj1, int n); + + Unlike normal Python wrapper functions, These functions can + use any combination of parameters that you wish. + +%} + +#endif + + +// If a PyObject * appears as either an argument or a function return +// value, simply pass it straight through. + +%typemap(python,in) PyObject * { + $target = $source; +} + +%typemap(python,out) PyObject * { + $target = $source; +} +