Port to Python 3.
[catacomb-python] / buffer.c
index fe7633d..0d3d165 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -58,10 +58,18 @@ static void buf_pydealloc(PyObject *me)
   FREEOBJ(me);
 }
 
+#ifdef PY3
+  static int rbuf_pygetbuf(PyObject *me, Py_buffer *vw, int f)
+  {
+    buf *b = BUF_B(me);
+    return (PyBuffer_FillInfo(vw, me, BCUR(b), BLEFT(b), 1, f));
+  }
+#else
   static Py_ssize_t rbuf_pysegcount(PyObject *me, Py_ssize_t *nn)
     { if (nn) *nn = BSZ(BUF_B(me)); return (1); }
   static Py_ssize_t rbuf_pyreadbuf(PyObject *me, Py_ssize_t seg, void **q)
     { assert(seg == 0); *q = BCUR(BUF_B(me)); return (BLEFT(BUF_B(me))); }
+#endif
 
 static PyObject *rbmeth_skip(PyObject *me, PyObject *arg)
 {
@@ -256,10 +264,15 @@ static const PyMethodDef rbuf_pymethods[] = {
 };
 
 static const PyBufferProcs rbuf_pybuffer = {
+#ifdef PY3
+  rbuf_pygetbuf,                       /* @bf_getbuffer@ */
+  0,                                   /* @bf_releasebuffer@ */
+#else
   rbuf_pyreadbuf,                      /* @bf_getreadbuffer@ */
   0,                                   /* @bf_getwritebuffer@ */
   rbuf_pysegcount,                     /* @bf_getsegcount@ */
   0                                    /* @bf_getcharbuffer@ */
+#endif
 };
 
 static const PyTypeObject rbuf_pytype_skel = {
@@ -355,10 +368,21 @@ end:
   return ((PyObject *)me);
 }
 
+#ifdef PY3
+  static int wbuf_pygetbuf(PyObject *me, Py_buffer *vw, int f)
+  {
+    buf *b = BUF_B(me);
+    if (PyBuffer_FillInfo(vw, me, BBASE(b), BLEN(b), 0, f)) return (-1);
+    BUF_LK(me)++; return (0);
+  }
+  static void wbuf_pyrlsbuf(PyObject *me, Py_buffer *vw)
+    { BUF_LK(me)--; }
+#else
   static Py_ssize_t wbuf_pysegcount(PyObject *me, Py_ssize_t *nn)
     { if (nn) *nn = BLEN(BUF_B(me)); return (1); }
   static Py_ssize_t wbuf_pyreadbuf(PyObject *me, Py_ssize_t seg, void **q)
     { assert(seg == 0); *q = BBASE(BUF_B(me)); return (BLEN(BUF_B(me))); }
+#endif
 
 static PyObject *wbmeth_zero(PyObject *me, PyObject *arg)
 {
@@ -504,10 +528,15 @@ static const PyMethodDef wbuf_pymethods[] = {
 };
 
 static const PyBufferProcs wbuf_pybuffer = {
+#ifdef PY3
+  wbuf_pygetbuf,                       /* @bf_getbuffer@ */
+  wbuf_pyrlsbuf                                /* @bf_releasebuffer@ */
+#else
   wbuf_pyreadbuf,                      /* @bf_getreadbuffer@ */
   0,                                   /* @bf_getwritebuffer@ */
   wbuf_pysegcount,                     /* @bf_getsegcount@ */
   0                                    /* @bf_getcharbuffer@ */
+#endif
 };
 
 static const PyTypeObject wbuf_pytype_skel = {