| /* 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 *) PyUnicode_AsUTF8($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); | |
| } | |
| %} | |