From: Michael Tremer Date: Sun, 24 Jan 2021 15:15:10 +0000 (+0000) Subject: libpakfire: filelist: Refactor filelist X-Git-Tag: 0.9.28~1285^2~810 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d03fa9a358db58a1f589c5162f0d8eb5a6edf2a4;p=pakfire.git libpakfire: filelist: Refactor filelist The code that was written was not even used and has now been rewritten in order to make it usable and to remove any linked-list stuff from PakfireFile. Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 8732f8584..b2df7feb0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -273,6 +273,7 @@ libpakfire_la_SOURCES = \ src/libpakfire/errno.c \ src/libpakfire/execute.c \ src/libpakfire/file.c \ + src/libpakfire/filelist.c \ src/libpakfire/filter.c \ src/libpakfire/key.c \ src/libpakfire/logging.c \ @@ -299,6 +300,7 @@ pkginclude_HEADERS += \ src/libpakfire/include/pakfire/errno.h \ src/libpakfire/include/pakfire/execute.h \ src/libpakfire/include/pakfire/file.h \ + src/libpakfire/include/pakfire/filelist.h \ src/libpakfire/include/pakfire/filter.h \ src/libpakfire/include/pakfire/i18n.h \ src/libpakfire/include/pakfire/key.h \ diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index 9cc563897..42119a0c1 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -44,6 +44,14 @@ PAKFIRE_EXPORT PakfireFile pakfire_file_create() { return file; } +PAKFIRE_EXPORT PakfireFile pakfire_file_ref(PakfireFile file) { + return file; +} + +PAKFIRE_EXPORT PakfireFile pakfire_file_unref(PakfireFile file) { + return file; +} + PAKFIRE_EXPORT void pakfire_file_free(PakfireFile file) { if (file->name) pakfire_free(file->name); diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index f89e8045c..3afd1c4f0 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -18,59 +18,99 @@ # # #############################################################################*/ +#include +#include + #include #include #include #include struct _PakfireFilelist { - PakfirePackage pkg; + int nrefs; + + PakfireFile* elements; + size_t elements_size; - PakfireFile first; - PakfireFile last; + size_t size; }; -PAKFIRE_EXPORT PakfireFilelist pakfire_filelist_create(PakfirePackage pkg) { - PakfireFilelist list = pakfire_calloc(1, sizeof(*list)); - if (list) { - list->pkg = pkg; +static int pakfire_filelist_grow(PakfireFilelist list, size_t size) { + PakfireFile* elements = reallocarray(list->elements, + list->elements_size + size, sizeof(*list->elements)); + if (!elements) + return -errno; - list->first = NULL; - list->last = NULL; - } + list->elements = elements; + list->elements_size += size; - return list; + return 0; } -PAKFIRE_EXPORT void pakfire_filelist_free(PakfireFilelist list) { - pakfire_filelist_remove_all(); +PAKFIRE_EXPORT int pakfire_filelist_create(PakfireFilelist* list) { + PakfireFilelist l = pakfire_calloc(1, sizeof(*l)); + if (!l) + return -ENOMEM; + + l->nrefs = 1; + + *list = l; + return 0; +} + +static void pakfire_filelist_free(PakfireFilelist list) { + pakfire_filelist_clear(list); pakfire_free(list); } -static void pakfire_filelist_remove_first(PakfireFilelist list) { - if (!list->first) +PAKFIRE_EXPORT PakfireFilelist pakfire_filelist_ref(PakfireFilelist list) { + list->nrefs++; + + return list; +} + +PAKFIRE_EXPORT PakfireFilelist pakfire_filelist_unref(PakfireFilelist list) { + if (--list->nrefs > 0) + return list; + + pakfire_filelist_free(list); + return NULL; +} + +PAKFIRE_EXPORT size_t pakfire_filelist_size(PakfireFilelist list) { + return list->size; +} + +PAKFIRE_EXPORT void pakfire_filelist_clear(PakfireFilelist list) { + if (!list->elements) return; - PakfireFile file = list->first; + for (unsigned int i = 0; i < list->size; i++) + pakfire_file_unref(list->elements[i]); - list->first = file->next; - list->first->prev = NULL; + free(list->elements); + list->elements = NULL; + list->elements_size = 0; - pakfire_file_free(file); + list->size = 0; } -PAKFIRE_EXPORT void pakfire_filelist_remove_all(PakfireFilelist list) { - while (list->first) { - pakfire_filelist_remove_first(list); - } +PAKFIRE_EXPORT PakfireFile pakfire_filelist_get(PakfireFilelist list, size_t index) { + if (index >= list->size) + return NULL; + + return list->elements[index]; } -PAKFIRE_EXPORT void pakfire_filelist_append(PakfireFilelist list, PakfireFile file) { - if (list->first && list->last) { - list->last->next = file; - list->last = file; - } else { - list->first = file; - list->last = file; +PAKFIRE_EXPORT int pakfire_filelist_append(PakfireFilelist list, PakfireFile file) { + // Check if we have any space left + if (list->size >= list->elements_size) { + int r = pakfire_filelist_grow(list, 64); + if (r) + return r; } + + list->elements[list->size++] = pakfire_file_ref(file); + + return 0; } diff --git a/src/libpakfire/include/pakfire/file.h b/src/libpakfire/include/pakfire/file.h index 9d24d84e7..ac813245c 100644 --- a/src/libpakfire/include/pakfire/file.h +++ b/src/libpakfire/include/pakfire/file.h @@ -28,6 +28,10 @@ #include PakfireFile pakfire_file_create(); + +PakfireFile pakfire_file_ref(PakfireFile file); +PakfireFile pakfire_file_unref(PakfireFile file); + void pakfire_file_free(PakfireFile file); void pakfire_file_free_all(PakfireFile file); diff --git a/src/libpakfire/include/pakfire/filelist.h b/src/libpakfire/include/pakfire/filelist.h index e05d573aa..20e176745 100644 --- a/src/libpakfire/include/pakfire/filelist.h +++ b/src/libpakfire/include/pakfire/filelist.h @@ -23,7 +23,15 @@ #include -PakfireFilelist pakfire_filelist_create(PakfirePackage pkg); -void pakfire_filelist_free(PakfireFilelist list); +int pakfire_filelist_create(PakfireFilelist* list); + +PakfireFilelist pakfire_filelist_ref(PakfireFilelist list); +PakfireFilelist pakfire_filelist_unref(PakfireFilelist list); + +size_t pakfire_filelist_size(PakfireFilelist list); +void pakfire_filelist_clear(PakfireFilelist list); + +PakfireFile pakfire_filelist_get(PakfireFilelist list, size_t index); +int pakfire_filelist_append(PakfireFilelist list, PakfireFile file); #endif /* PAKFIRE_FILELIST_H */