diff --git a/dependency.c b/dependency.c index 5c8beb6..2dbdd65 100644 --- a/dependency.c +++ b/dependency.c @@ -37,7 +37,7 @@ typedef enum { #define DEBUG_PARSE 0 static inline pkg_dependency_t * -pkg_dependency_add(pkg_dependency_t *head, const char *package, size_t package_sz, const char *version, size_t version_sz, pkg_comparator_t compare) +pkg_dependency_add(pkg_list_t *list, const char *package, size_t package_sz, const char *version, size_t version_sz, pkg_comparator_t compare) { pkg_dependency_t *dep; @@ -49,9 +49,7 @@ pkg_dependency_add(pkg_dependency_t *head, const char *package, size_t package_s dep->compare = compare; - dep->prev = head; - if (dep->prev != NULL) - dep->prev->next = dep; + pkg_node_insert_tail(&dep->iter, dep, list); #if DEBUG_PARSE fprintf(error_msgout, "--> %s %d %s\n", dep->package, dep->compare, dep->version); @@ -60,49 +58,35 @@ pkg_dependency_add(pkg_dependency_t *head, const char *package, size_t package_s return dep; } -pkg_dependency_t * -pkg_dependency_append(pkg_dependency_t *head, pkg_dependency_t *tail) +void +pkg_dependency_append(pkg_list_t *list, pkg_dependency_t *tail) { - pkg_dependency_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_node_insert_tail(&tail->iter, tail, list); } void -pkg_dependency_free(pkg_dependency_t *head) +pkg_dependency_free(pkg_list_t *list) { - pkg_dependency_t *node, *next; + pkg_node_t *node, *next; - PKG_FOREACH_LIST_ENTRY_SAFE(head, next, node) + PKG_FOREACH_LIST_ENTRY_SAFE(list->head, next, node) { - if (node->package != NULL) - free(node->package); + pkg_dependency_t *dep = node->data; - if (node->version != NULL) - free(node->version); + if (dep->package != NULL) + free(dep->package); - free(node); + if (dep->version != NULL) + free(dep->version); + + free(dep); } } -pkg_dependency_t * -pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) +void +pkg_dependency_parse_str(pkg_list_t *deplist_head, const char *depends) { parse_state_t state = OUTSIDE_MODULE; - pkg_dependency_t *deplist = NULL; pkg_comparator_t compare = PKG_ANY; char cmpname[PKG_BUFSIZE]; char buf[PKG_BUFSIZE]; @@ -170,10 +154,7 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) if (state == OUTSIDE_MODULE) { - deplist = pkg_dependency_add(deplist, package, package_sz, NULL, 0, compare); - - if (deplist_head == NULL) - deplist_head = deplist; + pkg_dependency_add(deplist_head, package, package_sz, NULL, 0, compare); compare = PKG_ANY; package_sz = 0; @@ -224,10 +205,7 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) #if DEBUG_PARSE fprintf(error_msgout, "Found version: %s\n", version); #endif - deplist = pkg_dependency_add(deplist, package, package_sz, version, version_sz, compare); - - if (deplist_head == NULL) - deplist_head = deplist; + pkg_dependency_add(deplist_head, package, package_sz, version, version_sz, compare); compare = PKG_ANY; package_sz = 0; @@ -241,18 +219,13 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) ptr++; } - - return deplist_head; } -pkg_dependency_t * -pkg_dependency_parse(pkg_t *pkg, const char *depends) +void +pkg_dependency_parse(pkg_t *pkg, pkg_list_t *deplist, const char *depends) { - pkg_dependency_t *list = NULL; char *kvdepends = pkg_tuple_parse(&pkg->vars, depends); - list = pkg_dependency_parse_str(list, kvdepends); + pkg_dependency_parse_str(deplist, kvdepends); free(kvdepends); - - return list; } diff --git a/main.c b/main.c index e6e937b..7f50708 100644 --- a/main.c +++ b/main.c @@ -161,14 +161,16 @@ print_variables(pkg_t *pkg, void *unused, unsigned int flags) static void print_requires(pkg_t *pkg) { - pkg_dependency_t *node; + pkg_node_t *node; - PKG_FOREACH_LIST_ENTRY(pkg->requires, node) + PKG_FOREACH_LIST_ENTRY(pkg->requires.head, node) { - printf("%s", node->package); + pkg_dependency_t *dep = node->data; - if (node->version != NULL) - printf(" %s %s", pkg_get_comparator(node), node->version); + printf("%s", dep->package); + + if (dep->version != NULL) + printf(" %s %s", pkg_get_comparator(dep), dep->version); printf("\n"); } @@ -177,14 +179,16 @@ print_requires(pkg_t *pkg) static void print_requires_private(pkg_t *pkg) { - pkg_dependency_t *node; + pkg_node_t *node; - PKG_FOREACH_LIST_ENTRY(pkg->requires_private, node) + PKG_FOREACH_LIST_ENTRY(pkg->requires_private.head, node) { - printf("%s", node->package); + pkg_dependency_t *dep = node->data; - if (node->version != NULL) - printf(" %s %s", pkg_get_comparator(node), node->version); + printf("%s", dep->package); + + if (dep->version != NULL) + printf(" %s %s", pkg_get_comparator(dep), dep->version); printf("\n"); } @@ -193,15 +197,17 @@ print_requires_private(pkg_t *pkg) static void print_digraph_node(pkg_t *pkg, void *unused, unsigned int flags) { - pkg_dependency_t *node; + pkg_node_t *node; (void) unused; (void) flags; printf("\"%s\" [fontname=Sans fontsize=8]\n", pkg->id); - PKG_FOREACH_LIST_ENTRY(pkg->requires, node) + PKG_FOREACH_LIST_ENTRY(pkg->requires.head, node) { - printf("\"%s\" -- \"%s\" [fontname=Sans fontsize=8]\n", node->package, pkg->id); + pkg_dependency_t *dep = node->data; + + printf("\"%s\" -- \"%s\" [fontname=Sans fontsize=8]\n", dep->package, pkg->id); } } @@ -337,34 +343,37 @@ apply_libs(pkg_t *world, void *list_head, int maxdepth, unsigned int flags) static bool apply_requires(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { - pkg_dependency_t *iter; + pkg_node_t *iter; (void) unused; (void) maxdepth; - PKG_FOREACH_LIST_ENTRY(world->requires, iter) + PKG_FOREACH_LIST_ENTRY(world->requires.head, iter) { pkg_t *pkg; + pkg_dependency_t *dep = iter->data; - pkg = pkg_verify_dependency(iter, flags, NULL); + pkg = pkg_verify_dependency(dep, flags, NULL); print_requires(pkg); pkg_free(pkg); } + return true; } static bool apply_requires_private(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { - pkg_dependency_t *iter; + pkg_node_t *iter; (void) unused; (void) maxdepth; - PKG_FOREACH_LIST_ENTRY(world->requires, iter) + PKG_FOREACH_LIST_ENTRY(world->requires.head, iter) { pkg_t *pkg; + pkg_dependency_t *dep = iter->data; - pkg = pkg_verify_dependency(iter, flags | PKGF_SEARCH_PRIVATE, NULL); + pkg = pkg_verify_dependency(dep, flags | PKGF_SEARCH_PRIVATE, NULL); print_requires_private(pkg); pkg_free(pkg); @@ -671,16 +680,19 @@ main(int argc, char *argv[]) if (required_module_version != NULL) { pkg_t *pkg; - pkg_dependency_t *pkghead = NULL, *pkgiter = NULL; + pkg_node_t *node; + pkg_list_t deplist = PKG_LIST_INITIALIZER; while (argv[pkg_optind]) { - pkghead = pkg_dependency_parse_str(pkghead, argv[pkg_optind]); + pkg_dependency_parse_str(&deplist, argv[pkg_optind]); pkg_optind++; } - PKG_FOREACH_LIST_ENTRY(pkghead, pkgiter) + PKG_FOREACH_LIST_ENTRY(deplist.head, node) { + pkg_dependency_t *pkgiter = node->data; + pkg = pkg_find(pkgiter->package, global_traverse_flags); if (pkg == NULL) return EXIT_FAILURE; @@ -695,16 +707,19 @@ main(int argc, char *argv[]) if (required_exact_module_version != NULL) { pkg_t *pkg; - pkg_dependency_t *pkghead = NULL, *pkgiter = NULL; + pkg_node_t *node; + pkg_list_t deplist = PKG_LIST_INITIALIZER; while (argv[pkg_optind]) { - pkghead = pkg_dependency_parse_str(pkghead, argv[pkg_optind]); + pkg_dependency_parse_str(&deplist, argv[pkg_optind]); pkg_optind++; } - PKG_FOREACH_LIST_ENTRY(pkghead, pkgiter) + PKG_FOREACH_LIST_ENTRY(deplist.head, node) { + pkg_dependency_t *pkgiter = node->data; + pkg = pkg_find(pkgiter->package, global_traverse_flags); if (pkg == NULL) return EXIT_FAILURE; @@ -719,16 +734,19 @@ main(int argc, char *argv[]) if (required_max_module_version != NULL) { pkg_t *pkg; - pkg_dependency_t *pkghead = NULL, *pkgiter = NULL; + pkg_node_t *node; + pkg_list_t deplist = PKG_LIST_INITIALIZER; while (argv[pkg_optind]) { - pkghead = pkg_dependency_parse_str(pkghead, argv[pkg_optind]); + pkg_dependency_parse_str(&deplist, argv[pkg_optind]); pkg_optind++; } - PKG_FOREACH_LIST_ENTRY(pkghead, pkgiter) + PKG_FOREACH_LIST_ENTRY(deplist.head, node) { + pkg_dependency_t *pkgiter = node->data; + pkg = pkg_find(pkgiter->package, global_traverse_flags); if (pkg == NULL) return EXIT_FAILURE; diff --git a/pkg.c b/pkg.c index 5ed9317..227959f 100644 --- a/pkg.c +++ b/pkg.c @@ -212,11 +212,11 @@ pkg_new_from_file(const char *filename, FILE *f, unsigned int flags) else if (!strcasecmp(key, "LIBS.private")) pkg_fragment_parse(&pkg->libs_private, &pkg->vars, value); else if (!strcasecmp(key, "Requires")) - pkg->requires = pkg_dependency_parse(pkg, value); + pkg_dependency_parse(pkg, &pkg->requires, value); else if (!strcasecmp(key, "Requires.private")) - pkg->requires_private = pkg_dependency_parse(pkg, value); + pkg_dependency_parse(pkg, &pkg->requires_private, value); else if (!strcasecmp(key, "Conflicts")) - pkg->conflicts = pkg_dependency_parse(pkg, value); + pkg_dependency_parse(pkg, &pkg->conflicts, value); break; case '=': if (!(flags & PKGF_MUNGE_SYSROOT_PREFIX) || strcasecmp(key, "prefix")) @@ -249,9 +249,9 @@ pkg_free(pkg_t *pkg) pkg_cache_remove(pkg); - pkg_dependency_free(pkg->requires); - pkg_dependency_free(pkg->requires_private); - pkg_dependency_free(pkg->conflicts); + pkg_dependency_free(&pkg->requires); + pkg_dependency_free(&pkg->requires_private); + pkg_dependency_free(&pkg->conflicts); pkg_fragment_free(&pkg->cflags); pkg_fragment_free(&pkg->libs); @@ -837,25 +837,26 @@ pkg_report_graph_error(pkg_t *pkg, pkg_dependency_t *node, unsigned int eflags) } static inline unsigned int -pkg_walk_list(pkg_dependency_t *deplist, +pkg_walk_list(pkg_list_t *deplist, pkg_traverse_func_t func, void *data, int depth, unsigned int flags) { unsigned int eflags = PKG_ERRF_OK; - pkg_dependency_t *node; + pkg_node_t *node; - PKG_FOREACH_LIST_ENTRY(deplist, node) + PKG_FOREACH_LIST_ENTRY(deplist->head, node) { + pkg_dependency_t *depnode = node->data; pkg_t *pkgdep; - if (*node->package == '\0') + if (*depnode->package == '\0') continue; - pkgdep = pkg_verify_dependency(node, flags, &eflags); + pkgdep = pkg_verify_dependency(depnode, flags, &eflags); if (eflags != PKG_ERRF_OK) - return pkg_report_graph_error(pkgdep, node, eflags); + return pkg_report_graph_error(pkgdep, depnode, eflags); if (pkgdep->flags & PKG_PROPF_SEEN) { pkg_unref(pkgdep); @@ -876,29 +877,32 @@ pkg_walk_list(pkg_dependency_t *deplist, } static inline unsigned int -pkg_walk_conflicts_list(pkg_t *root, pkg_dependency_t *deplist, unsigned int flags) +pkg_walk_conflicts_list(pkg_t *root, pkg_list_t *deplist, unsigned int flags) { unsigned int eflags; - pkg_dependency_t *node, *depnode; + pkg_node_t *node, *childnode; - PKG_FOREACH_LIST_ENTRY(deplist, node) + PKG_FOREACH_LIST_ENTRY(deplist->head, node) { - if (*node->package == '\0') + pkg_dependency_t *parentnode = node->data; + + if (*parentnode->package == '\0') continue; - PKG_FOREACH_LIST_ENTRY(root->requires, depnode) + PKG_FOREACH_LIST_ENTRY(root->requires.head, childnode) { pkg_t *pkgdep; + pkg_dependency_t *depnode = childnode->data; - if (*depnode->package == '\0' || strcmp(depnode->package, node->package)) + if (*depnode->package == '\0' || strcmp(depnode->package, parentnode->package)) continue; - pkgdep = pkg_verify_dependency(node, flags, &eflags); + pkgdep = pkg_verify_dependency(parentnode, flags, &eflags); if (eflags == PKG_ERRF_OK) { fprintf(error_msgout, "Version '%s' of '%s' conflicts with '%s' due to satisfying conflict rule '%s %s%s%s'.\n", - pkgdep->version, pkgdep->realname, root->realname, node->package, pkg_get_comparator(node), - node->version != NULL ? " " : "", node->version != NULL ? node->version : ""); + pkgdep->version, pkgdep->realname, root->realname, parentnode->package, pkg_get_comparator(parentnode), + parentnode->version != NULL ? " " : "", parentnode->version != NULL ? parentnode->version : ""); fprintf(error_msgout, "It may be possible to ignore this conflict and continue, try the\n"); fprintf(error_msgout, "PKG_CONFIG_IGNORE_CONFLICTS environment variable.\n"); @@ -940,18 +944,18 @@ pkg_traverse(pkg_t *root, if (!(flags & PKGF_SKIP_CONFLICTS)) { - eflags = pkg_walk_conflicts_list(root, root->conflicts, rflags); + eflags = pkg_walk_conflicts_list(root, &root->conflicts, rflags); if (eflags != PKG_ERRF_OK) return eflags; } - eflags = pkg_walk_list(root->requires, func, data, maxdepth, rflags); + eflags = pkg_walk_list(&root->requires, func, data, maxdepth, rflags); if (eflags != PKG_ERRF_OK) return eflags; if (flags & PKGF_SEARCH_PRIVATE) { - eflags = pkg_walk_list(root->requires_private, func, data, maxdepth, rflags); + eflags = pkg_walk_list(&root->requires_private, func, data, maxdepth, rflags); if (eflags != PKG_ERRF_OK) return eflags; } diff --git a/pkg.h b/pkg.h index c42254e..098ab0a 100644 --- a/pkg.h +++ b/pkg.h @@ -59,7 +59,7 @@ struct pkg_fragment_ { }; struct pkg_dependency_ { - struct pkg_dependency_ *prev, *next; + pkg_node_t iter; char *package; pkg_comparator_t compare; @@ -95,9 +95,9 @@ struct pkg_ { pkg_list_t libs_private; pkg_list_t cflags; - pkg_dependency_t *requires; - pkg_dependency_t *requires_private; - pkg_dependency_t *conflicts; + pkg_list_t requires; + pkg_list_t requires_private; + pkg_list_t conflicts; pkg_list_t vars; @@ -147,10 +147,10 @@ pkg_comparator_t pkg_comparator_lookup_by_name(const char *name); /* parse.c */ pkg_t *pkg_new_from_file(const char *path, FILE *f, unsigned int flags); -pkg_dependency_t *pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends); -pkg_dependency_t *pkg_dependency_parse(pkg_t *pkg, const char *depends); -pkg_dependency_t *pkg_dependency_append(pkg_dependency_t *head, pkg_dependency_t *tail); -void pkg_dependency_free(pkg_dependency_t *head); +void pkg_dependency_parse_str(pkg_list_t *deplist_head, const char *depends); +void pkg_dependency_parse(pkg_t *pkg, pkg_list_t *deplist_head, const char *depends); +void pkg_dependency_append(pkg_list_t *list, pkg_dependency_t *tail); +void pkg_dependency_free(pkg_list_t *list); /* argvsplit.c */ int pkg_argv_split(const char *src, int *argc, char ***argv); diff --git a/queue.c b/queue.c index 655c918..c544ba9 100644 --- a/queue.c +++ b/queue.c @@ -38,18 +38,12 @@ pkg_queue_compile(pkg_t *world, pkg_list_t *list) PKG_FOREACH_LIST_ENTRY(list->head, iter) { pkg_queue_t *pkgq; - pkg_dependency_t *pkgdep; pkgq = iter->data; - pkgdep = pkg_dependency_parse(world, pkgq->package); - - if (pkgdep != NULL) - world->requires = pkg_dependency_append(world->requires, pkgdep); - else - return false; + pkg_dependency_parse(world, &world->requires, pkgq->package); } - return true; + return (world->requires.head != NULL); } void