From 650c79cb75b4b09257ce0e489c5e20707d8758e0 Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Fri, 9 Jul 2010 15:31:23 +0200 Subject: Add a C <-> Python Dict class and fix DbBase to take a Dict fo it's config argument --- src/dbbase.c | 11 ++++----- src/dbbase.h | 3 ++- src/dict.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/dict.h | 14 +++++++++++ 4 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/dict.c create mode 100644 src/dict.h (limited to 'src') diff --git a/src/dbbase.c b/src/dbbase.c index c617326..dbff007 100644 --- a/src/dbbase.c +++ b/src/dbbase.c @@ -1,6 +1,7 @@ -#include "config.h" +//#include "config.h" #include "dbbase.h" #include "interpreter.h" +#include "dict.h" #include struct DbBase @@ -8,7 +9,7 @@ struct DbBase PyObject *object; }; -DbBase* createDbBase(const char *paths[], unsigned int pathCount, Config *c, int ignore, int quiet, int ignore_init_read_errors) +DbBase* createDbBase(const char *paths[], unsigned int pathCount, Dict *dict, int ignore, int quiet, int ignore_init_read_errors) { PyObject *pypaths = PyList_New(pathCount); for (unsigned int i = 0; i < pathCount; i++) @@ -16,10 +17,8 @@ DbBase* createDbBase(const char *paths[], unsigned int pathCount, Config *c, int PyObject *path = PyBytes_FromString(paths[i]); PyList_Insert(pypaths, i, path); } - - PyObject *cfg = _object(c); - - PyObject *obj = executeFunction("layman.dbbase", "DbBase", "OOIII", pypaths, cfg, ignore, quiet, ignore_init_read_errors); + + PyObject *obj = executeFunction("layman.dbbase", "DbBase", "OOIII", pypaths, dictToPyDict(dict), ignore, quiet, ignore_init_read_errors); Py_DECREF(pypaths); if (!obj) diff --git a/src/dbbase.h b/src/dbbase.h index 12065af..56f9270 100644 --- a/src/dbbase.h +++ b/src/dbbase.h @@ -2,9 +2,10 @@ #define DB_BASE_H #include "config.h" +#include "dict.h" typedef struct DbBase DbBase; -DbBase* createDbBase(const char *paths[], unsigned int path_count, Config *c, int ignore, int quiet, int ignore_init_read_errors); +DbBase* createDbBase(const char *paths[], unsigned int path_count, Dict *c, int ignore, int quiet, int ignore_init_read_errors); #endif diff --git a/src/dict.c b/src/dict.c new file mode 100644 index 0000000..a818a69 --- /dev/null +++ b/src/dict.c @@ -0,0 +1,80 @@ +#include +#include +#include + +#include "dict.h" + +/* + * Dict + */ +typedef struct DictElem DictElem; +struct DictElem +{ + const char *key; + const char *val; + struct DictElem *next; +}; + +struct Dict +{ + DictElem *root; + int count; +}; + +Dict *dictCreate() +{ + Dict *ret = malloc(sizeof(Dict)); + ret->count = 0; + ret->root = 0; + return ret; +} + +void dictInsert(Dict* list, const char* key, const char* value) +{ + if (!list) + return; + DictElem *node = malloc(sizeof(DictElem)); + node->key = key; + node->val = value; + node->next = list->root; + list->root = node; + list->count++; +} + +unsigned int dictCount(Dict *list) +{ + return (list ? list->count : 0); +} + +void dictFree(Dict *list, int deref) +{ + if (!list) + return; + + DictElem *node = list->root; + while (node) + { + DictElem *tmp = node; + node = node->next; + /*if (deref) + { + Py_DECREF(tmp->object); + }*/ + free(tmp); + } + + free(list); +} + +PyObject *dictToPyDict(Dict *dict) +{ + PyObject *pydict = PyDict_New(); + DictElem *node = dict->root; + while (node) + { + PyDict_SetItem(pydict, PyBytes_FromString(node->key), PyBytes_FromString(node->val)); + node = node->next; + } + + return pydict; +} diff --git a/src/dict.h b/src/dict.h new file mode 100644 index 0000000..844963c --- /dev/null +++ b/src/dict.h @@ -0,0 +1,14 @@ +#ifndef DICT_H +#define DICT_H + +#include + +typedef struct Dict Dict; + +Dict* dictCreate(); +//char* tableFind(Dict *table, char* key); +void dictFree(Dict *t, int); +void dictInsert(Dict* list, const char* key, const char* value); +unsigned int dictCount(Dict *table); +PyObject* dictToPyDict(Dict *dict); +#endif -- cgit v1.2.3-1-g7c22