@@@ cython and python3
[mLib-python] / grim.h
diff --git a/grim.h b/grim.h
index 85ea681..016e2ef 100644 (file)
--- a/grim.h
+++ b/grim.h
@@ -64,6 +64,104 @@ typedef const void *cvp;
 #define FREEOBJ(obj)                                                   \
   (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj)))
 
+#define KWLIST ((char **)kwlist)
+
+/*----- Compatibility hacks -----------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+
+/*#define PyInt_Check PyLong_Check*/
+#define PyInt_FromLong PyLong_FromLong
+#define PyInt_AS_LONG PyLong_AS_LONG
+#define PyInt_AsLong PyLong_AsLong
+#define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
+#define PyNumber_Int PyNumber_Long
+
+#define BIN_CHECK(obj) PyBytes_Check(obj)
+#define BIN_PTR(obj) PyBytes_AS_STRING(obj)
+#define BIN_LEN(obj) PyBytes_GET_SIZE(obj)
+#define BIN_FROMSTR(str) PyBytes_FromString(str)
+#define BIN_FORMAT PyBytes_FromFormat
+#define BIN_SETLEN(obj, len) do Py_SIZE(obj) = (len); while (0)
+
+#define TEXT_CHECK(obj) PyUnicode_Check(obj)
+#if PY_VERSION_HEX >= 0x03030000
+#  define TEXT_PTR(obj) PyUnicode_AsUTF8(obj)
+#  define TEXT_STR(obj) PyUnicode_AsUTF8(obj)
+#  define TEXT_PTRLEN(obj, ptr, len) do {                              \
+  Py_ssize_t len_;                                                     \
+  *(ptr) = PyUnicode_AsUTF8AndSize((obj), &len_);                      \
+  *(len) = len_;                                                       \
+} while (0)
+#  define TEXT_PREPAREWRITE(obj, ptr, sz) do {                         \
+  (obj) = PyUnicode_New((sz), 127);                                    \
+  (ptr) = PyUnicode_DATA(obj);                                         \
+} while (0)
+#  define TEXT_DONEWRITE(obj, len) do {                                        \
+  size_t len_ = (len);                                                 \
+  assert(PyUnicode_IS_COMPACT_ASCII(obj));                             \
+  ((char *)PyUnicode_DATA(obj))[len_] = 0;                             \
+  ((PyASCIIObject *)(obj))->length = len_;                             \
+} while (0)
+#else
+#  define TEXT_PTR(obj) _PyUnicode_AsString(obj)
+#  define TEXT_STR(obj) _PyUnicode_AsString(obj)
+#  define TEXT_PTRLEN(obj, ptr, len) do {                              \
+  Py_ssize_t len_;                                                     \
+  *(ptr) = _PyUnicode_AsStringAndSize((obj), &len_);                   \
+  *(len) = len_;                                                       \
+} while (0)
+#  define TEXT_PREPAREWRITE(obj, ptr, sz) do {                         \
+  (obj) = PyBytes_FromStringAndSize(0, (sz));                          \
+  (ptr) = PyBytes_AS_STRING(obj);                                      \
+} while (0)
+#  define TEXT_DONEWRITE(obj, len) do {                                        \
+  PyObject *new_ = PyUnicode_FromEncodedObject(obj, 0, 0);             \
+  assert(new_); Py_DECREF(obj); (obj) = new_;                          \
+} while (0)
+#endif
+#define TEXT_FORMAT PyUnicode_FromFormat
+#define TEXT_FROMSTR(str) PyUnicode_FromString(str)
+#define TEXT_FROMSTRLEN(str, len) PyUnicode_FromStringAndSize(str, len)
+
+#define Py_TPFLAGS_CHECKTYPES 0
+
+#else
+
+#define BIN_CHECK(obj) PyString_Check(obj)
+#define BIN_PTR(obj) PyString_AS_STRING(obj)
+#define BIN_LEN(obj) PyString_GET_SIZE(obj)
+#define BIN_FROMSTR(str) PyString_FromString(str)
+#define BIN_FORMAT PyString_FromFormat
+#define BIN_SETLEN(obj, len) do Py_SIZE(obj) = (len); while (0)
+
+#define TEXT_TYPE PyString_Type
+#define TEXT_CHECK(obj) PyString_Check(obj)
+#define TEXT_PTR(obj) PyString_AS_STRING(obj)
+#define TEXT_STR(obj) PyString_AsString(obj)
+#define TEXT_PTRLEN(obj, ptr, len) do {                                        \
+  *(ptr) = PyString_AS_STRING(obj);                                    \
+  *(len) = PyString_GET_SIZE(obj);                                     \
+} while (0)
+#define TEXT_FORMAT PyString_FromFormat
+#define TEXT_PREPAREWRITE(obj, ptr, sz) do {                           \
+  (obj) = PyString_FromStringAndSize(0, (sz));                         \
+  (ptr) = PyString_AS_STRING(obj);                                     \
+} while (0)
+#define TEXT_DONEWRITE(obj, len)                                       \
+  do _PyString_Resize(&(obj), (len)); while (0)
+#define TEXT_FROMSTR(str) PyString_FromString(str)
+#define TEXT_FROMSTRLEN(str, len) PyString_FromStringAndSize(str, len)
+
+#endif
+
+#ifndef PyVarObject_HEAD_INIT
+#  define PyVarObject_HEAD_INIT(super, sz) PyObject_HEAD_INIT(super) sz,
+#endif
+
+#if PY_VERSION_HEX < 0x03020000
+  typedef long Py_hash_t;
+#endif
+
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus