]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: filelist: Refactor filelist
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 24 Jan 2021 15:15:10 +0000 (15:15 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 24 Jan 2021 15:15:10 +0000 (15:15 +0000)
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 <michael.tremer@ipfire.org>
Makefile.am
src/libpakfire/file.c
src/libpakfire/filelist.c
src/libpakfire/include/pakfire/file.h
src/libpakfire/include/pakfire/filelist.h

index 8732f8584adba9aa4af9041f0d9be9f5f70800b5..b2df7feb0bf562fe3e24cdb942bf3f602ef044aa 100644 (file)
@@ -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 \
index 9cc56389728ee515f177ca3cffa3fca69bbdcc9e..42119a0c1e7d961c53dd601f2f1bbcba0785327d 100644 (file)
@@ -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);
index f89e8045c6b847a7ea89819df24abc94436759fd..3afd1c4f04b7d508ac0cd8ca0d30d86134949493 100644 (file)
 #                                                                             #
 #############################################################################*/
 
+#include <errno.h>
+#include <stdlib.h>
+
 #include <pakfire/file.h>
 #include <pakfire/filelist.h>
 #include <pakfire/private.h>
 #include <pakfire/util.h>
 
 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;
 }
index 9d24d84e75f59bbe7301222187cf94726d782a7a..ac813245c80a737f672facf2760cc2803cd617a8 100644 (file)
 #include <pakfire/types.h>
 
 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);
 
index e05d573aac02ecd847fbc3bfabaf9e50e146a9a1..20e176745ece4612351b12b8f215e89791b682a8 100644 (file)
 
 #include <pakfire/types.h>
 
-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 */