Branch: master

36230c0b 2014-09-27 11:36:51 David C. Rankin
Add Python >= v3 support to SuperKaramba
M superkaramba/src/karamba_python.cpp
M superkaramba/src/meter_python.cpp
M superkaramba/src/misc_python.cpp
M superkaramba/src/svcgrp_python.cpp
M superkaramba/src/task_python.cpp
diff --git a/superkaramba/src/karamba_python.cpp b/superkaramba/src/karamba_python.cpp
index 5e64ed7..73212a0 100644
--- a/superkaramba/src/karamba_python.cpp
+++ b/superkaramba/src/karamba_python.cpp
@@ -47,6 +47,24 @@
 #include "misc_python.h"
 #include "input_python.h"
 
+struct module_state {
+    PyObject *error;
+};
+
+#if PY_MAJOR_VERSION >= 3
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+#else
+#define GETSTATE(m) (&_state)
+static struct module_state _state;
+#endif
+
+static PyObject *
+error_out(PyObject *m) {
+    struct module_state *st = GETSTATE(m);
+    PyErr_SetString(st->error, "something bad happened in karamba_python.cpp");
+    return NULL;
+}
+
 /*******************************************
  * Python methods are defined here.
  *   Each method accessible from python should have:
@@ -338,6 +356,38 @@
     {NULL, NULL, 0 ,NULL}
 };
 
+#if PY_MAJOR_VERSION >= 3
+
+static int karamba_traverse(PyObject *m, visitproc visit, void *arg) {
+    Py_VISIT(GETSTATE(m)->error);
+    return 0;
+}
+
+static int karamba_clear(PyObject *m) {
+    Py_CLEAR(GETSTATE(m)->error);
+    return 0;
+}
+
+static struct PyModuleDef karambadef = {
+        PyModuleDef_HEAD_INIT,
+        "karamba",
+        NULL,
+        sizeof(struct module_state),
+        karamba_methods,
+        NULL,
+        karamba_traverse,
+        karamba_clear,
+        NULL
+};
+
+#define INITERROR return NULL
+
+#else
+
+#define INITERROR return
+
+#endif
+
 PyThreadState* KarambaPython::mainThreadState = 0;
 
 KarambaPython::KarambaPython(const ThemeFile& theme, bool reloading):
@@ -356,9 +406,12 @@
   PyRun_SimpleString((char*)"sys.path.insert(0, '')");
 
   PyImport_AddModule((char*)"karamba");
+#if PY_MAJOR_VERSION >= 3
+  PyModule_Create(&karambadef);
+#else
   Py_InitModule((char*)"karamba", karamba_methods);
-
-  pName = PyString_FromString(theme.pythonModule().ascii());
+#endif
+  pName = PyBytes_FromString(theme.pythonModule().ascii());
   pModule = PyImport_Import(pName);
   
   fprintf(stderr, "%s\n", pypath);
diff --git a/superkaramba/src/meter_python.cpp b/superkaramba/src/meter_python.cpp
index 12c3a7e..c5d745b 100644
--- a/superkaramba/src/meter_python.cpp
+++ b/superkaramba/src/meter_python.cpp
@@ -93,9 +93,9 @@
 TQString PyString2TQString(PyObject* text)
 {
     TQString qtext;
-    if (PyString_CheckExact(text))
+    if (PyBytes_CheckExact(text))
     {
-        char* t = PyString_AsString(text);
+        char* t = PyBytes_AsString(text);
         qtext.setAscii(t);
     }
     else if (PyUnicode_CheckExact(text))
@@ -148,7 +148,7 @@
   }
 
   else
-    pyString = PyString_FromString("");
+    pyString = PyBytes_FromString("");
 
   return pyString;
 }
diff --git a/superkaramba/src/misc_python.cpp b/superkaramba/src/misc_python.cpp
index 06b679d..271ec51 100644
--- a/superkaramba/src/misc_python.cpp
+++ b/superkaramba/src/misc_python.cpp
@@ -343,7 +343,7 @@
     return NULL;
   karamba* k = (karamba*)widget;
   TQByteArray ba = k->theme().readThemeFile(file);
-  return PyString_FromStringAndSize(ba.data(), ba.size());
+  return PyBytes_FromStringAndSize(ba.data(), ba.size());
 }
 
 /* now a method we need to expose to Python */
diff --git a/superkaramba/src/svcgrp_python.cpp b/superkaramba/src/svcgrp_python.cpp
index 8b827ec..236d920 100644
--- a/superkaramba/src/svcgrp_python.cpp
+++ b/superkaramba/src/svcgrp_python.cpp
@@ -37,16 +37,16 @@
 	PyObject *tuple = PyTuple_New(2);
 	PyObject *dict = PyDict_New();
 
-	PyDict_SetItem(dict, PyString_FromString("caption"),
-			             PyString_FromString(g->caption().ascii()));
+	PyDict_SetItem(dict, PyBytes_FromString("caption"),
+			             PyBytes_FromString(g->caption().ascii()));
 	if (g->comment() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("comment"),
-	                     PyString_FromString(g->comment().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("comment"),
+	                     PyBytes_FromString(g->comment().ascii()));
 	if (g->icon() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("icon"),
-	                     PyString_FromString(g->icon().ascii()));
-	PyDict_SetItem(dict, PyString_FromString("relpath"),
-	                     PyString_FromString(g->relPath().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("icon"),
+	                     PyBytes_FromString(g->icon().ascii()));
+	PyDict_SetItem(dict, PyBytes_FromString("relpath"),
+	                     PyBytes_FromString(g->relPath().ascii()));
 
 	PyTuple_SET_ITEM(tuple, 0, Py_BuildValue((char*)"l", 0));
 	PyTuple_SET_ITEM(tuple, 1, dict);
@@ -61,43 +61,43 @@
 	PyObject *dict = PyDict_New();
 
 	if (g->exec() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("exec"),
-			             PyString_FromString(g->exec().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("exec"),
+			             PyBytes_FromString(g->exec().ascii()));
 	if (g->menuId() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("menuid"),
-			             PyString_FromString(g->menuId().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("menuid"),
+			             PyBytes_FromString(g->menuId().ascii()));
 	if (g->name() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("name"),
-			             PyString_FromString(g->name().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("name"),
+			             PyBytes_FromString(g->name().ascii()));
 	if (g->path() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("path"),
-			             PyString_FromString(g->path().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("path"),
+			             PyBytes_FromString(g->path().ascii()));
 	if (g->icon() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("icon"),
-			             PyString_FromString(g->icon().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("icon"),
+			             PyBytes_FromString(g->icon().ascii()));
 	if (g->library() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("library"),
-			             PyString_FromString(g->library().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("library"),
+			             PyBytes_FromString(g->library().ascii()));
 	if (g->comment() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("comment"),
-			             PyString_FromString(g->comment().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("comment"),
+			             PyBytes_FromString(g->comment().ascii()));
 	if (g->type() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("type"),
-			             PyString_FromString(g->type().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("type"),
+			             PyBytes_FromString(g->type().ascii()));
 	if (g->genericName() != NULL)
-		PyDict_SetItem(dict, PyString_FromString("genericname"),
-			             PyString_FromString(g->genericName().ascii()));
+		PyDict_SetItem(dict, PyBytes_FromString("genericname"),
+			             PyBytes_FromString(g->genericName().ascii()));
 	/*
-	PyDict_SetItem(dict, PyString_FromString("terminal"),
+	PyDict_SetItem(dict, PyBytes_FromString("terminal"),
 						 Py_BuildValue("l", g->terminal()));
-	PyDict_SetItem(dict, PyString_FromString("type"),
-			             PyString_FromString(g->type().ascii()));
-	PyDict_SetItem(dict, PyString_FromString("username"),
-			             PyString_FromString(g->username().ascii()));
-	PyDict_SetItem(dict, PyString_FromString("substuid"),
+	PyDict_SetItem(dict, PyBytes_FromString("type"),
+			             PyBytes_FromString(g->type().ascii()));
+	PyDict_SetItem(dict, PyBytes_FromString("username"),
+			             PyBytes_FromString(g->username().ascii()));
+	PyDict_SetItem(dict, PyBytes_FromString("substuid"),
 						 Py_BuildValue("l", g->substituteUid()));
-	PyDict_SetItem(dict, PyString_FromString("path"),
-			             PyString_FromString(g->path().ascii()));
+	PyDict_SetItem(dict, PyBytes_FromString("path"),
+			             PyBytes_FromString(g->path().ascii()));
 						 */
 
 	PyTuple_SET_ITEM(tuple, 0, Py_BuildValue((char*)"l", 1));
diff --git a/superkaramba/src/task_python.cpp b/superkaramba/src/task_python.cpp
index 4b81f26..e8d1d3e 100644
--- a/superkaramba/src/task_python.cpp
+++ b/superkaramba/src/task_python.cpp
@@ -143,50 +143,50 @@
     //Task Name
     if (currTask->name() != NULL)
     {
-      PyList_Append(pList, PyString_FromString(currTask->name().latin1()));
+      PyList_Append(pList, PyBytes_FromString(currTask->name().latin1()));
     }
     else
     {
-      PyList_Append(pList, PyString_FromString(""));
+      PyList_Append(pList, PyBytes_FromString(""));
     }
 
     //Icon Name
     if (currTask->iconName() != NULL)
     {
-      PyList_Append(pList, PyString_FromString(currTask->iconName().latin1()));
+      PyList_Append(pList, PyBytes_FromString(currTask->iconName().latin1()));
     }
     else
     {
-      PyList_Append(pList, PyString_FromString(""));
+      PyList_Append(pList, PyBytes_FromString(""));
     }
 
     //Class Name
 ** Diff limit reached (max: 250 lines) **
9526b0bc 2014-09-27 11:42:19 Timothy Pearson
Update superkaramba for recent TDEHotNewStuff changes
M superkaramba/src/sknewstuff.cpp
M superkaramba/src/sknewstuff.h
M superkaramba/src/themesdlg.cpp
 ** Diff limit reached (max: 250 lines) **