changeset 624:1e8b9acdafeb

Genericize llist code a bit: rename llist_free() to llist_traverse(), and no longer accept NULL as a synonym for free.
author Rob Landley <rob@landley.net>
date Sun, 15 Jul 2012 17:22:04 -0500
parents f51beec92738
children 1a368546afd9
files lib/args.c lib/lib.h lib/llist.c toys/df.c toys/patch.c toys/tail.c toys/toysh.c toys/which.c
diffstat 8 files changed, 17 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/lib/args.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/lib/args.c	Sun Jul 15 17:22:04 2012 -0500
@@ -413,4 +413,9 @@
 	if (toys.optc>gof.maxargs)
 		error_exit("Max %d argument%s", gof.maxargs, letters[!(gof.maxargs-1)]);
 	if (CFG_HELP) toys.exithelp = 0;
+
+	if (CFG_TOYBOX_FREE) {
+		llist_traverse(gof.opts, free);
+		llist_traverse(gof.longopts, free);
+	}
 }
--- a/lib/lib.h	Sun Jul 15 16:56:20 2012 -0500
+++ b/lib/lib.h	Sun Jul 15 17:22:04 2012 -0500
@@ -35,7 +35,7 @@
 	char *data;
 };
 
-void llist_free(void *list, void (*freeit)(void *data));
+void llist_traverse(void *list, void (*using)(void *data));
 void *llist_pop(void *list);  // actually void **list, but the compiler's dumb
 void dlist_add_nomalloc(struct double_list **list, struct double_list *new);
 struct double_list *dlist_add(struct double_list **list, char *data);
--- a/lib/llist.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/lib/llist.c	Sun Jul 15 17:22:04 2012 -0500
@@ -6,15 +6,12 @@
 
 #include "toys.h"
 
-// Free all the elements of a linked list
-// if freeit!=NULL call freeit() on each element before freeing it.
-
-void llist_free(void *list, void (*freeit)(void *data))
+// Call a function (such as free()) on each element of a linked list.
+void llist_traverse(void *list, void (*using)(void *data))
 {
 	while (list) {
 		void *pop = llist_pop(&list);
-		if (freeit) freeit(pop);
-		else free(pop);
+		using(pop);
 
 		// End doubly linked list too.
 		if (list==pop) break;
--- a/toys/df.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/toys/df.c	Sun Jul 15 17:22:04 2012 -0500
@@ -150,5 +150,5 @@
 		}
 	}
 
-	if (CFG_TOYBOX_FREE) llist_free(mtlist, NULL);
+	if (CFG_TOYBOX_FREE) llist_traverse(mtlist, free);
 }
--- a/toys/patch.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/toys/patch.c	Sun Jul 15 17:22:04 2012 -0500
@@ -108,7 +108,7 @@
 	// this file and advance to next file.
 
 	TT.state = 2;
-	llist_free(TT.current_hunk, do_line);
+	llist_traverse(TT.current_hunk, do_line);
 	TT.current_hunk = NULL;
 	delete_tempfile(TT.filein, TT.fileout, &TT.tempname);
 	TT.state = 0;
@@ -221,13 +221,13 @@
 out:
 	// We have a match.  Emit changed data.
 	TT.state = "-+"[reverse];
-	llist_free(TT.current_hunk, do_line);
+	llist_traverse(TT.current_hunk, do_line);
 	TT.current_hunk = NULL;
 	TT.state = 1;
 done:
 	if (buf) {
 		buf->prev->next = NULL;
-		llist_free(buf, do_line);
+		llist_traverse(buf, do_line);
 	}
 
 	return TT.state;
--- a/toys/tail.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/toys/tail.c	Sun Jul 15 17:22:04 2012 -0500
@@ -130,7 +130,7 @@
 	}
 
 	// Output stored data
-	llist_free(list, dump_chunk);
+	llist_traverse(list, dump_chunk);
 
 	// In case of -f
 	lseek(fd, bytes, SEEK_SET);
@@ -201,7 +201,7 @@
 		}
 
 		// Output/free the buffer.
-		llist_free(list, dump_chunk);
+		llist_traverse(list, dump_chunk);
 
 	// Measuring from the beginning of the file.
 	} else for (;;) {
--- a/toys/toysh.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/toys/toysh.c	Sun Jul 15 17:22:04 2012 -0500
@@ -342,7 +342,7 @@
 		// Run those commands
 
 		run_pipeline(&line);
-		llist_free(line.cmd, free_cmd);
+		llist_traverse(line.cmd, free_cmd);
 	}
 }
 
--- a/toys/which.c	Sun Jul 15 16:56:20 2012 -0500
+++ b/toys/which.c	Sun Jul 15 17:22:04 2012 -0500
@@ -53,7 +53,7 @@
 			puts(list->str);
 			// If we should stop at one match, do so
 			if (!toys.optflags) {
-				llist_free(list, NULL);
+				llist_traverse(list, free);
 				break;
 			}
 		}