blob: 1f3de76052e787c44e2e28c6862990b69a016ad9 [file] [log] [blame]
support python-3.x
http://comments.gmane.org/gmane.linux.drivers.i2c/11290
https://bugs.gentoo.org/492632
--- a/py-smbus/smbusmodule.c
+++ b/py-smbus/smbusmodule.c
@@ -32,15 +32,18 @@
#define I2C_SMBUS_I2C_BLOCK_DATA 8
#endif
-PyDoc_STRVAR(SMBus_module_doc,
- "This module defines an object type that allows SMBus transactions\n"
- "on hosts running the Linux kernel. The host kernel must have I2C\n"
- "support, I2C device interface support, and a bus adapter driver.\n"
- "All of these can be either built-in to the kernel, or loaded from\n"
- "modules.\n"
- "\n"
- "Because the I2C device interface is opened R/W, users of this\n"
- "module usually must have root permissions.\n");
+#define module_doc \
+ "This module defines an object type that allows SMBus transactions\n" \
+ "on hosts running the Linux kernel. The host kernel must have I2C\n" \
+ "support, I2C device interface support, and a bus adapter driver.\n" \
+ "All of these can be either built-in to the kernel, or loaded from\n" \
+ "modules.\n" \
+ "\n" \
+ "Because the I2C device interface is opened R/W, users of this\n" \
+ "module usually must have root permissions.\n"
+#if PY_MAJOR_VERSION <= 2
+PyDoc_STRVAR(SMBus_module_doc, module_doc);
+#endif
typedef struct {
PyObject_HEAD
@@ -91,7 +94,11 @@ SMBus_dealloc(SMBus *self)
PyObject *ref = SMBus_close(self);
Py_XDECREF(ref);
+#if PY_MAJOR_VERSION >= 3
+ Py_TYPE(self)->tp_free((PyObject*)self);
+#else
self->ob_type->tp_free((PyObject *)self);
+#endif
}
#define MAXPATH 16
@@ -431,11 +438,19 @@ SMBus_list_to_data(PyObject *list, union i2c_smbus_data *data)
for (ii = 0; ii < len; ii++) {
PyObject *val = PyList_GET_ITEM(list, ii);
+#if PY_MAJOR_VERSION >= 3
+ if (!PyLong_Check(val)) {
+#else
if (!PyInt_Check(val)) {
+#endif
PyErr_SetString(PyExc_TypeError, msg);
return 0; /* fail */
}
+#if PY_MAJOR_VERSION >= 3
+ data->block[ii+1] = (__u8)PyLong_AS_LONG(val);
+#else
data->block[ii+1] = (__u8)PyInt_AS_LONG(val);
+#endif
}
return 1; /* success */
@@ -633,9 +648,27 @@ static PyGetSetDef SMBus_getset[] = {
{NULL},
};
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef SMBusModule = {
+ PyModuleDef_HEAD_INIT,
+ "smbus.SMBus", /* m_name */
+ module_doc, /* m_doc */
+ -1, /* m_size */
+ NULL, /* m_methods */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
+};
+#endif
+
static PyTypeObject SMBus_type = {
+#if PY_MAJOR_VERSION >= 3
+ PyVarObject_HEAD_INIT(NULL, 0)
+#else
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
+#endif
"smbus.SMBus", /* tp_name */
sizeof(SMBus), /* tp_basicsize */
0, /* tp_itemsize */
@@ -683,16 +716,32 @@ static PyMethodDef SMBus_module_methods[] = {
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC
-initsmbus(void)
+#if PY_MAJOR_VERSION >= 3
+PyInit_smbus(void)
+#else
+initsmbus(void)
+#endif
{
PyObject* m;
+#if PY_MAJOR_VERSION >= 3
+ if (PyType_Ready(&SMBus_type) < 0)
+ return NULL;
+
+ m = PyModule_Create(&SMBusModule);
+ if (m == NULL)
+ return NULL;
+#else
if (PyType_Ready(&SMBus_type) < 0)
return;
m = Py_InitModule3("smbus", SMBus_module_methods, SMBus_module_doc);
+#endif
Py_INCREF(&SMBus_type);
PyModule_AddObject(m, "SMBus", (PyObject *)&SMBus_type);
+#if PY_MAJOR_VERSION >= 3
+ return m;
+#endif
}