From 2e6f2b74e2c1c66afcadc67af1df1b112ba15cdb Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Thu, 15 Jul 2010 16:11:49 +0200 Subject: Fix a warning in Dict Add a method to get info for a list of overlays --- src/dict.c | 6 +---- src/dict.h | 2 +- src/laymanapi.c | 71 +++++++++++++++++++++++++++++++++++++++++++++----------- src/laymanapi.h | 16 +++---------- src/stringlist.c | 2 +- src/tester.c | 17 +++++++------- 6 files changed, 73 insertions(+), 41 deletions(-) diff --git a/src/dict.c b/src/dict.c index a818a69..0deebe9 100644 --- a/src/dict.c +++ b/src/dict.c @@ -46,7 +46,7 @@ unsigned int dictCount(Dict *list) return (list ? list->count : 0); } -void dictFree(Dict *list, int deref) +void dictFree(Dict *list) { if (!list) return; @@ -56,10 +56,6 @@ void dictFree(Dict *list, int deref) { DictElem *tmp = node; node = node->next; - /*if (deref) - { - Py_DECREF(tmp->object); - }*/ free(tmp); } diff --git a/src/dict.h b/src/dict.h index 844963c..47dd957 100644 --- a/src/dict.h +++ b/src/dict.h @@ -7,7 +7,7 @@ typedef struct Dict Dict; Dict* dictCreate(); //char* tableFind(Dict *table, char* key); -void dictFree(Dict *t, int); +void dictFree(Dict *t); void dictInsert(Dict* list, const char* key, const char* value); unsigned int dictCount(Dict *table); PyObject* dictToPyDict(Dict *dict); diff --git a/src/laymanapi.c b/src/laymanapi.c index 7620869..5de0140 100644 --- a/src/laymanapi.c +++ b/src/laymanapi.c @@ -11,12 +11,6 @@ struct LaymanAPI PyObject *object; }; -OverlayInfo strToInfo(const char* str) -{ - OverlayInfo ret; - return ret; -} - LaymanAPI* laymanAPICreate(BareConfig* config, int report_error, int output) { PyObject *obj = executeFunction("layman.api", "LaymanAPI", "Oii", _bareConfigObject(config), report_error, output); @@ -41,11 +35,6 @@ StringList* laymanAPIGetAvailable(LaymanAPI* l, int reload) return ret; } -/*StringList* laymanAPIGetInstalled(LaymanAPI* l) -{ - return laymanAPIGetInstalled(l, 0); -}*/ - StringList* laymanAPIGetInstalled(LaymanAPI* l, int reload) { if (!l || !l->object) @@ -97,13 +86,69 @@ int laymanAPIFetchRemoteList(LaymanAPI* l) return ret; } +int laymanAPIGetInfoList(LaymanAPI* l, StringList* overlays, OverlayInfo* results) +{ + if (!l || !l->object || !overlays || !results) + return 0; + + PyObject *list = cListToPyList(overlays); + + PyObject *obj = PyObject_CallMethod(l->object, "get_info", "(O)", list); + Py_DECREF(list); + + if (!obj || !PyDict_Check(obj)) + { + if (obj) + { + Py_DECREF(obj); + } + return 0; + } + + PyObject *name, *tuple; + Py_ssize_t i = 0; + + int k = 0; + + while (PyDict_Next(obj, &i, &name, &tuple)) + { + if (!tuple || !PyTuple_Check(tuple)) + { + Py_DECREF(obj); + continue; + } + + PyObject *text = PyTuple_GetItem(tuple, 0); + PyObject *official = PyTuple_GetItem(tuple, 1); + PyObject *supported = PyTuple_GetItem(tuple, 2); + + if (!PyString_Check(text) || !PyString_Check(name)) + continue; + + char* tmp = PyString_AsString(name); + results[k].name = malloc((strlen(tmp) + 1) * sizeof(char)); + strcpy(results[k].name, tmp); + + tmp = PyString_AsString(text); + results[k].text = malloc((strlen(tmp) + 1) * sizeof(char)); + strcpy(results[k].text, tmp); + + results[k].official = PyObject_IsTrue(official); + results[k].supported = PyObject_IsTrue(supported); + k++; + } + + Py_DECREF(obj); + return k; +} + OverlayInfo *laymanAPIGetInfo(LaymanAPI* l, const char* overlay) { if (!l || !l->object || !overlay) return NULL; PyObject *list = PyList_New(1); - PyList_SetItem(list, 0, PyBytes_FromString(overlay)); + PyList_SetItem(list, 0, PyString_FromString(overlay)); PyObject *obj = PyObject_CallMethod(l->object, "get_info", "(O)", list); Py_DECREF(list); @@ -136,7 +181,7 @@ OverlayInfo *laymanAPIGetInfo(LaymanAPI* l, const char* overlay) OverlayInfo *oi = malloc(sizeof(OverlayInfo)); - char* tmp = PyBytes_AsString(text); + char* tmp = PyString_AsString(text); oi->text = malloc((strlen(tmp) + 1) * sizeof(char)); strcpy(oi->text, tmp); diff --git a/src/laymanapi.h b/src/laymanapi.h index 0a38169..43f99e2 100644 --- a/src/laymanapi.h +++ b/src/laymanapi.h @@ -6,31 +6,21 @@ typedef struct LaymanAPI LaymanAPI; -typedef enum OverlayType {Svn = 0, Git, Bzr} OverlayType; -typedef enum OverlayQuality {Experimental = 0, Stable, Testing} OverlayQuality; typedef struct OverlayInfo { + char *name; char *text; - /*char *name; - char *source; - char *contact; - OverlayType type; - int priority; - OverlayQuality quality; - char *description; - char *link; - char *feed;*/ int official; int supported; } OverlayInfo; - LaymanAPI* laymanAPICreate(BareConfig*, int, int); StringList* laymanAPIGetAvailable(LaymanAPI*, int reload); StringList* laymanAPIGetInstalled(LaymanAPI*, int reload); int laymanAPISync(LaymanAPI* l, const char* overlay, int verbose); int laymanAPIFetchRemoteList(LaymanAPI*); -OverlayInfo *laymanAPIGetInfo(LaymanAPI* l, const char* overlay); +int laymanAPIGetInfoList(LaymanAPI* l, StringList* overlays, OverlayInfo* results); +OverlayInfo* laymanAPIGetInfo(LaymanAPI* l, const char* overlay); void laymanAPIFree(LaymanAPI*); #endif diff --git a/src/stringlist.c b/src/stringlist.c index 7944564..96762a1 100644 --- a/src/stringlist.c +++ b/src/stringlist.c @@ -68,7 +68,7 @@ PyObject* cListToPyList(StringList* list) PyObject *ret = PyList_New(list->count); for(unsigned int i = 0; i < list->count; i++) { - PyList_Append(ret, PyBytes_FromString(list->list[i])); + PyList_SetItem(ret, i, PyBytes_FromString(list->list[i])); } return ret; diff --git a/src/tester.c b/src/tester.c index 1d31407..61497a7 100644 --- a/src/tester.c +++ b/src/tester.c @@ -36,19 +36,20 @@ int main(int argc, char *argv[]) printf("\n"); unsigned int len = stringListCount(strs); - for (unsigned int i = 0; i < len; i++) + OverlayInfo *infos = malloc(sizeof(OverlayInfo) * len); + int count = laymanAPIGetInfoList(l, strs, infos); + + for (unsigned int i = 0; i < count; i++) { - OverlayInfo *info = laymanAPIGetInfo(l, stringListGetAt(strs, i)); - if (!info) - continue; - printf("%s\n", info->text); - free(info->text); - free(info); + printf("%s\n", infos[i].text); + free(infos[i].text); + free(infos[i].name); } printf("\n"); -finish: + free(infos); + bareConfigFree(cfg); laymanAPIFree(l); stringListFree(strs); -- cgit v1.2.3-1-g7c22