Mercurial > hg > toybox
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 (;;) {