Index: swig/Lib/python/pybuffer.i |
=================================================================== |
--- swig/Lib/python/pybuffer.i (revision 0) |
+++ swig/Lib/python/pybuffer.i (revision 0) |
@@ -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 |
+ |
+ |
+ |