diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2009-08-18 20:56:02 +0000 |
---|---|---|
committer | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-09-25 16:59:08 +0000 |
commit | 9f8a09ed743cedd9547bf0661d518647966ab114 (patch) | |
tree | 9c7803d3b27a8ec22e91792ac7f7932efa128b20 /Examples/python/varargs | |
download | swig-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/Makefile | 20 | ||||
-rw-r--r-- | Examples/python/varargs/example.i | 65 | ||||
-rw-r--r-- | Examples/python/varargs/runme.py | 34 |
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.") + + + + + + + + |