| /* 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 |
| |
| 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 %{ |
| |
| /* In Python 2 we could use PyFile_AsFile for converting Python sys.stdout to C's stdout. |
| This API disappeared in Python 3, so instead we use a helper function to get stdout */ |
| FILE * stdout_stream(void) { |
| return stdout; |
| } |
| |
| 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); |
| } |
| %} |
| |