#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