static PyObject * buffer_from_object(PyObject *base, Py_ssize_t size, Py_ssize_t offset, int readonly) { if (offset < 0) { PyErr_SetString(PyExc_ValueError, "offset must be zero or positive"); return NULL; } if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) { /* another buffer, refer to the base object */ PyBufferObject *b = (PyBufferObject *)base; if (b->b_size != Py_END_OF_BUFFER) { Py_ssize_t base_size = b->b_size - offset; if (base_size < 0) base_size = 0; if (size == Py_END_OF_BUFFER || size > base_size) size = base_size; } offset += b->b_offset; base = b->b_base; } return buffer_from_memory(base, size, offset, NULL, readonly); }
PyObject * PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size) { return buffer_from_memory(NULL, size, 0, ptr, 0); }
PyObject * PyBuffer_FromMemory(void *ptr, int size) { return buffer_from_memory(NULL, size, 0, ptr, 1); }