X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/8ebc32d8616aeac9892d20cebfbdc1b531b29d2c..1c7419c9920b70c22bbeefe00f3e11aed6c6ffbd:/buffer.c?ds=sidebyside diff --git a/buffer.c b/buffer.c index 43ed43d..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); } @@ -107,10 +107,9 @@ end: } #define RBMETH_GETU_(n, W, w) \ - static PyObject *rbmeth_getu##w(PyObject *me, PyObject *arg) \ + static PyObject *rbmeth_getu##w(PyObject *me) \ { \ uint##n x; \ - if (!PyArg_ParseTuple(arg, ":getu" #w)) goto end; \ if (buf_getu##w(BUF_B(me), &x)) BUFERR("buffer exhausted"); \ if (MASK##W <= ULONG_MAX) return (getulong(x)); \ else { kludge64 y; ASSIGN64(y, x); return (getk64(y)); } \ @@ -120,11 +119,10 @@ end: DOUINTCONV(RBMETH_GETU_) #define RBMETH_GETBLK_(n, W, w) \ - static PyObject *rbmeth_getblk##w(PyObject *me, PyObject *arg) \ + static PyObject *rbmeth_getblk##w(PyObject *me) \ { \ size_t sz; \ char *q; \ - if (!PyArg_ParseTuple(arg, ":getblk" #w)) goto end; \ if ((q = buf_getmem##w(BUF_B(me), &sz)) == 0) \ BUFERR("buffer exhausted"); \ return (bytestring_pywrap(q, sz)); \ @@ -134,11 +132,10 @@ DOUINTCONV(RBMETH_GETU_) BUF_DOSUFFIXES(RBMETH_GETBLK_) #define RBMETH_GETBUF_(n, W, w) \ - static PyObject *rbmeth_getbuf##w(PyObject *me, PyObject *arg) \ + static PyObject *rbmeth_getbuf##w(PyObject *me) \ { \ buf_pyobj *b; \ buf bb; \ - if (!PyArg_ParseTuple(arg, ":getbuf" #w)) goto end; \ if (buf_getbuf##w(BUF_B(me), &bb)) BUFERR("buffer exhausted"); \ b = PyObject_NEW(buf_pyobj, rbuf_pytype); \ b->b = bb; \ @@ -150,20 +147,18 @@ BUF_DOSUFFIXES(RBMETH_GETBLK_) } BUF_DOSUFFIXES(RBMETH_GETBUF_) -static PyObject *rbmeth_getmp(PyObject *me, PyObject *arg) +static PyObject *rbmeth_getmp(PyObject *me) { mp *x; - if (!PyArg_ParseTuple(arg, ":getmp")) goto end; if ((x = buf_getmp(BUF_B(me))) == 0) BUFERR("buffer exhausted"); return (mp_pywrap(x)); end: return (0); } -static PyObject *rbmeth_getgf(PyObject *me, PyObject *arg) +static PyObject *rbmeth_getgf(PyObject *me) { mp *x; - if (!PyArg_ParseTuple(arg, ":getgf")) goto end; if ((x = buf_getmp(BUF_B(me))) == 0) BUFERR("buffer exhausted"); return (gf_pywrap(x)); end: @@ -245,7 +240,7 @@ end: return (-1); } -static PyGetSetDef rbuf_pygetset[] = { +static const PyGetSetDef rbuf_pygetset[] = { #define GETSETNAME(op, name) rb##op##_##name GET (size, "RBUF.size -> SIZE") GET (left, "RBUF.left -> REMAINDER") @@ -255,21 +250,21 @@ static PyGetSetDef rbuf_pygetset[] = { { 0 } }; -static PyMethodDef rbuf_pymethods[] = { +static const PyMethodDef rbuf_pymethods[] = { #define METHNAME(func) rbmeth_##func METH (skip, "RBUF.skip(N)") METH (get, "RBUF.get(N) -> BYTES") #define RBMETH_DECL_GETU_(n, W, w) \ - METH(getu##w, "RBUF.getu" #w "() -> INT") + NAMETH(getu##w, "RBUF.getu" #w "() -> INT") DOUINTCONV(RBMETH_DECL_GETU_) #define RBMETH_DECL_GETBLK_(n, W, w) \ - METH(getblk##w, "RBUF.getblk" #w "() -> BYTES") + NAMETH(getblk##w, "RBUF.getblk" #w "() -> BYTES") BUF_DOSUFFIXES(RBMETH_DECL_GETBLK_) #define RBMETH_DECL_GETBUF_(n, W, w) \ - METH(getbuf##w, "RBUF.getbuf" #w "() -> RBUF'") + NAMETH(getbuf##w, "RBUF.getbuf" #w "() -> RBUF'") BUF_DOSUFFIXES(RBMETH_DECL_GETBUF_) - METH (getmp, "RBUF.getmp() -> X") - METH (getgf, "RBUF.getgf() -> X") + NAMETH(getmp, "RBUF.getmp() -> X") + NAMETH(getgf, "RBUF.getgf() -> X") KWMETH(getecpt, "RBUF.getecpt([curve = None]) -> P") METH (getecptraw, "RBUF.getecptraw(CURVE) -> P") METH (getge, "RBUF.getge(GROUP) -> X") @@ -278,15 +273,15 @@ static PyMethodDef rbuf_pymethods[] = { { 0 } }; -static PyBufferProcs rbuf_pybuffer = { +static const PyBufferProcs rbuf_pybuffer = { rbuf_pyreadbuf, /* @bf_getreadbuffer@ */ 0, /* @bf_getwritebuffer@ */ rbuf_pysegcount, /* @bf_getsegcount@ */ 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@ */ @@ -305,7 +300,7 @@ static PyTypeObject rbuf_pytype_skel = { 0, /* @tp_str@ */ 0, /* @tp_getattro@ */ 0, /* @tp_setattro@ */ - &rbuf_pybuffer, /* @tp_as_buffer@ */ + PYBUFFER(rbuf), /* @tp_as_buffer@ */ Py_TPFLAGS_DEFAULT | /* @tp_flags@ */ Py_TPFLAGS_BASETYPE, @@ -318,9 +313,9 @@ static PyTypeObject rbuf_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - rbuf_pymethods, /* @tp_methods@ */ + PYMETHODS(rbuf), /* @tp_methods@ */ 0, /* @tp_members@ */ - rbuf_pygetset, /* @tp_getset@ */ + PYGETSET(rbuf), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */ @@ -388,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; } @@ -412,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); \ @@ -490,7 +483,7 @@ static PyObject *wbget_size(PyObject *me, void *hunoz) static PyObject *wbget_contents(PyObject *me, void *hunoz) { return (bytestring_pywrap(BBASE(BUF_B(me)), BLEN(BUF_B(me)))); } -static PyGetSetDef wbuf_pygetset[] = { +static const PyGetSetDef wbuf_pygetset[] = { #define GETSETNAME(op, name) wb##op##_##name GET (size, "WBUF.size -> SIZE") GET (contents, "WBUF.contents -> STR") @@ -498,7 +491,7 @@ static PyGetSetDef wbuf_pygetset[] = { { 0 } }; -static PyMethodDef wbuf_pymethods[] = { +static const PyMethodDef wbuf_pymethods[] = { #define METHNAME(func) wbmeth_##func METH (zero, "WBUF.zero(N)") METH (put, "WBUF.put(BYTES)") @@ -518,15 +511,15 @@ static PyMethodDef wbuf_pymethods[] = { { 0 } }; -static PyBufferProcs wbuf_pybuffer = { +static const PyBufferProcs wbuf_pybuffer = { wbuf_pyreadbuf, /* @bf_getreadbuffer@ */ 0, /* @bf_getwritebuffer@ */ wbuf_pysegcount, /* @bf_getsegcount@ */ 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@ */ @@ -545,7 +538,7 @@ static PyTypeObject wbuf_pytype_skel = { 0, /* @tp_str@ */ 0, /* @tp_getattro@ */ 0, /* @tp_setattro@ */ - &wbuf_pybuffer, /* @tp_as_buffer@ */ + PYBUFFER(wbuf), /* @tp_as_buffer@ */ Py_TPFLAGS_DEFAULT | /* @tp_flags@ */ Py_TPFLAGS_BASETYPE, @@ -558,9 +551,9 @@ static PyTypeObject wbuf_pytype_skel = { 0, /* @tp_weaklistoffset@ */ 0, /* @tp_iter@ */ 0, /* @tp_iternext@ */ - wbuf_pymethods, /* @tp_methods@ */ + PYMETHODS(wbuf), /* @tp_methods@ */ 0, /* @tp_members@ */ - wbuf_pygetset, /* @tp_getset@ */ + PYGETSET(wbuf), /* @tp_getset@ */ 0, /* @tp_base@ */ 0, /* @tp_dict@ */ 0, /* @tp_descr_get@ */