From e3ab39bf39d0ba75f6eb504752ef0ffb4bf4a3b1 Mon Sep 17 00:00:00 2001 From: Matěj Cepl Date: Mon, 15 Dec 2014 11:29:38 +0100 Subject: I am able to build the extension with setup.py --- .gitignore | 3 + setup.py | 32 +++++ wlp/C/Makefile | 50 ------- wlp/C/commands.l | 76 ---------- wlp/C/commands.y | 111 --------------- wlp/C/macro.h | 44 ------ wlp/C/structs.c | 164 --------------------- wlp/C/structs.h | 35 ----- wlp/C/test.c | 113 --------------- wlp/C/wlp.c | 154 -------------------- wlp/C/yytest.c | 25 ---- wlp/Makefile.C | 61 ++++++++ wlp/README.notes | 16 +++ wlp/commands.l | 76 ++++++++++ wlp/commands.y | 111 +++++++++++++++ wlp/macro.h | 44 ++++++ wlp/module/Makefile.pre.in | 317 ----------------------------------------- wlp/module/Makefile.pre.in.OLD | 304 --------------------------------------- wlp/module/Setup.in | 88 ------------ wlp/module/makesetup | 261 --------------------------------- wlp/module/patch | 13 -- wlp/structs.c | 164 +++++++++++++++++++++ wlp/structs.h | 35 +++++ wlp/test.c | 113 +++++++++++++++ wlp/wlp.c | 154 ++++++++++++++++++++ wlp/yytest.c | 25 ++++ 26 files changed, 834 insertions(+), 1755 deletions(-) create mode 100644 .gitignore create mode 100644 setup.py delete mode 100644 wlp/C/Makefile delete mode 100644 wlp/C/commands.l delete mode 100644 wlp/C/commands.y delete mode 100644 wlp/C/macro.h delete mode 100644 wlp/C/structs.c delete mode 100644 wlp/C/structs.h delete mode 100644 wlp/C/test.c delete mode 100644 wlp/C/wlp.c delete mode 100644 wlp/C/yytest.c create mode 100644 wlp/Makefile.C create mode 100644 wlp/README.notes create mode 100644 wlp/commands.l create mode 100644 wlp/commands.y create mode 100644 wlp/macro.h delete mode 100644 wlp/module/Makefile.pre.in delete mode 100644 wlp/module/Makefile.pre.in.OLD delete mode 100644 wlp/module/Setup.in delete mode 100755 wlp/module/makesetup delete mode 100644 wlp/module/patch create mode 100644 wlp/structs.c create mode 100644 wlp/structs.h create mode 100644 wlp/test.c create mode 100644 wlp/wlp.c create mode 100644 wlp/yytest.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e38c13b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/* +wlp/commands.tab.* +wlp/lex.yy.c diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2d4e9ba --- /dev/null +++ b/setup.py @@ -0,0 +1,32 @@ +#!/usr/bin/python + +from setuptools import setup +from distutils.core import Extension +from distutils.command.build_ext import build_ext +from subprocess import check_call + +class Build_WLP_ext(build_ext): + def run(self): + self.make_file('wlp/command.y', 'wlp/y.tab.c', check_call, + ([['yacc', '-d', '-o', 'wlp/commands.tab.c', 'wlp/commands.y']]), + 'Generating lexer') + self.make_file('wlp/commands.l', 'wlp/lex.yy.c', check_call, + ([['lex', '-o', 'wlp/lex.yy.c', 'wlp/commands.l']]), + 'Generating parser') + build_ext.run(self) + +# see https://github.com/Turbo87/py-xcsoar/blob/master/setup.py +wlp_module = Extension('wlp', + sources=['wlp/wlp.c', + 'wlp/structs.c', + 'wlp/commands.tab.c', + 'wlp/lex.yy.c']) + +install_requirements = [''] + +setup(name='PackageName', + version='1.0', + description='This is a demo package', + cmdclass={'build_ext': Build_WLP_ext}, + ext_modules=[wlp_module], + install_requires=install_requirements) diff --git a/wlp/C/Makefile b/wlp/C/Makefile deleted file mode 100644 index 5581888..0000000 --- a/wlp/C/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -CC=gcc -AR=ar -FLEX=flex -YACC=bison - -CCOPTS=-Wall -ansi -CCSHARED=-fPIC -AROPTS=-rs -FLEXOPTS= -YACCOPTS=-d - -CPPFLAGS:=$(shell dpkg-buildflags --get CPPFLAGS) -CFLAGS:=$(shell dpkg-buildflags --get CFLAGS) -CXXFLAGS:=$(shell dpkg-buildflags --get CXXFLAGS) -LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) - -SRCDIR=. -BINDIR=. - -DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) - -OBJFILE=structs.o commands.tab.o lex.yy.o - -all: archive bin - -# archive file for python module -archive: structs bison flex macro.h structs.h commands.tab.h - $(AR) $(AROPTS) $(BINDIR)/wlp.a $(OBJFILE) \ - /usr/lib/$(DEB_HOST_MULTIARCH)/libfl.a - -# binary (executable) file for testing -executable: bin - -bin: structs bison flex macro.h structs.h commands.tab.h - $(CC) $(CCSHARED) $(CCOPTS) $(OBJFILE) \ - yytest.c /usr/lib/$(DEB_HOST_MULTIARCH)/libfl.a -o ./yytest - -flex: - $(FLEX) $(FLEXOPTS) commands.l - $(CC) $(CCSHARED) -c lex.yy.c -o lex.yy.o - -bison: - $(YACC) $(YACCOPTS) -d commands.y -b commands - $(CC) $(CCSHARED) -c commands.tab.c -o commands.tab.o - -structs: - $(CC) $(CCSHARED) $(CCOPTS) -c structs.c -o structs.o - -clean: - rm -f $(OBJFILE) lex.yy.c commands.tab.h commands.tab.c wlp.a yytest diff --git a/wlp/C/commands.l b/wlp/C/commands.l deleted file mode 100644 index ab954cf..0000000 --- a/wlp/C/commands.l +++ /dev/null @@ -1,76 +0,0 @@ -%{ -/* Lex analyzer for bison grammar */ - -#include "commands.tab.h" -/*#define DEBUG*/ -#include "macro.h" -#include -%} - -OWNER "<"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9._-]+">" -VAL ['`"][a-zA-Z0-9@_+.<>() -]+['`"] -VAR [a-zA-Z0-9_<>-]+[:]? - -%option noyywrap - -%% - - - - -{OWNER} { - DBG("OWNER %s\n",yytext); - yylval.text=yytext; - return(OWNERID); - } - - -{VAL} { - DBG("VAL %s\n",yytext); - yylval.text=yytext; - return(VALID); - } - -{VAR} { - DBG("VAR %s\n",yytext); - yylval.text=yytext; - return(VARID); - } - - -"{" | -"}" | -"=" { - yylval.text=yytext; - return(*yytext); - } - - -"#"[^\n]* | -"\n" | -[[:space:]] ; /* comments 'til EOL and strip all spaces and \n */ - - -"." { - DBG("NOTSTR %s\n",yytext); - yylval.text=yytext; - return(ERROR); - } - - -%% - -#include "structs.h" - -extern struct wlp_list_t *list; - -int parse(FILE *file) -{ - struct wlp_node_t *tmp; - int count; - yyin=file; - - DBG("go!\n"); - yyparse(); - DBG("EOF found\n"); -} diff --git a/wlp/C/commands.y b/wlp/C/commands.y deleted file mode 100644 index e6cfb18..0000000 --- a/wlp/C/commands.y +++ /dev/null @@ -1,111 +0,0 @@ - -%{ -/*#define YYSTYPE char**/ -/*#define DEBUG*/ -#include "macro.h" -#include "string.h" -%} - -%union { - char *text; - char c; -} - -%token VARID -%token VALID -%token OWNERID - -%token ERROR -%token EOFTOK - - -%{ -char left[80], right[80], owner[80]; -char type = 0; /*unused*/ -%} - -%% - - -block: - blockstatement - | block blockstatement - ; - -blockstatement: - owner '{' commandline '}' - ; - -commandline: - command | commandline command - ; - -command: - varpart '=' valpart { found(left,right,owner); } - ; - -owner: - OWNERID { - DBG("Owner %s\n",$1); - strncpy(owner,$1,strlen($1)+1); - } - ; - -varpart: - VARID { - DBG("Left %s\n",$1); - strncpy(left,$1,strlen($1)+1); - } - ; - -valpart: - VALID { - DBG("Right %s\n",$1); - strncpy(right,$1,strlen($1)+1); - } - ; - -%% - -#include -#include -#include "structs.h" - -extern struct wlp_list_t *list; - -int yyerror (char *s) /* Called by yyparse on error */ -{ - printf ("error: %s\n", s); - return 1; -} - -int found(const char* left, const char* right, const char *owner) -{ - static struct wlp_node_t *node; - - /* alloc node with non-empty fields (ie alloc them too)*/ - node = wlpn_alloc(FALSE); - if(!node) { - DBG("wlpn_alloc in found returned NULL\n"); - } - - strncpy(node->right,right,strlen(right)); - strncpy(node->left,left,strlen(left)); - strncpy(node->owner,owner,strlen(owner)); - - #ifndef WITHQUOTES - /* remove quotes of value part */ - node->right += 1; - node->right[strlen(node->right)-1] = '\0'; - #endif - #ifndef WITHANGBRACKETS - /* remove angle brackets of owner part */ - node->owner += 1; - node->owner[strlen(node->owner)-1] = '\0'; - #endif - - if(!list) - list = wlpl_init(node); - else - wlpn_add(list,node); -} diff --git a/wlp/C/macro.h b/wlp/C/macro.h deleted file mode 100644 index 303b3c6..0000000 --- a/wlp/C/macro.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * macro.h - Copyright 2000, 2001 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. - */ - - -#ifndef _macro_h_ -#define _macro_h_ - -#define LINELEN 2048 -#define TRUE 1 -#define FALSE 0 - -/* -#define WITHQUOTES -#define WITHANGBRACKETS -*/ - -#define ERR(a,b...) fprintf(stderr, a, ## b) - -/* Define it for debug info on stderr (better if in .c module ...) */ -/* -#ifndef DEBUG - #define DEBUG -#endif -*/ - - -#ifdef DEBUG - #define DBG(a...) fprintf(stderr, ## a) - /* for a verbose debug*/ - #define VDBG(a,b...) fprintf(stderr, "%s(): " a, __FUNCTION__ , ## b) -#else - #define DBG(a...) - #define VDBG(a...) -#endif - - -#endif - -/* EOF */ diff --git a/wlp/C/structs.c b/wlp/C/structs.c deleted file mode 100644 index 8c33443..0000000 --- a/wlp/C/structs.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * structs.c - Copyright 2000 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 - -#include "structs.h" -#include "macro.h" - -struct wlp_node_t *wlpn_add(struct wlp_list_t *list,struct wlp_node_t *node) -{ - struct wlp_node_t *ret; - - if(node) { - node->next = list->head; - node->prev = list->tail; - - list->tail->next = node; - list->head->prev = node; - - list->tail = node; - - list->count++; - - ret = node; - } else { - DBG("cannot add %s %s to list. NULL pointer?\n", - node->left,node->right); - ret = NULL; - } - - return ret; -} - -void wlpn_free(struct wlp_node_t *node) -{ - free(node->left); - free(node->right); - free(node->owner); - free(node); -} - - -struct wlp_node_t *wlpn_alloc(const char empty) -{ - static struct wlp_node_t *node; - - node = calloc(sizeof(struct wlp_node_t),1); - - if (!node) { - perror("wlpn_create malloc"); - - /* calloc set *node to zero, it I don't want alloc anything, - leave it untouched, else alloc fields */ - } else if (!empty) { - node->left = calloc(LINELEN+1,1); - if (!node->left) { - perror("wlpn_create malloc (left)"); - free(node); - node = NULL; - } - - /*if node is NULL, previous calloc returned error...*/ - if(node && !(node->right = calloc(LINELEN+1,1))) { - perror("wlpn_create malloc (right)"); - free(node); - node = NULL; - } - - if(node && !(node->owner = calloc(LINELEN+1,1))) { - perror("wlpn_create malloc (owner)"); - free(node); - node = NULL; - } - } - return node; -} - -struct wlp_list_t *wlpl_init(struct wlp_node_t *node) -{ - static struct wlp_list_t *list; - - list = malloc(sizeof(struct wlp_list_t)); - - if (list) { - list->head = node; - list->tail = list->head; - - list->head->next = list->head; - list->head->prev = list->head; - - list->count=1; - } else { - perror("wlpl_init malloc"); - return NULL; - } - - return list; -} - - -struct wlp_node_t *wlpn_searchowner(struct wlp_list_t *mbl,const char *owner) -{ - struct wlp_node_t *ret; - - DBG("searching for %s\n",owner); - - if(!mbl) - ret = NULL; - else { - int found = FALSE; - ret = mbl->head; - - do { - if(!strcmp(owner,ret->owner)) { - DBG("found!\n"); - found = TRUE; - } else { - DBG("not found: %s\n",ret->onwer); - ret = ret->next; - } - } while(ret != mbl->head && !found); - - if(!found) - ret = NULL; - } - - DBG("%s\n", (ret)?ret->owner:"not found"); - - return ret; -} - - -struct wlp_node_t *wlpn_extract(struct wlp_list_t *list,struct wlp_node_t *node) -{ - struct wlp_node_t *ret; - - if(list && node) { - node->prev->next = node->next; - node->next->prev = node->prev; - - if(list->tail == node) - list->tail = node->prev; - if(list->head == node) - list->head = node->next; - - list->count--; - - ret = node; - } else { - DBG("wlpn_extract: list addr %l and node %l (one is NULL)\n",list,addr) - ret = NULL; - } - - return ret; -} diff --git a/wlp/C/structs.h b/wlp/C/structs.h deleted file mode 100644 index 92036a7..0000000 --- a/wlp/C/structs.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * structs.h - 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. - */ - -#ifndef _structs_h_ -#define _structs_h_ - -typedef struct wlp_node_t { - char *left,*right; - char *owner; - char type; /* unused */ - struct wlp_node_t *next, *prev; -} wlp_node_t; - -typedef struct wlp_list_t { - int count; - struct wlp_node_t *head, *tail; -} wlp_list_t; - - -/* white list parser data structure manipulation */ -struct wlp_list_t *wlpl_init(struct wlp_node_t *node); -struct wlp_node_t *wlpn_alloc(const char empty); -void wlpn_free(struct wlp_node_t *node); -struct wlp_node_t *wlpn_add(struct wlp_list_t *wlpl,struct wlp_node_t *wlpn); -struct wlp_node_t *wlpn_extract(struct wlp_list_t *wlpl,struct wlp_node_t *wlpn); -/*struct wlp_node_t *wlpn_search(struct wlp_list_t *wlpl,const char id);*/ - -#endif /* _structs_h_ */ - -/* EOF */ diff --git a/wlp/C/test.c b/wlp/C/test.c deleted file mode 100644 index 47717b5..0000000 --- a/wlp/C/test.c +++ /dev/null @@ -1,113 +0,0 @@ -#include /* should be modified to be pythonX.Y */ -#include -#include - -#include "structs.h" -#include "macro.h" - -/* first declare static functions */ - -struct wlp_list_t *list; - -static FILE *fd = NULL; - -static PyObject *node2dict(struct wlp_node_t *node); - -static PyObject *wlp_setfilebyname(PyObject *self, PyObject *args) { - char *file; - - DBG("setfilebyname\n"); - if (!PyArg_ParseTuple(args, "s", &file)) - return NULL; - - fd = fopen(file,"r"); - - return Py_None; -} - -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; - -} - - - -static PyObject *wlp_mklist(PyObject *self, PyObject *args) { - struct wlp_node_t *tmp; - int count; - - PyObject *pylist = NULL; - - DBG("a\n"); - parse(fd); - - DBG("count %d\n"list->count); - pylist = PyList_New(0); - - DBG("a\n"); - if(!pylist) - return NULL; - - DBG("a\n"); - 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); - if(PyList_Append(pylist,node2dict(tmp))==-1) { - DBG("List failed\n"); - return NULL; - } - DBG("a\n"); - } - - return pylist; -} - - -static PyObject *node2dict(struct wlp_node_t *node) { - PyObject *dict = PyDict_New(); - - if(!dict) - return NULL; - - PyDict_SetItem(dict, - Py_BuildValue("s","owner"), - Py_BuildValue("s",node->owner)); - - PyDict_SetItem(dict, - Py_BuildValue("s",node->left), - Py_BuildValue("s",node->right)); - - return dict; - -} - -/* second a table with methods/functions matching */ - -static PyMethodDef wlp_methods[] = { - {"mklist", wlp_mklist, METH_VARARGS}, - {"setfilebyname", wlp_setfilebyname, METH_VARARGS}, - {"setfilebyfd", wlp_setfilebyfd, METH_VARARGS}, - {NULL,NULL} -}; - - -/* last the init function, the only one non-static */ - -void initwlp() { - (void) Py_InitModule("wlp",wlp_methods); -} diff --git a/wlp/C/wlp.c b/wlp/C/wlp.c deleted file mode 100644 index 6a36617..0000000 --- a/wlp/C/wlp.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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); -} diff --git a/wlp/C/yytest.c b/wlp/C/yytest.c deleted file mode 100644 index 74c6fe7..0000000 --- a/wlp/C/yytest.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -#include "structs.h" -#include "macro.h" - - - -int parse(FILE *file); - -struct wlp_list_t *list; - -int main(int argc,char **argv) { - struct wlp_node_t *tmp; - int count; - - parse(NULL); - - if(list) - for(tmp = list->head, count=0; - tmp != list->head || count == 0; - tmp = tmp->next, count++) - printf("FOUND(%d) '%s' '%s' '%s'\n",count,tmp->left,tmp->right,tmp->owner); - - return(0); -} diff --git a/wlp/Makefile.C b/wlp/Makefile.C new file mode 100644 index 0000000..0c962e6 --- /dev/null +++ b/wlp/Makefile.C @@ -0,0 +1,61 @@ +DESTDIR= +LIBDIR=/usr/lib64 +BINDIR=/usr/bin +PYGLIBDIR=$(DESTDIR)/$(LIBDIR)/pyg +PYGBINDIR=$(DESTDIR)/$(BINDIR) + +CC=gcc +AR=ar +FLEX=flex +YACC=bison + +CCOPTS=-Wall -ansi +CCSHARED=-fPIC +AROPTS=-rs +FLEXOPTS= +YACCOPTS=-d + +#CPPFLAGS:=$(shell dpkg-buildflags --get CPPFLAGS) +CPPFLAGS:= +# Add more -I and -D options here +## CFLAGS=$(OPT) -I$(INCLUDEPY) -I$(EXECINCLUDEPY) $(DEFS) $(shell dpkg-buildflags --get CFLAGS) +OPTFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 +OPTFLAGS+=-grecord-gcc-switches -m64 -mtune=generic +CFLAGS=$(OPTFLAGS) +CXXFLAGS:=$(OPTFLAGS) +OPTLDFLAGS=-Wl,-z,relro +#LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) +LDFLAGS:=$(OPTLDFLAGS) + +SRCDIR=. +BINDIR=. + +OBJFILE=structs.o commands.tab.o lex.yy.o + +all: archive bin + +# archive file for python module +archive: structs bison flex macro.h structs.h commands.tab.h + mkdir -p $(PYGLIBDIR) + $(AR) $(AROPTS) $(PYGLIBDIR)/wlp.a $(OBJFILE) + +# binary (executable) file for testing +executable: bin + +bin: structs bison flex macro.h structs.h commands.tab.h + $(CC) $(CCSHARED) $(CCOPTS) $(OBJFILE) \ + yytest.c $(PYGLIBDIR)/libfl.a -o ./yytest + +flex: + $(FLEX) $(FLEXOPTS) commands.l + $(CC) $(CCSHARED) -c lex.yy.c -o lex.yy.o + +bison: + $(YACC) $(YACCOPTS) -d commands.y -b commands + $(CC) $(CCSHARED) -c commands.tab.c -o commands.tab.o + +structs: + $(CC) $(CCSHARED) $(CCOPTS) -c structs.c -o structs.o + +clean: + rm -f $(OBJFILE) lex.yy.c commands.tab.h commands.tab.c wlp.a yytest diff --git a/wlp/README.notes b/wlp/README.notes new file mode 100644 index 0000000..d522092 --- /dev/null +++ b/wlp/README.notes @@ -0,0 +1,16 @@ +wlp module from + +import wlp +wlf = open('/home/matej/projekty/pyg/examples/whitelist.example') +f = wlp.setfilebyfd(wlf) +# or wlp.setfilebyname('/home/matej/projekty/pyg/examples/whitelist.example') +wlp.mkdict() + +In [9]: wlp.mkdict() +Out[9]: +{'alfarano@students.cs.unibo.it': {'From:': 'Cosimo Alfarano', + 'X-Firstname:': 'Cosimo'}, + 'kame@innocent.com': {'From:': 'kame@inwind.it', + 'Reply-to': 'me', + 'Reply-to:': 'KA', + 'Sender:': 'Kalfa'}} diff --git a/wlp/commands.l b/wlp/commands.l new file mode 100644 index 0000000..ab954cf --- /dev/null +++ b/wlp/commands.l @@ -0,0 +1,76 @@ +%{ +/* Lex analyzer for bison grammar */ + +#include "commands.tab.h" +/*#define DEBUG*/ +#include "macro.h" +#include +%} + +OWNER "<"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9._-]+">" +VAL ['`"][a-zA-Z0-9@_+.<>() -]+['`"] +VAR [a-zA-Z0-9_<>-]+[:]? + +%option noyywrap + +%% + + + + +{OWNER} { + DBG("OWNER %s\n",yytext); + yylval.text=yytext; + return(OWNERID); + } + + +{VAL} { + DBG("VAL %s\n",yytext); + yylval.text=yytext; + return(VALID); + } + +{VAR} { + DBG("VAR %s\n",yytext); + yylval.text=yytext; + return(VARID); + } + + +"{" | +"}" | +"=" { + yylval.text=yytext; + return(*yytext); + } + + +"#"[^\n]* | +"\n" | +[[:space:]] ; /* comments 'til EOL and strip all spaces and \n */ + + +"." { + DBG("NOTSTR %s\n",yytext); + yylval.text=yytext; + return(ERROR); + } + + +%% + +#include "structs.h" + +extern struct wlp_list_t *list; + +int parse(FILE *file) +{ + struct wlp_node_t *tmp; + int count; + yyin=file; + + DBG("go!\n"); + yyparse(); + DBG("EOF found\n"); +} diff --git a/wlp/commands.y b/wlp/commands.y new file mode 100644 index 0000000..e6cfb18 --- /dev/null +++ b/wlp/commands.y @@ -0,0 +1,111 @@ + +%{ +/*#define YYSTYPE char**/ +/*#define DEBUG*/ +#include "macro.h" +#include "string.h" +%} + +%union { + char *text; + char c; +} + +%token VARID +%token VALID +%token OWNERID + +%token ERROR +%token EOFTOK + + +%{ +char left[80], right[80], owner[80]; +char type = 0; /*unused*/ +%} + +%% + + +block: + blockstatement + | block blockstatement + ; + +blockstatement: + owner '{' commandline '}' + ; + +commandline: + command | commandline command + ; + +command: + varpart '=' valpart { found(left,right,owner); } + ; + +owner: + OWNERID { + DBG("Owner %s\n",$1); + strncpy(owner,$1,strlen($1)+1); + } + ; + +varpart: + VARID { + DBG("Left %s\n",$1); + strncpy(left,$1,strlen($1)+1); + } + ; + +valpart: + VALID { + DBG("Right %s\n",$1); + strncpy(right,$1,strlen($1)+1); + } + ; + +%% + +#include +#include +#include "structs.h" + +extern struct wlp_list_t *list; + +int yyerror (char *s) /* Called by yyparse on error */ +{ + printf ("error: %s\n", s); + return 1; +} + +int found(const char* left, const char* right, const char *owner) +{ + static struct wlp_node_t *node; + + /* alloc node with non-empty fields (ie alloc them too)*/ + node = wlpn_alloc(FALSE); + if(!node) { + DBG("wlpn_alloc in found returned NULL\n"); + } + + strncpy(node->right,right,strlen(right)); + strncpy(node->left,left,strlen(left)); + strncpy(node->owner,owner,strlen(owner)); + + #ifndef WITHQUOTES + /* remove quotes of value part */ + node->right += 1; + node->right[strlen(node->right)-1] = '\0'; + #endif + #ifndef WITHANGBRACKETS + /* remove angle brackets of owner part */ + node->owner += 1; + node->owner[strlen(node->owner)-1] = '\0'; + #endif + + if(!list) + list = wlpl_init(node); + else + wlpn_add(list,node); +} diff --git a/wlp/macro.h b/wlp/macro.h new file mode 100644 index 0000000..303b3c6 --- /dev/null +++ b/wlp/macro.h @@ -0,0 +1,44 @@ +/* + * macro.h - Copyright 2000, 2001 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. + */ + + +#ifndef _macro_h_ +#define _macro_h_ + +#define LINELEN 2048 +#define TRUE 1 +#define FALSE 0 + +/* +#define WITHQUOTES +#define WITHANGBRACKETS +*/ + +#define ERR(a,b...) fprintf(stderr, a, ## b) + +/* Define it for debug info on stderr (better if in .c module ...) */ +/* +#ifndef DEBUG + #define DEBUG +#endif +*/ + + +#ifdef DEBUG + #define DBG(a...) fprintf(stderr, ## a) + /* for a verbose debug*/ + #define VDBG(a,b...) fprintf(stderr, "%s(): " a, __FUNCTION__ , ## b) +#else + #define DBG(a...) + #define VDBG(a...) +#endif + + +#endif + +/* EOF */ diff --git a/wlp/module/Makefile.pre.in b/wlp/module/Makefile.pre.in deleted file mode 100644 index 1026fc5..0000000 --- a/wlp/module/Makefile.pre.in +++ /dev/null @@ -1,317 +0,0 @@ -# Universal Unix Makefile for Python extensions -# ============================================= - -# Short Instructions -# ------------------ - -# 1. Build and install Python (1.5 or newer). -# 2. "make -f Makefile.pre.in boot" -# 3. "make" -# You should now have a shared library. - -# Long Instructions -# ----------------- - -# Build *and install* the basic Python 1.5 distribution. See the -# Python README for instructions. (This version of Makefile.pre.in -# only withs with Python 1.5, alpha 3 or newer.) - -# Create a file Setup.in for your extension. This file follows the -# format of the Modules/Setup.dist file; see the instructions there. -# For a simple module called "spam" on file "spammodule.c", it can -# contain a single line: -# spam spammodule.c -# You can build as many modules as you want in the same directory -- -# just have a separate line for each of them in the Setup.in file. - -# If you want to build your extension as a shared library, insert a -# line containing just the string -# *shared* -# at the top of your Setup.in file. - -# Note that the build process copies Setup.in to Setup, and then works -# with Setup. It doesn't overwrite Setup when Setup.in is changed, so -# while you're in the process of debugging your Setup.in file, you may -# want to edit Setup instead, and copy it back to Setup.in later. -# (All this is done so you can distribute your extension easily and -# someone else can select the modules they actually want to build by -# commenting out lines in the Setup file, without editing the -# original. Editing Setup is also used to specify nonstandard -# locations for include or library files.) - -# Copy this file (Misc/Makefile.pre.in) to the directory containing -# your extension. - -# Run "make -f Makefile.pre.in boot". This creates Makefile -# (producing Makefile.pre and sedscript as intermediate files) and -# config.c, incorporating the values for sys.prefix, sys.exec_prefix -# and sys.version from the installed Python binary. For this to work, -# the python binary must be on your path. If this fails, try -# make -f Makefile.pre.in Makefile VERSION=1.5 installdir= -# where is the prefix used to install Python for installdir -# (and possibly similar for exec_installdir=). - -# Note: "make boot" implies "make clobber" -- it assumes that when you -# bootstrap you may have changed platforms so it removes all previous -# output files. - -# If you are building your extension as a shared library (your -# Setup.in file starts with *shared*), run "make" or "make sharedmods" -# to build the shared library files. If you are building a statically -# linked Python binary (the only solution of your platform doesn't -# support shared libraries, and sometimes handy if you want to -# distribute or install the resulting Python binary), run "make -# python". - -# Note: Each time you edit Makefile.pre.in or Setup, you must run -# "make Makefile" before running "make". - -# Hint: if you want to use VPATH, you can start in an empty -# subdirectory and say (e.g.): -# make -f ../Makefile.pre.in boot srcdir=.. VPATH=.. - - -# === Bootstrap variables (edited through "make boot") === - -# The prefix used by "make inclinstall libainstall" of core python -installdir= /usr/local - -# The exec_prefix used by the same -exec_installdir=$(installdir) - -# Source directory and VPATH in case you want to use VPATH. -# (You will have to edit these two lines yourself -- there is no -# automatic support as the Makefile is not generated by -# config.status.) -srcdir= . -VPATH= . - -# === Variables that you may want to customize (rarely) === - -# (Static) build target -TARGET= python - -# Installed python binary (used only by boot target) -PYTHON= python - -CPPFLAGS:=$(shell dpkg-buildflags --get CPPFLAGS) -# Add more -I and -D options here -CFLAGS=$(OPT) -I$(INCLUDEPY) -I$(EXECINCLUDEPY) $(DEFS) $(shell dpkg-buildflags --get CFLAGS) -CXXFLAGS:=$(shell dpkg-buildflags --get CXXFLAGS) -LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) - - -# These two variables can be set in Setup to merge extensions. -# See example[23]. -BASELIB= -BASESETUP= - -# === Variables set by makesetup === - -MODOBJS= _MODOBJS_ -MODLIBS= _MODLIBS_ - -# === Definitions added by makesetup === - -# === Variables from configure (through sedscript) === - -VERSION= @VERSION@ -CC= @CC@ -LINKCC= @LINKCC@ -SGI_ABI= @SGI_ABI@ -OPT= @OPT@ -LDFLAGS= @LDFLAGS@ -LDLAST= @LDLAST@ -DEFS= @DEFS@ -LIBS= @LIBS@ -LIBM= @LIBM@ -LIBC= @LIBC@ -RANLIB= @RANLIB@ -MACHDEP= @MACHDEP@ -SO= @SO@ -LDSHARED= @LDSHARED@ -BLDSHARED= @BLDSHARED@ -CCSHARED= @CCSHARED@ -LINKFORSHARED= @LINKFORSHARED@ -CXX= @CXX@ - -# Install prefix for architecture-independent files -prefix= /usr - -# Install prefix for architecture-dependent files -exec_prefix= $(prefix) - -# Uncomment the following two lines for AIX -#LINKCC= $(LIBPL)/makexp_aix $(LIBPL)/python.exp "" $(LIBRARY); $(PURIFY) $(CC) -#LDSHARED= $(LIBPL)/ld_so_aix $(CC) -bI:$(LIBPL)/python.exp - -# === Fixed definitions === - -# Shell used by make (some versions default to the login shell, which is bad) -SHELL= /bin/sh - -# Expanded directories -BINDIR= $(exec_installdir)/bin -LIBDIR= $(exec_prefix)/lib -MANDIR= $(installdir)/share/man -INCLUDEDIR= $(installdir)/include -SCRIPTDIR= $(prefix)/lib - -# Detailed destination directories -BINLIBDEST= $(LIBDIR)/python$(VERSION) -LIBDEST= $(SCRIPTDIR)/python$(VERSION) -INCLUDEPY= $(INCLUDEDIR)/python$(VERSION) -EXECINCLUDEPY= $(exec_installdir)/include/python$(VERSION) -LIBP= $(exec_installdir)/lib/python$(VERSION) -DESTSHARED= $(BINLIBDEST)/site-packages - -LIBPL= $(LIBP)/config -LIBPL= $(shell python$(VERSION)-config --configdir) - -PYTHONLIBS= $(LIBPL)/libpython$(VERSION).a - -MAKESETUP= $(LIBPL)/makesetup -MAKEFILE= $(LIBPL)/Makefile -CONFIGC= $(LIBPL)/config.c -CONFIGCIN= $(LIBPL)/config.c.in -SETUP= $(LIBPL)/Setup.config $(LIBPL)/Setup.local $(LIBPL)/Setup - -SYSLIBS= $(LIBM) $(LIBC) - -ADDOBJS= $(LIBPL)/python.o config.o - -# Portable install script (configure doesn't always guess right) -INSTALL= $(LIBPL)/install-sh -c -# Shared libraries must be installed with executable mode on some systems; -# rather than figuring out exactly which, we always give them executable mode. -# Also, making them read-only seems to be a good idea... -INSTALL_SHARED= ${INSTALL} -m 555 - -# === Fixed rules === - -# Default target. This builds shared libraries only -default: sharedmods - -# Build everything -all: static sharedmods - -# Build shared libraries from our extension modules -sharedmods: $(SHAREDMODS) - -# Build a static Python binary containing our extension modules -static: $(TARGET) -$(TARGET): $(ADDOBJS) lib.a $(PYTHONLIBS) Makefile $(BASELIB) - $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) \ - $(ADDOBJS) lib.a $(PYTHONLIBS) \ - $(LINKPATH) $(BASELIB) $(MODLIBS) $(LIBS) $(SYSLIBS) \ - -o $(TARGET) $(LDLAST) - -install: sharedmods - if test ! -d $(DESTSHARED) ; then \ - mkdir $(DESTSHARED) ; else true ; fi - -for i in X $(SHAREDMODS); do \ - if test $$i != X; \ - then $(INSTALL_SHARED) $$i $(DESTSHARED)/$$i; \ - fi; \ - done - -# Build the library containing our extension modules -lib.a: $(MODOBJS) - -rm -f lib.a - ar cr lib.a $(MODOBJS) - -$(RANLIB) lib.a - -# This runs makesetup *twice* to use the BASESETUP definition from Setup -config.c Makefile: Makefile.pre Setup $(BASESETUP) $(MAKESETUP) - $(MAKESETUP) \ - -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) - $(MAKE) -f Makefile do-it-again - -# Internal target to run makesetup for the second time -do-it-again: - $(MAKESETUP) \ - -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) - -# Make config.o from the config.c created by makesetup -config.o: config.c - $(CC) $(CFLAGS) -c config.c - -# Setup is copied from Setup.in *only* if it doesn't yet exist -Setup: - cp $(srcdir)/Setup.in Setup - -# Make the intermediate Makefile.pre from Makefile.pre.in -Makefile.pre: Makefile.pre.in sedscript - sed -f sedscript $(srcdir)/Makefile.pre.in >Makefile.pre - -# Shortcuts to make the sed arguments on one line -P=prefix -E=exec_prefix -H=Generated automatically from Makefile.pre.in by sedscript. -L=LINKFORSHARED - -# Make the sed script used to create Makefile.pre from Makefile.pre.in -sedscript: $(MAKEFILE) - sed -n \ - -e '1s/.*/1i\\/p' \ - -e '2s%.*%# $H%p' \ - -e '/^VERSION=/s/^VERSION=[ ]*\(.*\)/s%@VERSION[@]%\1%/p' \ - -e '/^CC=/s/^CC=[ ]*\(.*\)/s%@CC[@]%\1%/p' \ - -e '/^CXX=/s/^CXX=[ ]*\(.*\)/s%@CXX[@]%\1%/p' \ - -e '/^LINKCC=/s/^LINKCC=[ ]*\(.*\)/s%@LINKCC[@]%\1%/p' \ - -e '/^OPT=/s/^OPT=[ ]*\(.*\)/s%@OPT[@]%\1%/p' \ - -e '/^LDFLAGS=/s/^LDFLAGS=[ ]*\(.*\)/s%@LDFLAGS[@]%\1%/p' \ - -e '/^LDLAST=/s/^LDLAST=[ ]*\(.*\)/s%@LDLAST[@]%\1%/p' \ - -e '/^DEFS=/s/^DEFS=[ ]*\(.*\)/s%@DEFS[@]%\1%/p' \ - -e '/^LIBS=/s/^LIBS=[ ]*\(.*\)/s%@LIBS[@]%\1%/p' \ - -e '/^LIBM=/s/^LIBM=[ ]*\(.*\)/s%@LIBM[@]%\1%/p' \ - -e '/^LIBC=/s/^LIBC=[ ]*\(.*\)/s%@LIBC[@]%\1%/p' \ - -e '/^RANLIB=/s/^RANLIB=[ ]*\(.*\)/s%@RANLIB[@]%\1%/p' \ - -e '/^MACHDEP=/s/^MACHDEP=[ ]*\(.*\)/s%@MACHDEP[@]%\1%/p' \ - -e '/^SO=/s/^SO=[ ]*\(.*\)/s%@SO[@]%\1%/p' \ - -e '/^LDSHARED=/s/^LDSHARED=[ ]*\(.*\)/s%@LDSHARED[@]%\1%/p' \ - -e '/^BLDSHARED=/s/^BLDSHARED=[ ]*\(.*\)/s%@BLDSHARED[@]%\1%/p' \ - -e '/^CCSHARED=/s/^CCSHARED=[ ]*\(.*\)/s%@CCSHARED[@]%\1%/p' \ - -e '/^SGI_ABI=/s/^SGI_ABI=[ ]*\(.*\)/s%@SGI_ABI[@]%\1%/p' \ - -e '/^$L=/s/^$L=[ ]*\(.*\)/s%@$L[@]%\1%/p' \ - -e '/^$P=/s/^$P=\(.*\)/s%^$P=.*%$P=\1%/p' \ - -e '/^$E=/s/^$E=\(.*\)/s%^$E=.*%$E=\1%/p' \ - $(MAKEFILE) >sedscript - echo "/^installdir=/s%=.*%= $(installdir)%" >>sedscript - echo "/^exec_installdir=/s%=.*%=$(exec_installdir)%" >>sedscript - echo "/^srcdir=/s%=.*%= $(srcdir)%" >>sedscript - echo "/^VPATH=/s%=.*%= $(VPATH)%" >>sedscript - echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%" >>sedscript - echo "/^BASELIB=/s%=.*%= $(BASELIB)%" >>sedscript - echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%" >>sedscript - if grep 's%@DEFS' sedscript >/dev/null 2>&1; then \ - :; \ - else \ - echo "s%@DEFS[@]%%" >>sedscript; \ - fi - - -# Bootstrap target -boot: clobber - VERSION=`$(PYTHON) -c "import sys; print sys.version[:3]"`; \ - installdir=`$(PYTHON) -c "import sys; print sys.prefix"`; \ - exec_installdir=`$(PYTHON) -c "import sys; print sys.exec_prefix"`; \ - $(MAKE) -f $(srcdir)/Makefile.pre.in VPATH=$(VPATH) srcdir=$(srcdir) \ - VERSION=$$VERSION \ - installdir=$$installdir \ - exec_installdir=$$exec_installdir \ - Makefile - -# Handy target to remove intermediate files and backups -clean: - -rm -f *.o *~ - -# Handy target to remove everything that is easily regenerated -clobber: clean - -rm -f *.a tags TAGS config.c Makefile.pre $(TARGET) sedscript - -rm -f *.so *.sl so_locations - - -# Handy target to remove everything you don't want to distribute -distclean: clobber - -rm -f Makefile Setup diff --git a/wlp/module/Makefile.pre.in.OLD b/wlp/module/Makefile.pre.in.OLD deleted file mode 100644 index 4f3f2bd..0000000 --- a/wlp/module/Makefile.pre.in.OLD +++ /dev/null @@ -1,304 +0,0 @@ -# Universal Unix Makefile for Python extensions -# ============================================= - -# Short Instructions -# ------------------ - -# 1. Build and install Python (1.5 or newer). -# 2. "make -f Makefile.pre.in boot" -# 3. "make" -# You should now have a shared library. - -# Long Instructions -# ----------------- - -# Build *and install* the basic Python 1.5 distribution. See the -# Python README for instructions. (This version of Makefile.pre.in -# only withs with Python 1.5, alpha 3 or newer.) - -# Create a file Setup.in for your extension. This file follows the -# format of the Modules/Setup.dist file; see the instructions there. -# For a simple module called "spam" on file "spammodule.c", it can -# contain a single line: -# spam spammodule.c -# You can build as many modules as you want in the same directory -- -# just have a separate line for each of them in the Setup.in file. - -# If you want to build your extension as a shared library, insert a -# line containing just the string -# *shared* -# at the top of your Setup.in file. - -# Note that the build process copies Setup.in to Setup, and then works -# with Setup. It doesn't overwrite Setup when Setup.in is changed, so -# while you're in the process of debugging your Setup.in file, you may -# want to edit Setup instead, and copy it back to Setup.in later. -# (All this is done so you can distribute your extension easily and -# someone else can select the modules they actually want to build by -# commenting out lines in the Setup file, without editing the -# original. Editing Setup is also used to specify nonstandard -# locations for include or library files.) - -# Copy this file (Misc/Makefile.pre.in) to the directory containing -# your extension. - -# Run "make -f Makefile.pre.in boot". This creates Makefile -# (producing Makefile.pre and sedscript as intermediate files) and -# config.c, incorporating the values for sys.prefix, sys.exec_prefix -# and sys.version from the installed Python binary. For this to work, -# the python binary must be on your path. If this fails, try -# make -f Makefile.pre.in Makefile VERSION=1.5 installdir= -# where is the prefix used to install Python for installdir -# (and possibly similar for exec_installdir=). - -# Note: "make boot" implies "make clobber" -- it assumes that when you -# bootstrap you may have changed platforms so it removes all previous -# output files. - -# If you are building your extension as a shared library (your -# Setup.in file starts with *shared*), run "make" or "make sharedmods" -# to build the shared library files. If you are building a statically -# linked Python binary (the only solution of your platform doesn't -# support shared libraries, and sometimes handy if you want to -# distribute or install the resulting Python binary), run "make -# python". - -# Note: Each time you edit Makefile.pre.in or Setup, you must run -# "make Makefile" before running "make". - -# Hint: if you want to use VPATH, you can start in an empty -# subdirectory and say (e.g.): -# make -f ../Makefile.pre.in boot srcdir=.. VPATH=.. - - -# === Bootstrap variables (edited through "make boot") === - -# The prefix used by "make inclinstall libainstall" of core python -installdir= /usr/local - -# The exec_prefix used by the same -exec_installdir=$(installdir) - -# Source directory and VPATH in case you want to use VPATH. -# (You will have to edit these two lines yourself -- there is no -# automatic support as the Makefile is not generated by -# config.status.) -srcdir= . -VPATH= . - -# === Variables that you may want to customize (rarely) === - -# (Static) build target -TARGET= python - -# Installed python binary (used only by boot target) -PYTHON= python - -# Add more -I and -D options here -CFLAGS= $(OPT) -I$(INCLUDEPY) -I$(EXECINCLUDEPY) $(DEFS) - -# These two variables can be set in Setup to merge extensions. -# See example[23]. -BASELIB= -BASESETUP= - -# === Variables set by makesetup === - -MODOBJS= _MODOBJS_ -MODLIBS= _MODLIBS_ - -# === Definitions added by makesetup === - -# === Variables from configure (through sedscript) === - -VERSION= @VERSION@ -CC= @CC@ -LINKCC= @LINKCC@ -SGI_ABI= @SGI_ABI@ -OPT= @OPT@ -LDFLAGS= @LDFLAGS@ -LDLAST= @LDLAST@ -DEFS= @DEFS@ -LIBS= @LIBS@ -LIBM= @LIBM@ -LIBC= @LIBC@ -RANLIB= @RANLIB@ -MACHDEP= @MACHDEP@ -SO= @SO@ -LDSHARED= @LDSHARED@ -CCSHARED= @CCSHARED@ -LINKFORSHARED= @LINKFORSHARED@ -CXX= @CXX@ - -# Install prefix for architecture-independent files -prefix= /usr/local - -# Install prefix for architecture-dependent files -exec_prefix= $(prefix) - -# Uncomment the following two lines for AIX -#LINKCC= $(LIBPL)/makexp_aix $(LIBPL)/python.exp "" $(LIBRARY); $(PURIFY) $(CC) -#LDSHARED= $(LIBPL)/ld_so_aix $(CC) -bI:$(LIBPL)/python.exp - -# === Fixed definitions === - -# Shell used by make (some versions default to the login shell, which is bad) -SHELL= /bin/sh - -# Expanded directories -BINDIR= $(exec_installdir)/bin -LIBDIR= $(exec_prefix)/lib -MANDIR= $(installdir)/share/man -INCLUDEDIR= $(installdir)/include -SCRIPTDIR= $(prefix)/lib - -# Detailed destination directories -BINLIBDEST= $(LIBDIR)/python$(VERSION) -LIBDEST= $(SCRIPTDIR)/python$(VERSION) -INCLUDEPY= $(INCLUDEDIR)/python$(VERSION) -EXECINCLUDEPY= $(exec_installdir)/include/python$(VERSION) -LIBP= $(exec_installdir)/lib/python$(VERSION) -DESTSHARED= $(BINLIBDEST)/site-packages - -LIBPL= $(LIBP)/config - -PYTHONLIBS= $(LIBPL)/libpython$(VERSION).a - -MAKESETUP= $(LIBPL)/makesetup -MAKEFILE= $(LIBPL)/Makefile -CONFIGC= $(LIBPL)/config.c -CONFIGCIN= $(LIBPL)/config.c.in -SETUP= $(LIBPL)/Setup.config $(LIBPL)/Setup.local $(LIBPL)/Setup - -SYSLIBS= $(LIBM) $(LIBC) - -ADDOBJS= $(LIBPL)/python.o config.o - -# Portable install script (configure doesn't always guess right) -INSTALL= $(LIBPL)/install-sh -c -# Shared libraries must be installed with executable mode on some systems; -# rather than figuring out exactly which, we always give them executable mode. -# Also, making them read-only seems to be a good idea... -INSTALL_SHARED= ${INSTALL} -m 555 - -# === Fixed rules === - -# Default target. This builds shared libraries only -default: sharedmods - -# Build everything -all: static sharedmods - -# Build shared libraries from our extension modules -sharedmods: $(SHAREDMODS) - -# Build a static Python binary containing our extension modules -static: $(TARGET) -$(TARGET): $(ADDOBJS) lib.a $(PYTHONLIBS) Makefile $(BASELIB) - $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) \ - $(ADDOBJS) lib.a $(PYTHONLIBS) \ - $(LINKPATH) $(BASELIB) $(MODLIBS) $(LIBS) $(SYSLIBS) \ - -o $(TARGET) $(LDLAST) - -install: sharedmods - if test ! -d $(DESTSHARED) ; then \ - mkdir $(DESTSHARED) ; else true ; fi - -for i in X $(SHAREDMODS); do \ - if test $$i != X; \ - then $(INSTALL_SHARED) $$i $(DESTSHARED)/$$i; \ - fi; \ - done - -# Build the library containing our extension modules -lib.a: $(MODOBJS) - -rm -f lib.a - ar cr lib.a $(MODOBJS) - -$(RANLIB) lib.a - -# This runs makesetup *twice* to use the BASESETUP definition from Setup -config.c Makefile: Makefile.pre Setup $(BASESETUP) $(MAKESETUP) - $(MAKESETUP) \ - -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) - $(MAKE) -f Makefile do-it-again - -# Internal target to run makesetup for the second time -do-it-again: - $(MAKESETUP) \ - -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) - -# Make config.o from the config.c created by makesetup -config.o: config.c - $(CC) $(CFLAGS) -c config.c - -# Setup is copied from Setup.in *only* if it doesn't yet exist -Setup: - cp $(srcdir)/Setup.in Setup - -# Make the intermediate Makefile.pre from Makefile.pre.in -Makefile.pre: Makefile.pre.in sedscript - sed -f sedscript $(srcdir)/Makefile.pre.in >Makefile.pre - -# Shortcuts to make the sed arguments on one line -P=prefix -E=exec_prefix -H=Generated automatically from Makefile.pre.in by sedscript. -L=LINKFORSHARED - -# Make the sed script used to create Makefile.pre from Makefile.pre.in -sedscript: $(MAKEFILE) - sed -n \ - -e '1s/.*/1i\\/p' \ - -e '2s%.*%# $H%p' \ - -e '/^VERSION=/s/^VERSION=[ ]*\(.*\)/s%@VERSION[@]%\1%/p' \ - -e '/^CC=/s/^CC=[ ]*\(.*\)/s%@CC[@]%\1%/p' \ - -e '/^CXX=/s/^CXX=[ ]*\(.*\)/s%@CXX[@]%\1%/p' \ - -e '/^LINKCC=/s/^LINKCC=[ ]*\(.*\)/s%@LINKCC[@]%\1%/p' \ - -e '/^OPT=/s/^OPT=[ ]*\(.*\)/s%@OPT[@]%\1%/p' \ - -e '/^LDFLAGS=/s/^LDFLAGS=[ ]*\(.*\)/s%@LDFLAGS[@]%\1%/p' \ - -e '/^LDLAST=/s/^LDLAST=[ ]*\(.*\)/s%@LDLAST[@]%\1%/p' \ - -e '/^DEFS=/s/^DEFS=[ ]*\(.*\)/s%@DEFS[@]%\1%/p' \ - -e '/^LIBS=/s/^LIBS=[ ]*\(.*\)/s%@LIBS[@]%\1%/p' \ - -e '/^LIBM=/s/^LIBM=[ ]*\(.*\)/s%@LIBM[@]%\1%/p' \ - -e '/^LIBC=/s/^LIBC=[ ]*\(.*\)/s%@LIBC[@]%\1%/p' \ - -e '/^RANLIB=/s/^RANLIB=[ ]*\(.*\)/s%@RANLIB[@]%\1%/p' \ - -e '/^MACHDEP=/s/^MACHDEP=[ ]*\(.*\)/s%@MACHDEP[@]%\1%/p' \ - -e '/^SO=/s/^SO=[ ]*\(.*\)/s%@SO[@]%\1%/p' \ - -e '/^LDSHARED=/s/^LDSHARED=[ ]*\(.*\)/s%@LDSHARED[@]%\1%/p' \ - -e '/^CCSHARED=/s/^CCSHARED=[ ]*\(.*\)/s%@CCSHARED[@]%\1%/p' \ - -e '/^SGI_ABI=/s/^SGI_ABI=[ ]*\(.*\)/s%@SGI_ABI[@]%\1%/p' \ - -e '/^$L=/s/^$L=[ ]*\(.*\)/s%@$L[@]%\1%/p' \ - -e '/^$P=/s/^$P=\(.*\)/s%^$P=.*%$P=\1%/p' \ - -e '/^$E=/s/^$E=\(.*\)/s%^$E=.*%$E=\1%/p' \ - $(MAKEFILE) >sedscript - echo "/^installdir=/s%=.*%= $(installdir)%" >>sedscript - echo "/^exec_installdir=/s%=.*%=$(exec_installdir)%" >>sedscript - echo "/^srcdir=/s%=.*%= $(srcdir)%" >>sedscript - echo "/^VPATH=/s%=.*%= $(VPATH)%" >>sedscript - echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%" >>sedscript - echo "/^BASELIB=/s%=.*%= $(BASELIB)%" >>sedscript - echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%" >>sedscript - -# Bootstrap target -boot: clobber - VERSION=`$(PYTHON) -c "import sys; print sys.version[:3]"`; \ - installdir=`$(PYTHON) -c "import sys; print sys.prefix"`; \ - exec_installdir=`$(PYTHON) -c "import sys; print sys.exec_prefix"`; \ - $(MAKE) -f $(srcdir)/Makefile.pre.in VPATH=$(VPATH) srcdir=$(srcdir) \ - VERSION=$$VERSION \ - installdir=$$installdir \ - exec_installdir=$$exec_installdir \ - Makefile - -# Handy target to remove intermediate files and backups -clean: - -rm -f *.o *~ - -# Handy target to remove everything that is easily regenerated -clobber: clean - -rm -f *.a tags TAGS config.c Makefile.pre $(TARGET) sedscript - -rm -f *.so *.sl so_locations - - -# Handy target to remove everything you don't want to distribute -distclean: clobber - -rm -f Makefile Setup diff --git a/wlp/module/Setup.in b/wlp/module/Setup.in deleted file mode 100644 index 18cce4d..0000000 --- a/wlp/module/Setup.in +++ /dev/null @@ -1,88 +0,0 @@ -# -*- makefile -*- -# The file Setup is used by the makesetup script to construct the files -# Makefile and config.c, from Makefile.pre and config.c.in, -# respectively. The file Setup itself is initially copied from -# Setup.in; once it exists it will not be overwritten, so you can edit -# Setup to your heart's content. Note that Makefile.pre is created -# from Makefile.pre.in by the toplevel configure script. - -# (VPATH notes: Setup and Makefile.pre are in the build directory, as -# are Makefile and config.c; the *.in files are in the source -# directory.) - -# Each line in this file describes one or more optional modules. -# Comment out lines to suppress modules. -# Lines have the following structure: -# -# ... [ ...] [ ...] [ ...] - -# is anything ending in .c (.C, .cc, .c++ are C++ files) -# is anything starting with -I, -D, -U or -C -# is anything ending in .a or beginning with -l or -L -# is anything else but should be a valid Python -# identifier (letters, digits, underscores, beginning with non-digit) -# -# (As the makesetup script changes, it may recognize some other -# arguments as well, e.g. *.so and *.sl as libraries. See the big -# case statement in the makesetup script.) -# -# Lines can also have the form -# -# = -# -# which defines a Make variable definition inserted into Makefile.in -# -# Finally, if a line contains just the word "*shared*" (without the -# quotes but with the stars), then the following modules will not be -# included in the config.c file, nor in the list of objects to be -# added to the library archive, and their linker options won't be -# added to the linker options, but rules to create their .o files and -# their shared libraries will still be added to the Makefile, and -# their names will be collected in the Make variable SHAREDMODS. This -# is used to build modules as shared libraries. (They can be -# installed using "make sharedinstall", which is implied by the -# toplevel "make install" target.) (For compatibility, -# *noconfig* has the same effect as *shared*.) -# -# In addition, *static* reverses this effect (negating a previous -# *shared* line). - -# NOTE: As a standard policy, as many modules as can be supported by a -# platform should be present. The distribution comes with all modules -# enabled that are supported by most platforms and don't require you -# to ftp sources from elsewhere. - -*static* -# Some special rules to define PYTHONPATH. -# Edit the definitions below to indicate which options you are using. -# Don't add any whitespace or comments! - -# Directories where library files get installed. -# DESTLIB is for Python modules; MACHDESTLIB for shared libraries. -DESTLIB=$(LIBDEST) -MACHDESTLIB=$(BINLIBDEST) - -# NOTE: all the paths are now relative to the prefix that is computed -# at run time! - -# Standard path -- don't edit. -# No leading colon since this is the first entry. -# Empty since this is now just the runtime prefix. -DESTPATH= - -# Site specific path components -- should begin with : if non-empty -SITEPATH= - -# Standard path components for test modules -TESTPATH= - -# Path components for machine- or system-dependent modules and shared libraries -MACHDEPPATH=:plat-$(MACHDEP) - -COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(MACHDEPPATH)$(STDWINPATH)$(TKPATH) -PYTHONPATH=$(COREPYTHONPATH) - -*shared* - -WLPSRCDIR=../C -wlp $(WLPSRCDIR)/wlp.c $(WLPSRCDIR)/wlp.a diff --git a/wlp/module/makesetup b/wlp/module/makesetup deleted file mode 100755 index 0fefcff..0000000 --- a/wlp/module/makesetup +++ /dev/null @@ -1,261 +0,0 @@ -#! /bin/sh - -# Convert templates into Makefile and config.c, based on the module -# definitions found in the file Setup. -# -# Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...] -# -# Options: -# -s directory: alternative source directory (default derived from $0) -# -c file: alternative config.c template (default $srcdir/config.c.in) -# -c -: don't write config.c -# -m file: alternative Makefile template (default ./Makefile.pre) -# -m -: don't write Makefile -# -# Remaining arguments are one or more Setup files (default ./Setup). -# Setup files after a -n option are used for their variables, modules -# and libraries but not for their .o files. -# -# See Setup.in for a description of the format of the Setup file. -# -# The following edits are made: -# -# Copying config.c.in to config.c: -# - insert an identifying comment at the start -# - for each mentioned in Setup before *noconfig*: -# + insert 'extern void init();' before MARKER 1 -# + insert '{"", initmodule},' before MARKER 2 -# -# Copying Makefile.pre to Makefile: -# - insert an identifying comment at the start -# - replace _MODOBJS_ by the list of objects from Setup (except for -# Setup files after a -n option) -# - replace _MODLIBS_ by the list of libraries from Setup -# - for each object file mentioned in Setup, append a rule -# '.o: .c; ' to the end of the Makefile -# - for each module mentioned in Setup, append a rule -# which creates a shared library version to the end of the Makefile -# - for each variable definition found in Setup, insert the definition -# before the comment 'Definitions added by makesetup' - -# Loop over command line options -usage=' -usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre] - [Setup] ... [-n [Setup] ...]' -srcdir='' -config='' -makepre='' -noobjects='' -doconfig=yes -while : -do - case $1 in - -s) shift; srcdir=$1; shift;; - -c) shift; config=$1; shift;; - -m) shift; makepre=$1; shift;; - --) shift; break;; - -n) noobjects=yes;; - -*) echo "$usage" 1>&2; exit 2;; - *) break;; - esac -done - -# Set default srcdir and config if not set by command line -# (Not all systems have dirname) -case $srcdir in -'') case $0 in - */*) srcdir=`echo $0 | sed 's,/[^/]*$,,'`;; - *) srcdir=.;; - esac;; -esac -case $config in -'') config=$srcdir/config.c.in;; -esac -case $makepre in -'') makepre=Makefile.pre;; -esac - -# Newline for sed i and a commands -NL='\ -' - -# Main loop -for i in ${*-Setup} -do - case $i in - -n) echo '*noobjects*';; - *) echo '*doconfig*'; cat "$i";; - esac -done | -sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | -( - rulesf="@rules.$$" - trap 'rm -f $rulesf' 0 1 2 3 - echo " -# Rules appended by makedepend -" >$rulesf - DEFS= - MODS= - SHAREDMODS= - OBJS= - LIBS= - LOCALLIBS= - BASELIBS= - while read line - do - # Output DEFS in reverse order so first definition overrides - case $line in - *=*) DEFS="$line$NL$DEFS"; continue;; - 'include '*) DEFS="$line$NL$DEFS"; continue;; - '*noobjects*') - case $noobjects in - yes) ;; - *) LOCALLIBS=$LIBS; LIBS=;; - esac - noobjects=yes; - continue;; - '*doconfig*') doconfig=yes; continue;; - '*static*') doconfig=yes; continue;; - '*noconfig*') doconfig=no; continue;; - '*shared*') doconfig=no; continue;; - esac - srcs= - cpps= - libs= - mods= - skip= - for arg in $line - do - case $skip in - libs) libs="$libs $arg"; skip=; continue;; - cpps) cpps="$cpps $arg"; skip=; continue;; - srcs) srcs="$srcs $arg"; skip=; continue;; - esac - case $arg in - -[IDUC]*) cpps="$cpps $arg";; - -Xlinker) libs="$libs $arg"; skip=libs;; - -[A-Zl]*) libs="$libs $arg";; - *.a) libs="$libs $arg";; - *.so) libs="$libs $arg";; - *.sl) libs="$libs $arg";; - /*.o) libs="$libs $arg";; - *.o) srcs="$srcs `basename $arg .o`.c";; - *.[cC]) srcs="$srcs $arg";; - *.cc) srcs="$srcs $arg";; - *.c++) srcs="$srcs $arg";; - *.cxx) srcs="$srcs $arg";; - *.cpp) srcs="$srcs $arg";; - \$*) libs="$libs $arg" - cpps="$cpps $arg";; - *.*) echo 1>&2 "bad word $arg in $line" - exit 1;; - -u) skip=libs; libs="$libs -u";; - [a-zA-Z_]*) mods="$mods $arg";; - *) echo 1>&2 "bad word $arg in $line" - exit 1;; - esac - done - case $doconfig in - yes) - LIBS="$LIBS $libs" - MODS="$MODS $mods" - ;; - esac - case $noobjects in - yes) continue;; - esac - objs='' - for src in $srcs - do - case $src in - *.c) obj=`basename $src .c`.o; cc='$(CC)';; - *.cc) obj=`basename $src .cc`.o; cc='$(CCC)';; - *.c++) obj=`basename $src .c++`.o; cc='$(CCC)';; - *.C) obj=`basename $src .C`.o; cc='$(CCC)';; - *.cxx) obj=`basename $src .cxx`.o; cc='$(CCC)';; - *.cpp) obj=`basename $src .cpp`.o; cc='$(CCC)';; - *) continue;; - esac - objs="$objs $obj" - case $src in - glmodule.c) ;; - /*) ;; - *) src='$(srcdir)/'$src;; - esac - case $doconfig in - no) cc="$cc \$(CCSHARED)";; - esac - rule="$obj: $src; $cc $cpps \$(CFLAGS) -c $src" - echo "$rule" >>$rulesf - done - case $doconfig in - yes) OBJS="$OBJS $objs";; - esac - for mod in $mods - do - case $objs in - *$mod.o*) base=$mod;; - *) base=${mod}module;; - esac - file="$base\$(SO)" - case $doconfig in - no) SHAREDMODS="$SHAREDMODS $file";; - esac - rule="$file: $objs" - rule="$rule; \$(LDSHARED) $objs $libs -o $file" - echo "$rule" >>$rulesf - done - done - - case $SHAREDMODS in - '') ;; - *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";; - esac - - case $noobjects in - yes) BASELIBS=$LIBS;; - *) LOCALLIBS=$LIBS;; - esac - LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)' - DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS" - DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS" - - EXTDECLS= - INITBITS= - for mod in $MODS - do - EXTDECLS="${EXTDECLS}extern void init$mod();$NL" - INITBITS="${INITBITS} {\"$mod\", init$mod},$NL" - done - - - case $config in - -) ;; - *) sed -e " - 1i$NL/* Generated automatically from $config by makesetup. */ - /MARKER 1/i$NL$EXTDECLS - - /MARKER 2/i$NL$INITBITS - - " $config >config.c - ;; - esac - - case $makepre in - -) ;; - *) sedf="@sed.in.$$" - trap 'rm -f $sedf' 0 1 2 3 - echo "1i\\" >$sedf - str="# Generated automatically from $makepre by makesetup." - echo "$str" >>$sedf - echo "s%_MODOBJS_%$OBJS%" >>$sedf - echo "s%_MODLIBS_%$LIBS%" >>$sedf - echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf - sed -f $sedf $makepre >Makefile - cat $rulesf >>Makefile - rm -f $sedf - ;; - esac - - rm -f $rulesf -) diff --git a/wlp/module/patch b/wlp/module/patch deleted file mode 100644 index bc798fa..0000000 --- a/wlp/module/patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -ru pyg-0.9.6-old/wlp/module/Makefile.pre.in pyg-0.9.6/wlp/module/Makefile.pre.in ---- pyg-0.9.6-old/wlp/module/Makefile.pre.in 2003-11-04 08:49:29.000000000 -0800 -+++ pyg-0.9.6/wlp/module/Makefile.pre.in 2003-11-04 09:25:16.000000000 -0800 -@@ -278,6 +278,9 @@ - echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%" >>sedscript - echo "/^BASELIB=/s%=.*%= $(BASELIB)%" >>sedscript - echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%" >>sedscript -+ if ! grep 's%@DEFS' sedscript >/dev/null 2>&1; then \ -+ echo "s%@DEFS[@]%%" >>sedscript; \ -+ fi - - # Bootstrap target - boot: clobber diff --git a/wlp/structs.c b/wlp/structs.c new file mode 100644 index 0000000..8c33443 --- /dev/null +++ b/wlp/structs.c @@ -0,0 +1,164 @@ +/* + * structs.c - Copyright 2000 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 + +#include "structs.h" +#include "macro.h" + +struct wlp_node_t *wlpn_add(struct wlp_list_t *list,struct wlp_node_t *node) +{ + struct wlp_node_t *ret; + + if(node) { + node->next = list->head; + node->prev = list->tail; + + list->tail->next = node; + list->head->prev = node; + + list->tail = node; + + list->count++; + + ret = node; + } else { + DBG("cannot add %s %s to list. NULL pointer?\n", + node->left,node->right); + ret = NULL; + } + + return ret; +} + +void wlpn_free(struct wlp_node_t *node) +{ + free(node->left); + free(node->right); + free(node->owner); + free(node); +} + + +struct wlp_node_t *wlpn_alloc(const char empty) +{ + static struct wlp_node_t *node; + + node = calloc(sizeof(struct wlp_node_t),1); + + if (!node) { + perror("wlpn_create malloc"); + + /* calloc set *node to zero, it I don't want alloc anything, + leave it untouched, else alloc fields */ + } else if (!empty) { + node->left = calloc(LINELEN+1,1); + if (!node->left) { + perror("wlpn_create malloc (left)"); + free(node); + node = NULL; + } + + /*if node is NULL, previous calloc returned error...*/ + if(node && !(node->right = calloc(LINELEN+1,1))) { + perror("wlpn_create malloc (right)"); + free(node); + node = NULL; + } + + if(node && !(node->owner = calloc(LINELEN+1,1))) { + perror("wlpn_create malloc (owner)"); + free(node); + node = NULL; + } + } + return node; +} + +struct wlp_list_t *wlpl_init(struct wlp_node_t *node) +{ + static struct wlp_list_t *list; + + list = malloc(sizeof(struct wlp_list_t)); + + if (list) { + list->head = node; + list->tail = list->head; + + list->head->next = list->head; + list->head->prev = list->head; + + list->count=1; + } else { + perror("wlpl_init malloc"); + return NULL; + } + + return list; +} + + +struct wlp_node_t *wlpn_searchowner(struct wlp_list_t *mbl,const char *owner) +{ + struct wlp_node_t *ret; + + DBG("searching for %s\n",owner); + + if(!mbl) + ret = NULL; + else { + int found = FALSE; + ret = mbl->head; + + do { + if(!strcmp(owner,ret->owner)) { + DBG("found!\n"); + found = TRUE; + } else { + DBG("not found: %s\n",ret->onwer); + ret = ret->next; + } + } while(ret != mbl->head && !found); + + if(!found) + ret = NULL; + } + + DBG("%s\n", (ret)?ret->owner:"not found"); + + return ret; +} + + +struct wlp_node_t *wlpn_extract(struct wlp_list_t *list,struct wlp_node_t *node) +{ + struct wlp_node_t *ret; + + if(list && node) { + node->prev->next = node->next; + node->next->prev = node->prev; + + if(list->tail == node) + list->tail = node->prev; + if(list->head == node) + list->head = node->next; + + list->count--; + + ret = node; + } else { + DBG("wlpn_extract: list addr %l and node %l (one is NULL)\n",list,addr) + ret = NULL; + } + + return ret; +} diff --git a/wlp/structs.h b/wlp/structs.h new file mode 100644 index 0000000..92036a7 --- /dev/null +++ b/wlp/structs.h @@ -0,0 +1,35 @@ +/* + * structs.h - 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. + */ + +#ifndef _structs_h_ +#define _structs_h_ + +typedef struct wlp_node_t { + char *left,*right; + char *owner; + char type; /* unused */ + struct wlp_node_t *next, *prev; +} wlp_node_t; + +typedef struct wlp_list_t { + int count; + struct wlp_node_t *head, *tail; +} wlp_list_t; + + +/* white list parser data structure manipulation */ +struct wlp_list_t *wlpl_init(struct wlp_node_t *node); +struct wlp_node_t *wlpn_alloc(const char empty); +void wlpn_free(struct wlp_node_t *node); +struct wlp_node_t *wlpn_add(struct wlp_list_t *wlpl,struct wlp_node_t *wlpn); +struct wlp_node_t *wlpn_extract(struct wlp_list_t *wlpl,struct wlp_node_t *wlpn); +/*struct wlp_node_t *wlpn_search(struct wlp_list_t *wlpl,const char id);*/ + +#endif /* _structs_h_ */ + +/* EOF */ diff --git a/wlp/test.c b/wlp/test.c new file mode 100644 index 0000000..47717b5 --- /dev/null +++ b/wlp/test.c @@ -0,0 +1,113 @@ +#include /* should be modified to be pythonX.Y */ +#include +#include + +#include "structs.h" +#include "macro.h" + +/* first declare static functions */ + +struct wlp_list_t *list; + +static FILE *fd = NULL; + +static PyObject *node2dict(struct wlp_node_t *node); + +static PyObject *wlp_setfilebyname(PyObject *self, PyObject *args) { + char *file; + + DBG("setfilebyname\n"); + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + + fd = fopen(file,"r"); + + return Py_None; +} + +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; + +} + + + +static PyObject *wlp_mklist(PyObject *self, PyObject *args) { + struct wlp_node_t *tmp; + int count; + + PyObject *pylist = NULL; + + DBG("a\n"); + parse(fd); + + DBG("count %d\n"list->count); + pylist = PyList_New(0); + + DBG("a\n"); + if(!pylist) + return NULL; + + DBG("a\n"); + 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); + if(PyList_Append(pylist,node2dict(tmp))==-1) { + DBG("List failed\n"); + return NULL; + } + DBG("a\n"); + } + + return pylist; +} + + +static PyObject *node2dict(struct wlp_node_t *node) { + PyObject *dict = PyDict_New(); + + if(!dict) + return NULL; + + PyDict_SetItem(dict, + Py_BuildValue("s","owner"), + Py_BuildValue("s",node->owner)); + + PyDict_SetItem(dict, + Py_BuildValue("s",node->left), + Py_BuildValue("s",node->right)); + + return dict; + +} + +/* second a table with methods/functions matching */ + +static PyMethodDef wlp_methods[] = { + {"mklist", wlp_mklist, METH_VARARGS}, + {"setfilebyname", wlp_setfilebyname, METH_VARARGS}, + {"setfilebyfd", wlp_setfilebyfd, METH_VARARGS}, + {NULL,NULL} +}; + + +/* last the init function, the only one non-static */ + +void initwlp() { + (void) Py_InitModule("wlp",wlp_methods); +} diff --git a/wlp/wlp.c b/wlp/wlp.c new file mode 100644 index 0000000..6a36617 --- /dev/null +++ b/wlp/wlp.c @@ -0,0 +1,154 @@ +/* + * 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); +} diff --git a/wlp/yytest.c b/wlp/yytest.c new file mode 100644 index 0000000..74c6fe7 --- /dev/null +++ b/wlp/yytest.c @@ -0,0 +1,25 @@ +#include + +#include "structs.h" +#include "macro.h" + + + +int parse(FILE *file); + +struct wlp_list_t *list; + +int main(int argc,char **argv) { + struct wlp_node_t *tmp; + int count; + + parse(NULL); + + if(list) + for(tmp = list->head, count=0; + tmp != list->head || count == 0; + tmp = tmp->next, count++) + printf("FOUND(%d) '%s' '%s' '%s'\n",count,tmp->left,tmp->right,tmp->owner); + + return(0); +} -- cgit