#include "catacomb-python.h"
-/*----- Data structures ---------------------------------------------------*/
-
-typedef struct buf_pyobj {
- PyObject_HEAD
- buf b;
- PyObject *sub;
- unsigned lk;
-} buf_pyobj;
-
-static PyTypeObject *rbuf_pytype, *wbuf_pytype;
-#define RBUF_PYCHECK(o) PyObject_TypeCheck((o), rbuf_pytype)
-#define WBUF_PYCHECK(o) PyObject_TypeCheck((o), wbuf_pytype)
-#define BUF_B(o) (&((buf_pyobj *)(o))->b)
-#define BUF_SUB(o) (((buf_pyobj *)(o))->sub)
-#define BUF_LK(o) (((buf_pyobj *)(o))->lk)
-
-/*----- Exceptions --------------------------------------------------------*/
-
-static PyObject *buferr;
-
-#define BUFERR(str) do { PyErr_SetString(buferr, str); goto end; } while (0)
-
/*----- Read buffers ------------------------------------------------------*/
+PyTypeObject *rbuf_pytype;
+
static PyObject *rbuf_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
struct bin in;
/*----- Write buffers -----------------------------------------------------*/
-static int ensure(PyObject *me, size_t n)
+PyTypeObject *wbuf_pytype;
+
+int ensurebuf(PyObject *me, size_t n)
{
buf *b = BUF_B(me);
size_t nn = BSZ(b);
void *p;
size_t n;
if (!PyArg_ParseTuple(arg, "O&:zero", convszt, &n)) return (0);
- if (ensure(me, n)) return (0);
+ if (ensurebuf(me, n)) return (0);
p = buf_get(BUF_B(me), n); assert(p && BOK(BUF_B(me)));
memset(p, 0, n);
RETURN_ME;
{
struct bin in;
if (!PyArg_ParseTuple(arg, "O&:put", convbin, &in)) return (0);
- if (ensure(me, in.sz)) return (0);
+ if (ensurebuf(me, in.sz)) return (0);
buf_put(BUF_B(me), in.p, in.sz); assert(BOK(BUF_B(me)));
RETURN_ME;
}
{ \
uint##n i; \
if (!PyArg_ParseTuple(arg, "O&:putu" #w, convu##n, &i)) return (0); \
- if (ensure(me, SZ_##n)) return (0); \
+ if (ensurebuf(me, SZ_##n)) return (0); \
buf_putu##w(BUF_B(me), i); assert(BOK(BUF_B(me))); \
RETURN_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"); \
- if (ensure(me, in.sz + SZ_##n)) return (0); \
+ if (ensurebuf(me, in.sz + SZ_##n)) return (0); \
buf_putmem##w(BUF_B(me), in.p, in.sz); assert(BOK(BUF_B(me))); \
RETURN_ME; \
end: \
{
mp *x = 0;
if (!PyArg_ParseTuple(arg, "O&:putmp", convmp, &x)) return (0);
- if (ensure(me, mp_octets(x) + 2)) return (0);
+ if (ensurebuf(me, mp_octets(x) + 2)) return (0);
buf_putmp(BUF_B(me), x); assert(BOK(BUF_B(me)));
RETURN_ME;
}
{
mp *x = 0;
if (!PyArg_ParseTuple(arg, "O&:putgf", convgf, &x)) return (0);
- if (ensure(me, mp_octets(x) + 2)) return (0);
+ if (ensurebuf(me, mp_octets(x) + 2)) return (0);
buf_putmp(BUF_B(me), x); assert(BOK(BUF_B(me)));
MP_DROP(x);
RETURN_ME;
{
ec pt = EC_INIT;
if (!PyArg_ParseTuple(arg, "O&:putecpt", convecpt, &pt)) return (0);
- if (ensure(me, EC_ATINF(&pt) ? 2 : 6 + mp_octets(pt.x) + mp_octets(pt.y)))
+ if (ensurebuf(me, EC_ATINF(&pt) ? 2 :
+ 6 + mp_octets(pt.x) + mp_octets(pt.y)))
return (0);
buf_putec(BUF_B(me), &pt); assert(BOK(BUF_B(me)));
EC_DESTROY(&pt);
if (!PyArg_ParseTuple(arg, "O!:putecptraw", ecptcurve_pytype, &ptobj))
return (0);
EC_OUT(ECPT_C(ptobj), &pt, ECPT_P(ptobj));
- if (ensure(me, ECPT_C(ptobj)->f->noctets * 2 + 1)) return (0);
+ if (ensurebuf(me, ECPT_C(ptobj)->f->noctets * 2 + 1)) return (0);
ec_putraw(ECPT_C(ptobj), BUF_B(me), &pt); assert(BOK(BUF_B(me)));
EC_DESTROY(&pt);
RETURN_ME;
{
PyObject *geobj;
if (!PyArg_ParseTuple(arg, "O!:putge", ge_pytype, &geobj)) return (0);
- if (ensure(me, GE_G(geobj)->noctets)) return (0);
+ if (ensurebuf(me, GE_G(geobj)->noctets)) return (0);
G_TOBUF(GE_G(geobj), BUF_B(me), GE_X(geobj)); assert(BOK(BUF_B(me)));
RETURN_ME;
}
{
PyObject *geobj;
if (!PyArg_ParseTuple(arg, "O!:putgeraw", ge_pytype, &geobj)) return (0);
- if (ensure(me, GE_G(geobj)->noctets)) return (0);
+ if (ensurebuf(me, GE_G(geobj)->noctets)) return (0);
G_TORAW(GE_G(geobj), BUF_B(me), GE_X(geobj)); assert(BOK(BUF_B(me)));
RETURN_ME;
}
/*----- Initialization ----------------------------------------------------*/
+PyObject *buferr;
+
void buffer_pyinit(void)
{
INITTYPE(rbuf, root);