All of lore.kernel.org
 help / color / mirror / Atom feed
From: Angelo Compagnucci <angelo.compagnucci-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	jdelvare-l3A5Bk7waGM@public.gmane.org
Subject: i2c-tools: add compatibility for python2/3 to py-smbus
Date: Mon, 19 Jan 2015 16:13:26 +0100	[thread overview]
Message-ID: <CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 487 bytes --]

Dear Jean Delvare,

Attached you can find a patch that implements py-smbus for python3
with python2 backward compatibility.
This patch is not heavily tested, but it wors well for me.

Unfortunately, I don't know how to use svn for sharing source code, it
is so ugly compared to git and it doesn't provide a way to send
patches via email, so the best way I found was to attach the patch
file.

Hope this helps!

Sincerely, Angelo

-- 
Profile: http://it.linkedin.com/in/compagnucciangelo

[-- Attachment #2: i2c-tools-py-smbus-python2-3-support.patch --]
[-- Type: text/x-patch, Size: 3785 bytes --]

Index: smbusmodule.c
===================================================================
diff --git a/i2c-tools/trunk/py-smbus/smbusmodule.c b/i2c-tools/trunk/py-smbus/smbusmodule.c
--- a/i2c-tools/trunk/py-smbus/smbusmodule.c	(revision 6261)
+++ b/i2c-tools/trunk/py-smbus/smbusmodule.c	(working copy)
@@ -18,14 +18,16 @@
 
 #include <Python.h>
 #include "structmember.h"
-#include <sys/ioctl.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
-#include <linux/i2c.h>
 #include <linux/i2c-dev.h>
-#include <i2c/smbus.h>
 
+/* Required for backward compatibility with python 2*/
+#if PY_MAJOR_VERSION >= 3
+#define PY3
+#endif
+
 /*
 ** These are required to build this module against Linux older than 2.6.23.
 */
@@ -35,6 +37,7 @@
 #define I2C_SMBUS_I2C_BLOCK_DATA	8
 #endif
 
+#ifndef PY3
 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"
@@ -44,6 +47,7 @@
 	"\n"
 	"Because the I2C device interface is opened R/W, users of this\n"
 	"module usually must have root permissions.\n");
+#endif
 
 typedef struct {
 	PyObject_HEAD
@@ -94,7 +98,11 @@
 	PyObject *ref = SMBus_close(self);
 	Py_XDECREF(ref);
 
+#ifndef PY3
 	self->ob_type->tp_free((PyObject *)self);
+#else
+	Py_TYPE(self)->tp_free((PyObject *)self);
+#endif
 }
 
 #define MAXPATH 16
@@ -434,11 +442,19 @@
 
 	for (ii = 0; ii < len; ii++) {
 		PyObject *val = PyList_GET_ITEM(list, ii);
+#ifndef PY3
 		if (!PyInt_Check(val)) {
 			PyErr_SetString(PyExc_TypeError, msg);
 			return 0; /* fail */
 		}
 		data->block[ii+1] = (__u8)PyInt_AS_LONG(val);
+#else
+		if (!PyLong_Check(val)) {
+			PyErr_SetString(PyExc_TypeError, msg);
+			return 0; /* fail */
+		}
+		data->block[ii+1] = (__u8)PyLong_AS_LONG(val);
+#endif
 	}
 
 	return 1; /* success */
@@ -636,12 +652,18 @@
 	{NULL},
 };
 
+#ifndef PY3
 static PyTypeObject SMBus_type = {
 	PyObject_HEAD_INIT(NULL)
 	0,				/* ob_size */
 	"smbus.SMBus",			/* tp_name */
-	sizeof(SMBus),			/* tp_basicsize */
-	0,				/* tp_itemsize */
+#else
+static PyTypeObject SMBus_type = {
+	PyVarObject_HEAD_INIT(NULL, 0)
+	"SMBus",			/* tp_name */
+#endif
+	sizeof(SMBus),		/* tp_basicsize */
+	0,				    /* tp_itemsize */
 	(destructor)SMBus_dealloc,	/* tp_dealloc */
 	0,				/* tp_print */
 	0,				/* tp_getattr */
@@ -678,24 +700,64 @@
 	SMBus_new,			/* tp_new */
 };
 
+#ifndef PY3
 static PyMethodDef SMBus_module_methods[] = {
 	{NULL}
 };
+#else
+static struct PyModuleDef SMBusModule = {
+	PyModuleDef_HEAD_INIT,
+	"SMBus",	/* m_name */
+	"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",  /* m_doc */
+	-1, /* m_size */
+	NULL, /* m_methods */
+	NULL, /* m_reload */
+	NULL, /* m_traverse */
+	NULL, /* m_clear */
+	NULL, /* m_free */
+};
+#endif
 
 #ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
 #define PyMODINIT_FUNC void
 #endif
 PyMODINIT_FUNC
-initsmbus(void) 
+
+#ifndef PY3
+initsmbus(void)
+#else
+PyInit_smbus(void)
+#endif 
 {
 	PyObject* m;
 
 	if (PyType_Ready(&SMBus_type) < 0)
+#ifndef PY3
 		return;
+#else
+		return NULL;
+#endif
 
+#ifndef PY3
 	m = Py_InitModule3("smbus", SMBus_module_methods, SMBus_module_doc);
+#else
+	m = PyModule_Create(&SMBusModule);
+	if (m == NULL)
+		return NULL;
+#endif
 
 	Py_INCREF(&SMBus_type);
 	PyModule_AddObject(m, "SMBus", (PyObject *)&SMBus_type);
+
+#ifdef PY3
+	return m;
+#endif
 }
 

             reply	other threads:[~2015-01-19 15:13 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-19 15:13 Angelo Compagnucci [this message]
     [not found] ` <CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-19 22:03   ` i2c-tools: add compatibility for python2/3 to py-smbus Jean Delvare
     [not found]     ` <20150119230327.0224d0ba-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-01-22  8:56       ` Michael Mercier
     [not found]         ` <1421917018.21840.0-YAXBhf1W29QAs8EywTwl9A@public.gmane.org>
2015-01-22 10:25           ` Jean Delvare
2015-01-22 10:49           ` Jean Delvare
     [not found]             ` <20150122114958.3178f5f6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-01-22 13:28               ` Michael Mercier
     [not found]                 ` <1421933290.21840.1-YAXBhf1W29QAs8EywTwl9A@public.gmane.org>
2015-01-22 13:37                   ` Jean Delvare
2015-01-26 11:46                   ` Jean Delvare
     [not found]                     ` <20150126124615.7fd1f64f-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-04-09 20:32                       ` Angelo Compagnucci

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A@mail.gmail.com \
    --to=angelo.compagnucci-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=jdelvare-l3A5Bk7waGM@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.