chiark / gitweb /
*.c: Introduce a new input conversion for binary strings.
[catacomb-python] / buffer.c
index 6f6d422b2293fde2a2848a1418eead950772eb6e..59eaec614cb0a57de91db11381e053c692c7de5e 100644 (file)
--- 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);
 }
@@ -281,7 +281,7 @@ static const PyBufferProcs rbuf_pybuffer = {
 };
 
 static const PyTypeObject rbuf_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  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);                                                                \
@@ -521,7 +519,7 @@ static const PyBufferProcs wbuf_pybuffer = {
 };
 
 static const PyTypeObject wbuf_pytype_skel = {
-  PyObject_HEAD_INIT(0) 0,             /* Header */
+  PyVarObject_HEAD_INIT(0, 0)          /* Header */
   "WriteBuffer",                       /* @tp_name@ */
   sizeof(buf_pyobj),                   /* @tp_basicsize@ */
   0,                                   /* @tp_itemsize@ */