/trunk/Lib/python/pybuffer.i
Swig | 107 lines | 45 code | 11 blank | 51 comment | 0 complexity | e9a347c68372c564c8283bc4337bab2f MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- /* 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