/* * wlp.c - Copyright 2000, 2001 by Cosimo Alfarano * You can use this software under the terms of the GPL. If we meet some day, * and you think this stuff is worth it, you can buy me a beer in return. * * Thanks to md for this useful formula. Beer is beer. */ #include #include #include #include "structs.h" #include "macro.h" static FILE *fd = NULL; struct wlp_list_t *list; static PyObject *node2dict(struct wlp_node_t *node); /* * wlp_setfilebyname(): get FILE* fd from filename string. */ static PyObject *wlp_setfilebyname(PyObject *self, PyObject *args) { char *file; DBG("setfilebyname\n"); if (!PyArg_ParseTuple(args, "s", &file)) return NULL; if((fd = fopen(file,"r"))) { return Py_None; } else { PyErr_SetFromErrno(PyExc_Exception); /* PyErr_SetString(PyExc_Exception, (errno<=sys_nerr-1)? sys_errlist[errno]: "Unknown Error on fopen() of confifuration file"); */ return NULL; } } /* * wlp_setfilebydf(): get FILE* fd from FileObject. */ static PyObject *wlp_setfilebyfd(PyObject *self, PyObject *args) { PyObject *file = NULL; if(!PyArg_ParseTuple(args, "O", &file)) return NULL; if(!file) return NULL; if(!PyFile_Check(file)) return NULL; fd = PyFile_AsFile(file); return Py_None; } /* * wlp_mkdict(): make a dictonary of the form * {ownername: {var1: val1, var2: val2,...}} */ static PyObject *wlp_mkdict(PyObject *self, PyObject *args) { PyObject *pydicttmp = NULL; PyObject *pydict = PyDict_New(); struct wlp_node_t *tmp; int count; if(!pydict) return NULL; /* fopen()*/ if(fd) parse(fd); else return Py_None; if(list) for(tmp = list->head, count = 0; tmp != list->head || count == 0; tmp = tmp->next, count++) { DBG("FOUND(%d) '%s' ('%s': '%s')\n",count,tmp->owner,tmp->left,tmp->right); pydicttmp = PyDict_GetItem(pydict, PyString_FromString(tmp->owner)); if(!pydicttmp) { DBG("%s: owner not found, create new item\n", tmp->owner); PyDict_SetItemString(pydict, tmp->owner, node2dict(tmp)); } else { DBG("%s: owner found,appendig items\n", tmp->owner); PyDict_SetItemString(pydicttmp, tmp->left, Py_BuildValue("s",tmp->right)); PyDict_SetItemString(pydict, tmp->owner, pydicttmp); } } return pydict; } /* * node2dict(): transoform a wlp_node_t node in a python dictionary of the form * { var: val } * to be used by mkdict() */ static PyObject *node2dict(struct wlp_node_t *node) { PyObject *dict = PyDict_New(); if(!dict) dict = Py_None; else { PyDict_SetItem(dict, Py_BuildValue("s",node->left), Py_BuildValue("s",node->right)); } return dict; } static PyMethodDef wlp_methods[] = { {"mkdict", wlp_mkdict, METH_VARARGS}, {"setfilebyname", wlp_setfilebyname, METH_VARARGS}, {"setfilebyfd", wlp_setfilebyfd, METH_VARARGS}, {NULL,NULL} }; void initwlp() { (void) Py_InitModule("wlp",wlp_methods); }