Mailing List Archive

Stack of C functions created from Python
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@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@linuxcare.com, http://www.linuxcare.com/
Linuxcare. At the center of Linux.