add element destructor to string_list

Tue, 30 Jun 2026 12:00:16 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 30 Jun 2026 12:00:16 +0200
changeset 94
9637e3efb8e7
parent 93
cd3013126129
child 95
8a20001544c1

add element destructor to string_list

src/cline.c file | annotate | diff | comparison | revisions
src/string_list.c file | annotate | diff | comparison | revisions
src/string_list.h file | annotate | diff | comparison | revisions
--- a/src/cline.c	Tue Jun 30 11:55:49 2026 +0200
+++ b/src/cline.c	Tue Jun 30 12:00:16 2026 +0200
@@ -290,14 +290,17 @@
   }
   for (unsigned t = 0 ; t < directories->count ; t++) {
     /* Don't waste memory when only the total sum is needed */
-    string_list_t *output = settings->verbose ? new_string_list_t() : NULL;
+    string_list_t *output = NULL;
+    if (settings->verbose) {
+      output = new_string_list_t();
+      output->free_item = free;
+    }
     scanDirectory((scanner_t){directories->items[t], 0}, settings, output, result);
     total += result->result;
     if (settings->verbose) {
       has_output |= output->count > 0;
       for (int i = 0 ; i < output->count ; i++) {
         printf("%s", output->items[i]);
-        free(output->items[i]);
       }
       destroy_string_list_t(output);
       if (directories->count > 1) {
--- a/src/string_list.c	Tue Jun 30 11:55:49 2026 +0200
+++ b/src/string_list.c	Tue Jun 30 12:00:16 2026 +0200
@@ -28,11 +28,15 @@
 
 #include <assert.h>
 
+static void do_not_free(void* item) {
+}
+
 string_list_t* new_string_list_t() {
   string_list_t* stringList = malloc(sizeof(string_list_t));
   stringList->count = 0;
   stringList->capacity = 32;
   stringList->items = calloc(sizeof(char*), stringList->capacity);
+  stringList->free_item = do_not_free;
 
   return stringList;
 }
@@ -40,6 +44,9 @@
 void destroy_string_list_t(string_list_t* list) {
   if (list) {
     if (list->items) {
+      for (size_t i = 0 ; i < list->count ; i++) {
+        list->free_item(list->items[i]);
+      }
       free(list->items);
     }
     free(list);
--- a/src/string_list.h	Tue Jun 30 11:55:49 2026 +0200
+++ b/src/string_list.h	Tue Jun 30 12:00:16 2026 +0200
@@ -33,6 +33,7 @@
   size_t count;
   size_t capacity;
   char** items;
+  void (*free_item)(void*);
 } string_list_t;
 
 #ifdef _cplusplus

mercurial