diff options
Diffstat (limited to 'share/swig/2.0.11/python/pybuffer.i')
-rw-r--r-- | share/swig/2.0.11/python/pybuffer.i | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/share/swig/2.0.11/python/pybuffer.i b/share/swig/2.0.11/python/pybuffer.i new file mode 100644 index 0000000..121cd70 --- /dev/null +++ b/share/swig/2.0.11/python/pybuffer.i @@ -0,0 +1,107 @@ +/* Implementing buffer protocol typemaps */ + +/* %pybuffer_mutable_binary(TYPEMAP, SIZE) + * + * Macro for functions accept mutable buffer pointer with a size. + * This can be used for both input and output. For example: + * + * %pybuffer_mutable_binary(char *buff, int size); + * void foo(char *buff, int size) { + * for(int i=0; i<size; ++i) + * buff[i]++; + * } + */ + +%define %pybuffer_mutable_binary(TYPEMAP, SIZE) +%typemap(in) (TYPEMAP, SIZE) + (int res, Py_ssize_t size = 0, void *buf = 0) { + res = PyObject_AsWriteBuffer($input, &buf, &size); + if (res<0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; + $2 = ($2_ltype) (size/sizeof($*1_type)); +} +%enddef + +/* %pybuffer_mutable_string(TYPEMAP, SIZE) + * + * Macro for functions accept mutable zero terminated string pointer. + * This can be used for both input and output. For example: + * + * %pybuffer_mutable_string(char *str); + * void foo(char *str) { + * while(*str) { + * *str = toupper(*str); + * str++; + * } + */ + +%define %pybuffer_mutable_string(TYPEMAP) +%typemap(in) (TYPEMAP) + (int res, Py_ssize_t size = 0, void *buf = 0) { + res = PyObject_AsWriteBuffer($input, &buf, &size); + if (res<0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; +} +%enddef + +/* pybuffer_binary(TYPEMAP, SIZE) + * + * Macro for functions accept read only buffer pointer with a size. + * This must be used for input. For example: + * + * %pybuffer_binary(char *buff, int size); + * int foo(char *buff, int size) { + * int count = 0; + * for(int i=0; i<size; ++i) + * if (0==buff[i]) count++; + * return count; + * } + */ + +%define %pybuffer_binary(TYPEMAP, SIZE) +%typemap(in) (TYPEMAP, SIZE) + (int res, Py_ssize_t size = 0, const void *buf = 0) { + res = PyObject_AsReadBuffer($input, &buf, &size); + if (res<0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; + $2 = ($2_ltype) (size / sizeof($*1_type)); +} +%enddef + +/* %pybuffer_string(TYPEMAP, SIZE) + * + * Macro for functions accept read only zero terminated string pointer. + * This can be used for input. For example: + * + * %pybuffer_string(char *str); + * int foo(char *str) { + * int count = 0; + * while(*str) { + * if (isalnum(*str)) + * count++; + * str++; + * } + */ + +%define %pybuffer_string(TYPEMAP) +%typemap(in) (TYPEMAP) + (int res, Py_ssize_t size = 0, const void *buf = 0) { + res = PyObject_AsReadBuffer($input, &buf, &size); + if (res<0) { + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; +} +%enddef + + + |