X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/7a75bb76cdc042870f5df7e6945bc0f376daf6ce..2aa7d3a9238bfb3d117ca23191ea402c5c5d6f40:/buffer.c?ds=inline diff --git a/buffer.c b/buffer.c index 690c7cd..59eaec6 100644 --- a/buffer.c +++ b/buffer.c @@ -52,18 +52,18 @@ static PyObject *buferr; static PyObject *rbuf_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) { - char *p, *q; - Py_ssize_t n; + struct bin in; + void *q; buf_pyobj *me = 0; static const char *const kwlist[] = { "data", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", KWLIST, &p, &n)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new", KWLIST, convbin, &in)) goto end; - q = xmalloc(n); - memcpy(q, p, n); + q = xmalloc(in.sz); + memcpy(q, in.p, in.sz); me = (buf_pyobj *)ty->tp_alloc(ty, 0); me->sub = 0; - buf_init(&me->b, q, n); + buf_init(&me->b, q, in.sz); end: return ((PyObject *)me); } @@ -280,8 +280,8 @@ static const PyBufferProcs rbuf_pybuffer = { 0 /* @bf_getcharbuffer@ */ }; -static PyTypeObject rbuf_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject rbuf_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "ReadBuffer", /* @tp_name@ */ sizeof(buf_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */ @@ -383,11 +383,10 @@ static PyObject *wbmeth_zero(PyObject *me, PyObject *arg) static PyObject *wbmeth_put(PyObject *me, PyObject *arg) { - void *p; - Py_ssize_t n; - if (!PyArg_ParseTuple(arg, "s#:put", &p, &n)) return (0); - ensure(me, n); - buf_put(BUF_B(me), p, n); assert(BOK(BUF_B(me))); + struct bin in; + if (!PyArg_ParseTuple(arg, "O&:put", convbin, &in)) return (0); + ensure(me, in.sz); + buf_put(BUF_B(me), in.p, in.sz); assert(BOK(BUF_B(me))); RETURN_ME; } @@ -407,12 +406,11 @@ DOUINTCONV(WBMETH_PUTU_) #define WBMETH_PUTBLK_(n, W, w) \ static PyObject *wbmeth_putblk##w(PyObject *me, PyObject *arg) \ { \ - char *p; \ - Py_ssize_t sz; \ - if (!PyArg_ParseTuple(arg, "s#:putblk" #w, &p, &sz)) goto end; \ - if (MASK##W && sz > MASK##W) VALERR("too large"); \ - ensure(me, sz + SZ_##n); \ - buf_putmem##w(BUF_B(me), p, sz); assert(BOK(BUF_B(me))); \ + struct bin in; \ + if (!PyArg_ParseTuple(arg, "O&:putblk" #w, convbin, &in)) goto end; \ + if (MASK##W && in.sz > MASK##W) VALERR("too large"); \ + ensure(me, in.sz + SZ_##n); \ + buf_putmem##w(BUF_B(me), in.p, in.sz); assert(BOK(BUF_B(me))); \ RETURN_ME; \ end: \ return (0); \ @@ -520,8 +518,8 @@ static const PyBufferProcs wbuf_pybuffer = { 0 /* @bf_getcharbuffer@ */ }; -static PyTypeObject wbuf_pytype_skel = { - PyObject_HEAD_INIT(0) 0, /* Header */ +static const PyTypeObject wbuf_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ "WriteBuffer", /* @tp_name@ */ sizeof(buf_pyobj), /* @tp_basicsize@ */ 0, /* @tp_itemsize@ */