diff options
author | reinelt <> | 2005-05-04 05:22:12 +0000 |
---|---|---|
committer | reinelt <> | 2005-05-04 05:22:12 +0000 |
commit | b3545ccc14ea8c34618dc049bb9a3ba187145411 (patch) | |
tree | f0fa5cb9b620f6fe0adf48f54804f836467c3599 | |
parent | 428c1c713a0f01fbc50bf33d741c9a0b432139f4 (diff) | |
download | lcd4linux-b3545ccc14ea8c34618dc049bb9a3ba187145411.tar.gz |
[lcd4linux @ 2005-05-04 05:22:12 by reinelt]
* replaced fprintf(stderr,... with error()
* corrected a "dangling reference" memory problem
* removed some PyErr_Print() spam
* fixed a segmentation fault that occured when python module was not
found
* improved error messages
-rw-r--r-- | plugin_python.c | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/plugin_python.c b/plugin_python.c index 7b61096..d832808 100644 --- a/plugin_python.c +++ b/plugin_python.c @@ -1,4 +1,4 @@ -/* $Id: plugin_python.c,v 1.2 2005/05/03 11:13:24 reinelt Exp $ +/* $Id: plugin_python.c,v 1.3 2005/05/04 05:22:12 reinelt Exp $ * * Python plugin * @@ -23,6 +23,14 @@ * * * $Log: plugin_python.c,v $ + * Revision 1.3 2005/05/04 05:22:12 reinelt + * * replaced fprintf(stderr,... with error() + * * corrected a "dangling reference" memory problem + * * removed some PyErr_Print() spam + * * fixed a segmentation fault that occured when python module was not + * found + * * improved error messages + * * Revision 1.2 2005/05/03 11:13:24 reinelt * rearranged autoconf a bit, * libX11 will be linked only if really needed (i.e. when the X11 driver has been selected) @@ -38,19 +46,12 @@ * * int plugin_init_python (void) * adds a python interpreter - * + * */ #include <Python.h> - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> - #include "debug.h" #include "plugin.h" -#include "hash.h" /* * Executes a python function specified by function name and module. @@ -58,10 +59,12 @@ * This method is more or less a copy of an example found in the python * documentation. Kudos goes to Guido van Rossum and Fred L. Drake. * - * Returns a char* directly from PyString_AsString() !!! DO NOT DEALLOCATE !!! + * Fixme: this function should be able to accept and receive any types + * of arguments supported by the evaluator. Right now only strings are accepted. */ -static const char* -pyt_exec_str(const char* module, const char* function, int argc, const char* argv[]) { + +static void +pyt_exec_str(RESULT *result, const char* module, const char* function, int argc, const char* argv[]) { PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; @@ -88,8 +91,9 @@ pyt_exec_str(const char* module, const char* function, int argc, const char* arg if (!pValue) { Py_DECREF(pArgs); Py_DECREF(pModule); - fprintf(stderr, "Cannot convert argument %s\n", argv[i]); - return NULL; + error("Cannot convert argument \"%s\" to python format", argv[i]); + SetResult(&result, R_STRING, ""); + return; } /* pValue reference stolen here: */ PyTuple_SetItem(pArgs, i, pValue); @@ -98,40 +102,39 @@ pyt_exec_str(const char* module, const char* function, int argc, const char* arg Py_DECREF(pArgs); if (pValue != NULL) { rv = PyString_AsString(pValue); - //printf("Result of call: %s\n", rv); + SetResult(&result, R_STRING, rv); Py_DECREF(pValue); - return rv; + /* rv is now a 'dangling reference' */ + return; } else { Py_DECREF(pModule); - PyErr_Print(); - fprintf(stderr,"Call failed\n"); - return NULL; + error("Python call failed (\"%s.%s\")", module, function); + SetResult(&result, R_STRING, ""); + return; } /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */ } else { - if (PyErr_Occurred()) - PyErr_Print(); - fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); + error("Can not find python function \"%s.%s\"", module, function); } Py_DECREF(pModule); } else { - PyErr_Print(); - fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); - return NULL; + error("Failed to load python module \"%s\"", module); } - return NULL; + SetResult(&result, R_STRING, ""); + return; } static int python_cleanup_responsibility = 0; static void my_exec (RESULT *result, RESULT *module, RESULT *function, RESULT *arg ) { + /* Fixme: a plugin should be able to accept any number of arguments, don't know how + to code that (yet) */ const char* args[] = {R2S(arg)}; - const char* value = pyt_exec_str(R2S(module),R2S(function),1,args); - SetResult(&result, R_STRING, value); + pyt_exec_str(result, R2S(module), R2S(function), 1, args); } int plugin_init_python (void) |