Index: py-rcsparse.c --- py-rcsparse.c.orig +++ py-rcsparse.c @@ -25,6 +25,19 @@ #include "rcsparse.h" +#if PY_MAJOR_VERSION >= 3 +#define PyString_AsStringAndSize _PyUnicode_AsUTF8AndSize +#define PyString_CheckExact PyUnicode_CheckExact +#define PyString_FromString PyUnicode_FromString +#define PyString_FromStringAndSize PyUnicode_FromStringAndSize + +static void +_PyUnicode_AsUTF8AndSize(PyObject *obj, char **strp, Py_ssize_t *sizep) +{ + *strp = PyUnicode_AsUTF8AndSize(obj, sizep); +} +#endif + static PyObject * rcstoken2pystr(struct rcstoken *tok) { @@ -124,7 +137,11 @@ rcsrev2py(struct rcsrev *rev) return Py_BuildValue("NNNNNNN", rcstoken2pystr(rev->rev), +#if PY_MAJOR_VERSION >= 3 + PyLong_FromLong(timegm(&tm)), +#else PyInt_FromLong(timegm(&tm)), +#endif rcstoken2pystr(rev->author), rcstoken2pystr(rev->state), rcstoklist2py(&rev->branches), @@ -275,7 +292,7 @@ static void pyrcsrevtree_dealloc(struct pyrcsrevtree *self) { Py_DECREF((PyObject *)self->pyrcs); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static PyMappingMethods pyrcsrevtree_mapmethods = { @@ -300,7 +317,7 @@ static PyMethodDef pyrcsrevtree_methods[] = { }; static PyTypeObject pyrcsrevtree_type = { - PyObject_HEAD_INIT(&PyType_Type) + PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name= "rcsparse.rcsrevtree", .tp_basicsize= sizeof(struct pyrcsrevtree), .tp_dealloc= (destructor)pyrcsrevtree_dealloc, @@ -496,7 +513,7 @@ static void pyrcstokmap_dealloc(struct pyrcstokmap *self) { Py_DECREF((PyObject *)self->pyrcs); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static PyMappingMethods pyrcstokmap_mapmethods = { @@ -521,7 +538,7 @@ static PyMethodDef pyrcstokmap_methods[] = { }; static PyTypeObject pyrcstokmap_type = { - PyObject_HEAD_INIT(&PyType_Type) + PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name= "rcsparse.rcstokmap", .tp_basicsize= sizeof(struct pyrcstokmap), .tp_dealloc= (destructor)pyrcstokmap_dealloc, @@ -645,7 +662,11 @@ pyrcsfile_checkout(struct pyrcsfile *self, PyObject *a if (buf == NULL) return PyErr_Format(PyExc_RuntimeError, "Error parsing"); +#if PY_MAJOR_VERSION >= 3 + o = PyBytes_FromStringAndSize(buf, len); +#else o = PyString_FromStringAndSize(buf, len); +#endif free(buf); return o; } @@ -664,7 +685,11 @@ pyrcsfile_getlog(struct pyrcsfile *self, PyObject *arg if (buf == NULL) return PyErr_Format(PyExc_RuntimeError, "Error parsing"); +#if PY_MAJOR_VERSION >= 3 + o = PyBytes_FromString(buf); +#else o = PyString_FromString(buf); +#endif free(buf); return o; } @@ -720,7 +745,7 @@ pyrcsfile_dealloc(struct pyrcsfile *self) if (self->rcs != NULL) rcsclose(self->rcs); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static PyGetSetDef pyrcsfile_getseters[] = { @@ -761,21 +786,48 @@ static PyMethodDef pyrcsparse_methods[] = { {NULL} }; +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "rcsparse", /* m_name */ + "RCS file parser", /* m_doc */ + -1, /* m_size */ + pyrcsparse_methods, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; +#endif + +#if PY_MAJOR_VERSION >= 3 +#define retnull return NULL + PyMODINIT_FUNC +PyInit_rcsparse(void) +#else +#define retnull return + +PyMODINIT_FUNC initrcsparse(void) +#endif { PyObject *m; if (PyType_Ready(&pyrcsfile_type) < 0) - return; + retnull; if (PyType_Ready(&pyrcstokmap_type) < 0) - return; + retnull; if (PyType_Ready(&pyrcsrevtree_type) < 0) - return; + retnull; +#if PY_MAJOR_VERSION >= 3 + m = PyModule_Create(&moduledef); +#else m = Py_InitModule3("rcsparse", pyrcsparse_methods, "RCS file parser"); +#endif if (m == NULL) - return; + retnull; Py_INCREF(&pyrcsfile_type); PyModule_AddObject(m, "rcsfile", (PyObject *)&pyrcsfile_type); @@ -783,4 +835,8 @@ initrcsparse(void) PyModule_AddObject(m, "rcstokmap", (PyObject *)&pyrcstokmap_type); Py_INCREF(&pyrcsrevtree_type); PyModule_AddObject(m, "rcsrevtree", (PyObject *)&pyrcsrevtree_type); + +#if PY_MAJOR_VERSION >= 3 + return m; +#endif }