From 8330056dc1c68086545b1698ef8d6e4b4f86a861 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Fri, 1 Mar 2013 11:10:43 -0600 Subject: [PATCH] fragment: refactor using pkg_list_t framework --- fragment.c | 89 ++++++++++++++++++++---------------------------------- main.c | 41 ++++++++++++++----------- pkg.c | 65 +++++++++++++++++++++------------------ pkg.h | 25 ++++++++------- 4 files changed, 102 insertions(+), 118 deletions(-) diff --git a/fragment.c b/fragment.c index 7fa16e6..6db4685 100644 --- a/fragment.c +++ b/fragment.c @@ -16,29 +16,8 @@ #include "pkg.h" #include "bsdstubs.h" -pkg_fragment_t * -pkg_fragment_append(pkg_fragment_t *head, pkg_fragment_t *tail) -{ - pkg_fragment_t *node; - - if (head == NULL) - return tail; - - /* skip to end of list */ - PKG_FOREACH_LIST_ENTRY(head, node) - { - if (node->next == NULL) - break; - } - - node->next = tail; - tail->prev = node; - - return head; -} - -pkg_fragment_t * -pkg_fragment_add(pkg_fragment_t *head, const char *string) +void +pkg_fragment_add(pkg_list_t *list, const char *string) { pkg_fragment_t *frag; @@ -55,77 +34,75 @@ pkg_fragment_add(pkg_fragment_t *head, const char *string) frag->data = strdup(string); } - return pkg_fragment_append(head, frag); + pkg_node_insert_tail(&frag->iter, frag, list); } static inline pkg_fragment_t * -pkg_fragment_lookup(pkg_fragment_t *head, pkg_fragment_t *base) +pkg_fragment_lookup(pkg_list_t *list, pkg_fragment_t *base) { - pkg_fragment_t *node; + pkg_node_t *node; - PKG_FOREACH_LIST_ENTRY(head, node) + PKG_FOREACH_LIST_ENTRY(list->head, node) { - if (base->type != node->type) + pkg_fragment_t *frag = node->data; + + if (base->type != frag->type) continue; - if (!strcmp(base->data, node->data)) - return node; + if (!strcmp(base->data, frag->data)) + return frag; } return NULL; } bool -pkg_fragment_exists(pkg_fragment_t *head, pkg_fragment_t *base) +pkg_fragment_exists(pkg_list_t *list, pkg_fragment_t *base) { - return pkg_fragment_lookup(head, base) != NULL; + return pkg_fragment_lookup(list, base) != NULL; } -pkg_fragment_t * -pkg_fragment_copy(pkg_fragment_t *head, pkg_fragment_t *base) +void +pkg_fragment_copy(pkg_list_t *list, pkg_fragment_t *base) { pkg_fragment_t *frag; - if ((frag = pkg_fragment_lookup(head, base)) != NULL) - { - if (head == frag) - head = frag->next; - - pkg_fragment_delete(frag); - } + if ((frag = pkg_fragment_lookup(list, base)) != NULL) + pkg_fragment_delete(list, frag); frag = calloc(sizeof(pkg_fragment_t), 1); frag->type = base->type; frag->data = strdup(base->data); - return pkg_fragment_append(head, frag); + pkg_node_insert_tail(&frag->iter, frag, list); } void -pkg_fragment_delete(pkg_fragment_t *node) +pkg_fragment_delete(pkg_list_t *list, pkg_fragment_t *node) { - if (node->prev != NULL) - node->prev->next = node->next; - - if (node->next != NULL) - node->next->prev = node->prev; + pkg_node_delete(&node->iter, list); free(node->data); free(node); } void -pkg_fragment_free(pkg_fragment_t *head) +pkg_fragment_free(pkg_list_t *list) { - pkg_fragment_t *node, *next; + pkg_node_t *node, *next; - PKG_FOREACH_LIST_ENTRY_SAFE(head, next, node) - pkg_fragment_delete(node); + PKG_FOREACH_LIST_ENTRY_SAFE(list->head, next, node) + { + pkg_fragment_t *frag = node->data; + + free(frag->data); + free(frag); + } } -pkg_fragment_t * -pkg_fragment_parse(pkg_fragment_t *head, pkg_list_t *vars, const char *value) +void +pkg_fragment_parse(pkg_list_t *list, pkg_list_t *vars, const char *value) { int i, argc; char **argv; @@ -134,10 +111,8 @@ pkg_fragment_parse(pkg_fragment_t *head, pkg_list_t *vars, const char *value) pkg_argv_split(repstr, &argc, &argv); for (i = 0; i < argc; i++) - head = pkg_fragment_add(head, argv[i]); + pkg_fragment_add(list, argv[i]); pkg_argv_free(argv); free(repstr); - - return head; } diff --git a/main.c b/main.c index 08b1022..e6e937b 100644 --- a/main.c +++ b/main.c @@ -96,12 +96,14 @@ print_list_entry(const pkg_t *entry) } static void -print_cflags(pkg_fragment_t *list) +print_cflags(pkg_list_t *list) { - pkg_fragment_t *frag; + pkg_node_t *node; - PKG_FOREACH_LIST_ENTRY(list, frag) + PKG_FOREACH_LIST_ENTRY(list->head, node) { + pkg_fragment_t *frag = node->data; + if ((want_flags & PKG_CFLAGS_ONLY_I) == PKG_CFLAGS_ONLY_I && frag->type != 'I') continue; else if ((want_flags & PKG_CFLAGS_ONLY_OTHER) == PKG_CFLAGS_ONLY_OTHER && frag->type == 'I') @@ -112,12 +114,14 @@ print_cflags(pkg_fragment_t *list) } static void -print_libs(pkg_fragment_t *list) +print_libs(pkg_list_t *list) { - pkg_fragment_t *frag; + pkg_node_t *node; - PKG_FOREACH_LIST_ENTRY(list, frag) + PKG_FOREACH_LIST_ENTRY(list->head, node) { + pkg_fragment_t *frag = node->data; + if ((want_flags & PKG_LIBS_ONLY_LDPATH) == PKG_LIBS_ONLY_LDPATH && frag->type != 'L') continue; else if ((want_flags & PKG_LIBS_ONLY_LIBNAME) == PKG_LIBS_ONLY_LIBNAME && frag->type != 'l') @@ -293,19 +297,19 @@ apply_variable(pkg_t *world, void *variable, int maxdepth, unsigned int flags) static bool apply_cflags(pkg_t *world, void *list_head, int maxdepth, unsigned int flags) { - pkg_fragment_t **head = list_head; + pkg_list_t *list = list_head; int eflag; - eflag = pkg_cflags(world, head, maxdepth, flags | PKGF_SEARCH_PRIVATE); + eflag = pkg_cflags(world, list, maxdepth, flags | PKGF_SEARCH_PRIVATE); if (eflag != PKG_ERRF_OK) return false; - if (*head == NULL) + if (list->head == NULL) return true; - print_cflags(*head); + print_cflags(list); - pkg_fragment_free(*head); + pkg_fragment_free(list); return true; } @@ -313,19 +317,20 @@ apply_cflags(pkg_t *world, void *list_head, int maxdepth, unsigned int flags) static bool apply_libs(pkg_t *world, void *list_head, int maxdepth, unsigned int flags) { - pkg_fragment_t **head = list_head; + pkg_list_t *list = list_head; int eflag; - eflag = pkg_libs(world, head, maxdepth, flags); + eflag = pkg_libs(world, list, maxdepth, flags); if (eflag != PKG_ERRF_OK) return false; - if (*head == NULL) + if (list->head == NULL) return true; - print_libs(*head); + print_libs(list); + + pkg_fragment_free(list); - pkg_fragment_free(*head); return true; } @@ -867,7 +872,7 @@ main(int argc, char *argv[]) if ((want_flags & PKG_CFLAGS) == PKG_CFLAGS) { - pkg_fragment_t *frag_list = NULL; + pkg_list_t frag_list = PKG_LIST_INITIALIZER; if (!pkg_queue_apply(&pkgq, apply_cflags, maximum_traverse_depth, global_traverse_flags, &frag_list)) { @@ -878,7 +883,7 @@ main(int argc, char *argv[]) if ((want_flags & PKG_LIBS) == PKG_LIBS) { - pkg_fragment_t *frag_list = NULL; + pkg_list_t frag_list = PKG_LIST_INITIALIZER; if (!pkg_queue_apply(&pkgq, apply_libs, maximum_traverse_depth, global_traverse_flags, &frag_list)) { diff --git a/pkg.c b/pkg.c index 39eaa88..5ed9317 100644 --- a/pkg.c +++ b/pkg.c @@ -206,11 +206,11 @@ pkg_new_from_file(const char *filename, FILE *f, unsigned int flags) else if (!strcasecmp(key, "Version")) pkg->version = pkg_tuple_parse(&pkg->vars, value); else if (!strcasecmp(key, "CFLAGS")) - pkg->cflags = pkg_fragment_parse(pkg->cflags, &pkg->vars, value); + pkg_fragment_parse(&pkg->cflags, &pkg->vars, value); else if (!strcasecmp(key, "LIBS")) - pkg->libs = pkg_fragment_parse(pkg->libs, &pkg->vars, value); + pkg_fragment_parse(&pkg->libs, &pkg->vars, value); else if (!strcasecmp(key, "LIBS.private")) - pkg->libs_private = pkg_fragment_parse(pkg->libs_private, &pkg->vars, value); + pkg_fragment_parse(&pkg->libs_private, &pkg->vars, value); else if (!strcasecmp(key, "Requires")) pkg->requires = pkg_dependency_parse(pkg, value); else if (!strcasecmp(key, "Requires.private")) @@ -253,9 +253,9 @@ pkg_free(pkg_t *pkg) pkg_dependency_free(pkg->requires_private); pkg_dependency_free(pkg->conflicts); - pkg_fragment_free(pkg->cflags); - pkg_fragment_free(pkg->libs); - pkg_fragment_free(pkg->libs_private); + pkg_fragment_free(&pkg->cflags); + pkg_fragment_free(&pkg->libs); + pkg_fragment_free(&pkg->libs_private); pkg_tuple_free(&pkg->vars); @@ -962,25 +962,26 @@ pkg_traverse(pkg_t *root, static void pkg_cflags_collect(pkg_t *pkg, void *data, unsigned int flags) { - pkg_fragment_t **list = data; - pkg_fragment_t *frag; + pkg_list_t *list = data; + pkg_node_t *node; (void) flags; - PKG_FOREACH_LIST_ENTRY(pkg->cflags, frag) - *list = pkg_fragment_copy(*list, frag); + PKG_FOREACH_LIST_ENTRY(pkg->cflags.head, node) + { + pkg_fragment_t *frag = node->data; + + pkg_fragment_copy(list, frag); + } } int -pkg_cflags(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) +pkg_cflags(pkg_t *root, pkg_list_t *list, int maxdepth, unsigned int flags) { int eflag; eflag = pkg_traverse(root, pkg_cflags_collect, list, maxdepth, flags); if (eflag != PKG_ERRF_OK) - { - pkg_fragment_free(*list); - *list = NULL; - } + pkg_fragment_free(list); return eflag; } @@ -988,27 +989,35 @@ pkg_cflags(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) static void pkg_libs_collect(pkg_t *pkg, void *data, unsigned int flags) { - pkg_fragment_t **list = data; - pkg_fragment_t *frag; + pkg_list_t *list = data; + pkg_node_t *node; (void) flags; - PKG_FOREACH_LIST_ENTRY(pkg->libs, frag) - *list = pkg_fragment_copy(*list, frag); + PKG_FOREACH_LIST_ENTRY(pkg->libs.head, node) + { + pkg_fragment_t *frag = node->data; + + pkg_fragment_copy(list, frag); + } } static void pkg_libs_private_collect(pkg_t *pkg, void *data, unsigned int flags) { - pkg_fragment_t **list = data; - pkg_fragment_t *frag; + pkg_list_t *list = data; + pkg_node_t *node; (void) flags; - PKG_FOREACH_LIST_ENTRY(pkg->libs_private, frag) - *list = pkg_fragment_copy(*list, frag); + PKG_FOREACH_LIST_ENTRY(pkg->libs_private.head, node) + { + pkg_fragment_t *frag = node->data; + + pkg_fragment_copy(list, frag); + } } int -pkg_libs(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) +pkg_libs(pkg_t *root, pkg_list_t *list, int maxdepth, unsigned int flags) { int eflag; @@ -1016,8 +1025,7 @@ pkg_libs(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) if (eflag != PKG_ERRF_OK) { - pkg_fragment_free(*list); - *list = NULL; + pkg_fragment_free(list); return eflag; } @@ -1025,10 +1033,7 @@ pkg_libs(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) { eflag = pkg_traverse(root, pkg_libs_private_collect, list, maxdepth, flags); if (eflag != PKG_ERRF_OK) - { - pkg_fragment_free(*list); - *list = NULL; - } + pkg_fragment_free(list); } return eflag; diff --git a/pkg.h b/pkg.h index 1b81f6a..c42254e 100644 --- a/pkg.h +++ b/pkg.h @@ -52,7 +52,7 @@ typedef struct pkg_fragment_ pkg_fragment_t; #define PKG_MAX(a,b) (((a) > (b)) ? (a) : (b)) struct pkg_fragment_ { - struct pkg_fragment_ *prev, *next; + pkg_node_t iter; char type; char *data; @@ -91,9 +91,9 @@ struct pkg_ { char *url; char *pc_filedir; - pkg_fragment_t *libs; - pkg_fragment_t *libs_private; - pkg_fragment_t *cflags; + pkg_list_t libs; + pkg_list_t libs_private; + pkg_list_t cflags; pkg_dependency_t *requires; pkg_dependency_t *requires_private; @@ -141,8 +141,8 @@ unsigned int pkg_verify_graph(pkg_t *root, int depth, unsigned int flags); int pkg_compare_version(const char *a, const char *b); pkg_t *pkg_verify_dependency(pkg_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags); const char *pkg_get_comparator(pkg_dependency_t *pkgdep); -int pkg_cflags(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags); -int pkg_libs(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags); +int pkg_cflags(pkg_t *root, pkg_list_t *list, int maxdepth, unsigned int flags); +int pkg_libs(pkg_t *root, pkg_list_t *list, int maxdepth, unsigned int flags); pkg_comparator_t pkg_comparator_lookup_by_name(const char *name); /* parse.c */ @@ -157,13 +157,12 @@ int pkg_argv_split(const char *src, int *argc, char ***argv); void pkg_argv_free(char **argv); /* fragment.c */ -pkg_fragment_t *pkg_fragment_parse(pkg_fragment_t *head, pkg_list_t *vars, const char *value); -pkg_fragment_t *pkg_fragment_append(pkg_fragment_t *head, pkg_fragment_t *tail); -pkg_fragment_t *pkg_fragment_add(pkg_fragment_t *head, const char *string); -pkg_fragment_t *pkg_fragment_copy(pkg_fragment_t *head, pkg_fragment_t *base); -void pkg_fragment_delete(pkg_fragment_t *node); -bool pkg_fragment_exists(pkg_fragment_t *head, pkg_fragment_t *base); -void pkg_fragment_free(pkg_fragment_t *head); +void pkg_fragment_parse(pkg_list_t *list, pkg_list_t *vars, const char *value); +void pkg_fragment_add(pkg_list_t *list, const char *string); +void pkg_fragment_copy(pkg_list_t *list, pkg_fragment_t *base); +void pkg_fragment_delete(pkg_list_t *list, pkg_fragment_t *node); +bool pkg_fragment_exists(pkg_list_t *head, pkg_fragment_t *base); +void pkg_fragment_free(pkg_list_t *list); /* fileio.c */ char *pkg_fgetline(char *line, size_t size, FILE *stream);