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