]> Raphaƫl G. Git Repositories - carabistouilles/blobdiff - analyse.c
Add tree freeing to avoid valgrind lightning storm
[carabistouilles] / analyse.c
index 1adcdd980569f72940c60c473a46c7373c148571..08b8e03790fcfcc22c83ab965e7b9f2ef1a882a8 100644 (file)
--- a/analyse.c
+++ b/analyse.c
@@ -50,9 +50,12 @@ struct leaf {
        unsigned count;
 };
 
-/* Lookup leaf prototype */
+/* Lookup leaf function prototype */
 struct leaf *lookupLeaf(void **, const char *, unsigned);
 
+/* Freeing node function prototype */
+void freeTree(void *, unsigned);
+
 /* Main function */
 int main(int argc, char **argv) {
 
@@ -140,6 +143,9 @@ int main(int argc, char **argv) {
        /* Read until end of file */
        } while (ret != 0);
 
+       /* Free tree */
+       freeTree(tree, 0);
+
        /* Close file */
        if (close(fd) == -1) {
                perror("Close failed");
@@ -153,6 +159,36 @@ int main(int argc, char **argv) {
        exit(EXIT_SUCCESS);
 }
 
+/* Recursive freeing of node function */
+void freeTree(void *base, unsigned index) {
+       void *current = base, *next;
+       if (base != NULL) {
+               /* Branch level */
+               if (index < 8) {
+                       /* Free horizontaly */
+                       do {
+                               /* Free children */
+                               if (((struct branch *)current)->child != NULL) {
+                                       freeTree(((struct branch *)current)->child, index + 1);
+                               }
+                               /* Free current and switch to next */
+                               next = ((struct branch *)current)->next;
+                               free(current);
+                               current = next;
+                       } while (current != NULL);
+               /* Leaf level */
+               } else {
+                       /* Free horizontaly */
+                       do {
+                               /* Free current and switch to next */
+                               next = ((struct leaf *)current)->next;
+                               free(current);
+                               current = next;
+                       } while (current != NULL);
+               }
+       }
+}
+
 /* Recursive lookup and populate tree function */
 struct leaf *lookupLeaf(void **base, const char *key, unsigned index) {
        /* Return leaf */