summaryrefslogtreecommitdiff
path: root/Examples
diff options
context:
space:
mode:
authorStefan Zager <szager@gmail.com>2011-04-12 18:55:24 +0000
committerStefan Zager <szager@gmail.com>2011-04-12 18:55:24 +0000
commit8f07b3f851ed7f538b68ba151daee1b2d509f119 (patch)
treed2685c89ba32b1df82be3ada51fa16915056bb58 /Examples
parent71a7a52b1652be5c0cbae7a063ed3e77f8ace2ba (diff)
downloadswig-8f07b3f851ed7f538b68ba151daee1b2d509f119.tar.gz
Testcase and fix for bug 1163440: vararg typemaps.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12639 626c5289-ae23-0410-ae9c-e8d60b6d4f22
Diffstat (limited to 'Examples')
-rw-r--r--Examples/test-suite/common.mk3
-rw-r--r--Examples/test-suite/python/varargs_typemap_runme.py4
-rw-r--r--Examples/test-suite/varargs_typemap.i43
3 files changed, 49 insertions, 1 deletions
diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk
index 892ced2c1..9f15df50f 100644
--- a/Examples/test-suite/common.mk
+++ b/Examples/test-suite/common.mk
@@ -510,7 +510,8 @@ C_TEST_CASES += \
typedef_struct \
typemap_subst \
union_parameter \
- unions
+ unions \
+ varargs_typemap
# Multi-module C++ test cases . (Can be run individually using make testcase.multicpptest)
diff --git a/Examples/test-suite/python/varargs_typemap_runme.py b/Examples/test-suite/python/varargs_typemap_runme.py
new file mode 100644
index 000000000..8622051da
--- /dev/null
+++ b/Examples/test-suite/python/varargs_typemap_runme.py
@@ -0,0 +1,4 @@
+import varargs_typemap
+
+if (varargs_typemap.testfunc(1, 2.0, "three") != "three") :
+ raise RuntimeError("testfunc failed!")
diff --git a/Examples/test-suite/varargs_typemap.i b/Examples/test-suite/varargs_typemap.i
new file mode 100644
index 000000000..54c0526f8
--- /dev/null
+++ b/Examples/test-suite/varargs_typemap.i
@@ -0,0 +1,43 @@
+%module varargs_typemap
+
+ /* The typemap and action are taken from the "Variable length arguments"
+ * chapter of the SWIG manual.
+ */
+
+%typemap(in) (...)(char *args[10]) {
+ int i;
+ int argc;
+ for (i = 0; i < 10; i++) args[i] = 0;
+ argc = PyTuple_Size(varargs);
+ if (argc > 10) {
+ PyErr_SetString(PyExc_ValueError,"Too many arguments");
+ return NULL;
+ }
+ for (i = 0; i < argc; i++) {
+ PyObject *o = PyTuple_GetItem(varargs,i);
+ if (!PyString_Check(o)) {
+ PyErr_SetString(PyExc_ValueError,"Expected a string");
+ return NULL;
+ }
+ args[i] = PyString_AsString(o);
+ }
+ $1 = (void *) args;
+}
+
+%feature("action") testfunc {
+ char **args = (char **) arg3;
+ result = testfunc(arg1, arg2, args[0], args[1], args[2], args[3], args[4],
+ args[5],args[6],args[7],args[8],args[9], NULL);
+}
+
+%inline {
+char* testfunc (int arg1, double arg2, ...)
+{
+ va_list ap;
+ char *c;
+ va_start(ap, arg2);
+ c = va_arg(ap, char*);
+ va_end(ap);
+ return c;
+}
+}