diff options
author | robot-piglet <[email protected]> | 2025-08-28 14:27:58 +0300 |
---|---|---|
committer | robot-piglet <[email protected]> | 2025-08-28 14:57:06 +0300 |
commit | 81d828c32c8d5477cb2f0ce5da06a1a8d9392ca3 (patch) | |
tree | 3081d566f0d5158d76e9093261344f6406fd09f7 /contrib/tools/swig/Lib/python/pybuffer.i | |
parent | 77ea11423f959e51795cc3ef36a48d808b4ffb98 (diff) |
Intermediate changes
commit_hash:d5b1af16dbe9030537a04c27eb410c88c2f496cd
Diffstat (limited to 'contrib/tools/swig/Lib/python/pybuffer.i')
-rw-r--r-- | contrib/tools/swig/Lib/python/pybuffer.i | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/contrib/tools/swig/Lib/python/pybuffer.i b/contrib/tools/swig/Lib/python/pybuffer.i new file mode 100644 index 00000000000..9ebc36a8c4e --- /dev/null +++ b/contrib/tools/swig/Lib/python/pybuffer.i @@ -0,0 +1,203 @@ +/* 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]++; + * } + */ + +/* Note that in Py_LIMITED_API case we have no choice, but to use deprecated + * functions, as they provides the only way to access buffer data with limited + * API, which doesn't include Py_buffer definition. We also disable the + * warnings about doing this because they're not useful in our case. + */ + +%define %pybuffer_mutable_binary(TYPEMAP, SIZE) +%typemap(in) (TYPEMAP, SIZE) { + int res; Py_ssize_t size = 0; void *buf = 0; +%#ifndef Py_LIMITED_API + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); +%#else + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic push + %#pragma GCC diagnostic ignored "-Wdeprecated" + %#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + %#elif defined(_MSC_VER) + %#pragma warning(push) + %#pragma warning(disable: 4996) + %#endif + res = PyObject_AsWriteBuffer($input, &buf, &size); + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic pop + %#elif defined(_MSC_VER) + %#pragma warning(pop) + %#endif +%#endif + if (res < 0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } +%#ifndef Py_LIMITED_API + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); +%#endif + $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; +%#ifndef Py_LIMITED_API + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); +%#else + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic push + %#pragma GCC diagnostic ignored "-Wdeprecated" + %#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + %#elif defined(_MSC_VER) + %#pragma warning(push) + %#pragma warning(disable: 4996) + %#endif + Py_ssize_t size; + res = PyObject_AsWriteBuffer($input, &buf, &size); + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic pop + %#elif defined(_MSC_VER) + %#pragma warning(pop) + %#endif +%#endif + if (res < 0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP)", $symname, $argnum); + } +%#ifndef Py_LIMITED_API + buf = view.buf; + PyBuffer_Release(&view); +%#endif + $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; +%#ifndef Py_LIMITED_API + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); +%#else + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic push + %#pragma GCC diagnostic ignored "-Wdeprecated" + %#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + %#elif defined(_MSC_VER) + %#pragma warning(push) + %#pragma warning(disable: 4996) + %#endif + res = PyObject_AsReadBuffer($input, &buf, &size); + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic pop + %#elif defined(_MSC_VER) + %#pragma warning(pop) + %#endif +%#endif + if (res < 0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } +%#ifndef Py_LIMITED_API + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); +%#endif + $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; +%#ifndef Py_LIMITED_API + Py_buffer view; + res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); +%#else + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic push + %#pragma GCC diagnostic ignored "-Wdeprecated" + %#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + %#elif defined(_MSC_VER) + %#pragma warning(push) + %#pragma warning(disable: 4996) + %#endif + Py_ssize_t size; + res = PyObject_AsReadBuffer($input, &buf, &size); + %#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) + %#pragma GCC diagnostic pop + %#elif defined(_MSC_VER) + %#pragma warning(pop) + %#endif +%#endif + if (res < 0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP)", $symname, $argnum); + } +%#ifndef Py_LIMITED_API + buf = view.buf; + PyBuffer_Release(&view); +%#endif + $1 = ($1_ltype) buf; +} +%enddef |