Stack of C functions created from Python
David N. Welton
dwelton at linuxcare.com
Tue Aug 17 13:56:12 EDT 1999
I don't really know what the point of this might be, but I thought it
was sort of an interesting bit of code. I guess it might be useful if
you had to execute a lot of C code that you weren't quite sure about
at run time, and wanted to do it in one big bunch.
/*
stackexe.c, by David N. Welton <davidw at prosa.it>
To compile for Linux:
gcc -shared -Wl,-soname,stackexe.so -o stackexe.so stackexe.c
*/
#include <python1.5/Python.h>
typedef struct node {
int (* func)();
struct node *next;
} node;
node *head;
node *cur;
static int pa()
{
puts("a");
}
static int pb()
{
puts("b");
}
static PyObject *addpa(PyObject *self, PyObject *args)
{
cur->func = pa;
cur->next = malloc(sizeof(node));
cur = cur->next;
cur->next = NULL;
return Py_None;
}
static PyObject *addpb(PyObject *self, PyObject *args)
{
cur->func = pb;
cur->next = malloc(sizeof(node));
cur = cur->next;
cur->next = NULL;
return Py_None;
}
static PyObject *run(PyObject *self, PyObject *args)
{
cur = head;
while(cur->next != NULL)
{
(*cur->func)();
cur = cur->next;
}
return Py_None;
}
static PyObject *freestack(PyObject *self, PyObject *args)
{
node *nxt;
cur = head->next;
while(cur->next != NULL)
{
nxt = cur->next;
free(cur);
cur = nxt;
}
head->next = NULL;
return Py_None;
}
static struct PyMethodDef stackexemethods[] = {
{"addpa", addpa, METH_VARARGS},
{"addpb", addpb, METH_VARARGS},
{"run", run, METH_VARARGS},
{"free", freestack, METH_VARARGS},
{NULL, NULL}
};
void initstackexe()
{
Py_InitModule("stackexe", stackexemethods);
head = malloc(sizeof(node));
head->next = NULL;
cur = head;
}
An 'args' field could be added to the node struct, so that you could
pass things to the C functions that way.
Ciao,
--
David N. Welton, Web Engineer, Linuxcare, Inc.
415.354.4878 x241 tel, 415.701.7457 fax
dwelton at linuxcare.com, http://www.linuxcare.com/
Linuxcare. At the center of Linux.
More information about the Python-list
mailing list