summaryrefslogtreecommitdiff
path: root/Examples/python/varargs
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2009-08-18 20:56:02 +0000
committerLorry <lorry@roadtrain.codethink.co.uk>2012-09-25 16:59:08 +0000
commit9f8a09ed743cedd9547bf0661d518647966ab114 (patch)
tree9c7803d3b27a8ec22e91792ac7f7932efa128b20 /Examples/python/varargs
downloadswig-tarball-master.tar.gz
Imported from /srv/lorry/lorry-area/swig-tarball/swig-1.3.40.tar.gz.HEADswig-1.3.40master
Diffstat (limited to 'Examples/python/varargs')
-rw-r--r--Examples/python/varargs/Makefile20
-rw-r--r--Examples/python/varargs/example.i65
-rw-r--r--Examples/python/varargs/runme.py34
3 files changed, 119 insertions, 0 deletions
diff --git a/Examples/python/varargs/Makefile b/Examples/python/varargs/Makefile
new file mode 100644
index 0000000..1420b4e
--- /dev/null
+++ b/Examples/python/varargs/Makefile
@@ -0,0 +1,20 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS =
+TARGET = example
+INTERFACE = example.i
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ TARGET='mypython' INTERFACE='$(INTERFACE)' python_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile python_clean
+ rm -f $(TARGET).py
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile python_run
diff --git a/Examples/python/varargs/example.i b/Examples/python/varargs/example.i
new file mode 100644
index 0000000..6cb88f5
--- /dev/null
+++ b/Examples/python/varargs/example.i
@@ -0,0 +1,65 @@
+/* File : example.i */
+%module example
+
+%{
+#include <stdarg.h>
+%}
+
+/* This example illustrates SWIG's handling of varargs functions.
+ By default, variable length arguments are simply ignored. This
+ is generally appropriate for wrapping I/O functions like printf.
+ You can simply format a string in the scripting language, and
+ pass it directly */
+
+int printf(const char *fmt, ...);
+
+/* Since passing a format string might be dangerous. Here is a slightly
+ different way of wrapping a printf style function */
+
+#if 1
+/* Replace ... with char *. */
+%varargs(char *) fprintf;
+
+/* Ignore the format string, but set it to %s */
+%typemap(in,numinputs=0) const char *fmt {
+ $1 = "%s";
+}
+#else
+/* An alternative approach using typemaps */
+%typemap(in) (const char *fmt, ...) {
+ $1 = "%s";
+ $2 = (void *) PyString_AsString($input);
+}
+#endif
+
+/* Typemap just to make the example work */
+%typemap(in) FILE * "$1 = PyFile_AsFile($input);";
+
+int fprintf(FILE *, const char *fmt, ...);
+
+/* Here is somewhat different example. A variable length argument
+ function that takes a NULL-terminated list of arguments. We
+ can use a slightly different form of %varargs that specifies
+ a default value and a maximum number of arguments.
+ */
+
+/* Maximum of 20 arguments with default value NULL */
+
+%varargs(20, char *x = NULL) printv;
+
+%inline %{
+void printv(char *s, ...) {
+ va_list ap;
+ char *x;
+ fputs(s,stdout);
+ fputc(' ',stdout);
+ va_start(ap, s);
+ while ((x = va_arg(ap, char *))) {
+ fputs(x,stdout);
+ fputc(' ',stdout);
+ }
+ va_end(ap);
+ fputc('\n',stdout);
+}
+%}
+
diff --git a/Examples/python/varargs/runme.py b/Examples/python/varargs/runme.py
new file mode 100644
index 0000000..a01cb67
--- /dev/null
+++ b/Examples/python/varargs/runme.py
@@ -0,0 +1,34 @@
+# file: runme.py
+
+import sys
+import example
+
+# Call printf
+example.printf("Hello World. I'm printf\n")
+
+# Note: We call printf, but use *python* string formatting
+for i in range(0,10):
+ example.printf("i is %d\n" % i)
+
+# This will probably be garbled because %d is interpreted by C
+example.printf("The value is %d\n")
+
+# Call fprintf
+example.fprintf(sys.stdout,"Hello World. I'm fprintf\n")
+for i in range(0,10):
+ example.fprintf(sys.stdout,"i is %d\n" % i)
+
+# This won't be garbled since %d is not interpreted
+example.fprintf(sys.stdout,"The value is %d\n")
+
+# This function calls our NULL-terminated function
+
+example.printv("Hello","World","this","is","a","test.")
+
+
+
+
+
+
+
+