| 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 |
| } |
| |