From 56cae57105bd7d2d39bff4e4d76b7f21d3a3b70b Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Tue, 23 Apr 2013 14:40:47 -0400 Subject: [PATCH] Use new-style buffer interface for 's' format character in _pvt_struct_v3. --- src/wrapper/_pvt_struct_v3.cpp | 43 ++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/wrapper/_pvt_struct_v3.cpp b/src/wrapper/_pvt_struct_v3.cpp index c911c54a..316062f1 100644 --- a/src/wrapper/_pvt_struct_v3.cpp +++ b/src/wrapper/_pvt_struct_v3.cpp @@ -1223,24 +1223,41 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf) if (e->format == 's') { int isstring; void *p; - isstring = PyBytes_Check(v); - if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(StructError, - "argument for 's' must be a bytes object"); - return -1; - } - if (isstring) { + if (PyBytes_Check(v)) { n = PyBytes_GET_SIZE(v); p = PyBytes_AS_STRING(v); - } - else { + + if (n > code->size) + n = code->size; + if (n > 0) + memcpy(res, p, n); + } else if (PyByteArray_Check(v)) { n = PyByteArray_GET_SIZE(v); p = PyByteArray_AS_STRING(v); + + if (n > code->size) + n = code->size; + if (n > 0) + memcpy(res, p, n); + } else if (PyObject_CheckBuffer(v)) { + Py_buffer view; + int gb_result = PyObject_GetBuffer(v, &view, PyBUF_SIMPLE); + + if (gb_result == -1) + return gb_result; + + n = view.len; + if (n > code->size) + n = code->size; + if (n > 0) + memcpy(res, view.buf, n); + + PyBuffer_Release(&view); + } else { + PyErr_SetString(StructError, + "argument for 's' must be a bytes object"); + return -1; } - if (n > code->size) - n = code->size; - if (n > 0) - memcpy(res, p, n); } else if (e->format == 'p') { int isstring; void *p; -- GitLab