/* 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