aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/args.c5
-rw-r--r--lib/lib.h2
-rw-r--r--lib/llist.c9
-rw-r--r--toys/df.c2
-rw-r--r--toys/patch.c6
-rw-r--r--toys/tail.c4
-rw-r--r--toys/toysh.c2
-rw-r--r--toys/which.c2
8 files changed, 17 insertions, 15 deletions
diff --git a/lib/args.c b/lib/args.c
index f4ceba1e..e3dcb26e 100644
--- a/lib/args.c
+++ b/lib/args.c
@@ -413,4 +413,9 @@ notflag:
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);
+ }
}
diff --git a/lib/lib.h b/lib/lib.h
index 4c230092..8028737e 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -35,7 +35,7 @@ struct double_list {
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);
diff --git a/lib/llist.c b/lib/llist.c
index 8588721b..4799db1c 100644
--- a/lib/llist.c
+++ b/lib/llist.c
@@ -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;
diff --git a/toys/df.c b/toys/df.c
index cff8584e..72c15195 100644
--- a/toys/df.c
+++ b/toys/df.c
@@ -150,5 +150,5 @@ void df_main(void)
}
}
- if (CFG_TOYBOX_FREE) llist_free(mtlist, NULL);
+ if (CFG_TOYBOX_FREE) llist_traverse(mtlist, free);
}
diff --git a/toys/patch.c b/toys/patch.c
index 95702ae6..647bb18f 100644
--- a/toys/patch.c
+++ b/toys/patch.c
@@ -108,7 +108,7 @@ static void fail_hunk(void)
// 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 @@ static int apply_one_hunk(void)
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;
diff --git a/toys/tail.c b/toys/tail.c
index a029eca9..8783d6ba 100644
--- a/toys/tail.c
+++ b/toys/tail.c
@@ -130,7 +130,7 @@ static int try_lseek(int fd, long bytes, long lines)
}
// 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 @@ static void do_tail(int fd, char *name)
}
// Output/free the buffer.
- llist_free(list, dump_chunk);
+ llist_traverse(list, dump_chunk);
// Measuring from the beginning of the file.
} else for (;;) {
diff --git a/toys/toysh.c b/toys/toysh.c
index 365c47fc..c2f494d3 100644
--- a/toys/toysh.c
+++ b/toys/toysh.c
@@ -342,7 +342,7 @@ static void handle(char *command)
// Run those commands
run_pipeline(&line);
- llist_free(line.cmd, free_cmd);
+ llist_traverse(line.cmd, free_cmd);
}
}
diff --git a/toys/which.c b/toys/which.c
index 0ffc725a..4923859c 100644
--- a/toys/which.c
+++ b/toys/which.c
@@ -53,7 +53,7 @@ static int which_in_path(char *filename)
puts(list->str);
// If we should stop at one match, do so
if (!toys.optflags) {
- llist_free(list, NULL);
+ llist_traverse(list, free);
break;
}
}