Edit file File name : pybuffer.i Content :/* 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; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); size = view.len; buf = view.buf; PyBuffer_Release(&view); 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) * * 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; void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); buf = view.buf; PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP)", $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; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); size = view.len; buf = view.buf; PyBuffer_Release(&view); 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) * * 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; const void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); buf = view.buf; PyBuffer_Release(&view); if (res < 0) { %argument_fail(res, "(TYPEMAP)", $symname, $argnum); } $1 = ($1_ltype) buf; } %enddef Save