From 5ea52d4caef2de5cc75e627346e934573b9bc9ca Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Wed, 2 May 2012 21:44:58 +0000 Subject: [PATCH] pkg: add flags option to pkg_traverse() to optionally control what the depgraph traversal code does --- main.c | 12 ++++++------ pkg.c | 56 +++++++++++++++++++++++++++++++++++--------------------- pkg.h | 5 ++++- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/main.c b/main.c index 88bf9e4..370abca 100644 --- a/main.c +++ b/main.c @@ -173,7 +173,7 @@ pkg_queue_walk(pkg_queue_t *head) printf("edge [color=blue len=7.5 fontname=Sans fontsize=8]\n"); printf("node [fontname=Sans fontsize=8]\n"); - pkg_traverse(&world, print_digraph_node, NULL, maximum_traverse_depth); + pkg_traverse(&world, print_digraph_node, NULL, maximum_traverse_depth, PKGF_NONE); printf("}\n"); @@ -186,7 +186,7 @@ pkg_queue_walk(pkg_queue_t *head) want_cflags = 0; want_libs = 0; - pkg_traverse(&world, print_modversion, NULL, 2); + pkg_traverse(&world, print_modversion, NULL, 2, PKGF_NONE); } if (want_variables) @@ -195,7 +195,7 @@ pkg_queue_walk(pkg_queue_t *head) want_cflags = 0; want_libs = 0; - pkg_traverse(&world, print_variables, NULL, 2); + pkg_traverse(&world, print_variables, NULL, 2, PKGF_NONE); } if (want_requires) @@ -218,19 +218,19 @@ pkg_queue_walk(pkg_queue_t *head) if (want_cflags) { wanted_something++; - pkg_traverse(&world, print_cflags, NULL, maximum_traverse_depth); + pkg_traverse(&world, print_cflags, NULL, maximum_traverse_depth, PKGF_NONE); } if (want_libs) { wanted_something++; - pkg_traverse(&world, print_libs, NULL, maximum_traverse_depth); + pkg_traverse(&world, print_libs, NULL, maximum_traverse_depth, PKGF_NONE); } if (want_variable) { wanted_something++; - pkg_traverse(&world, print_variable, NULL, 2); + pkg_traverse(&world, print_variable, NULL, 2, PKGF_NONE); } if (wanted_something) diff --git a/pkg.c b/pkg.c index dd1b917..1e148ed 100644 --- a/pkg.c +++ b/pkg.c @@ -292,7 +292,38 @@ pkg_verify_dependency(pkg_dependency_t *pkgdep) void pkg_verify_graph(pkg_t *root, int depth) { - pkg_traverse(root, NULL, NULL, depth); + pkg_traverse(root, NULL, NULL, depth, PKGF_NONE); +} + +static inline void +pkg_walk_list(pkg_t *parent, + pkg_dependency_t *deplist, + void (*pkg_traverse_func)(pkg_t *package, void *data), + void *data, + int maxdepth, + unsigned int flags) +{ + pkg_dependency_t *node; + + foreach_list_entry(deplist, node) + { + pkg_t *pkgdep; + + if (*node->package == '\0') + continue; + + pkgdep = pkg_verify_dependency(node); + if (pkgdep == NULL) + { + fprintf(stderr, "Package %s was not found in the pkg-config search path.\n", node->package); + fprintf(stderr, "Perhaps you should add the directory containing `%s.pc'\n", node->package); + fprintf(stderr, "to the PKG_CONFIG_PATH environment variable\n"); + fprintf(stderr, "No package '%s' found\n", node->package); + exit(EXIT_FAILURE); + } + + pkg_traverse(pkgdep, pkg_traverse_func, data, maxdepth - 1, flags); + } } /* @@ -304,32 +335,15 @@ void pkg_traverse(pkg_t *root, void (*pkg_traverse_func)(pkg_t *package, void *data), void *data, - int maxdepth) + int maxdepth, + unsigned int flags) { pkg_dependency_t *node; if (maxdepth == 0) return; - foreach_list_entry(root->requires, node) - { - pkg_t *pkgdep; - - if (*node->package == '\0') - continue; - - pkgdep = pkg_verify_dependency(node); - if (pkgdep == NULL) - { - fprintf(stderr, "Package %s was not found in the pkg-config search path.\n", node->package); - fprintf(stderr, "Perhaps you should add the directory containing `%s.pc'\n", node->package); - fprintf(stderr, "to the PKG_CONFIG_PATH environment variable\n"); - fprintf(stderr, "No package '%s' found\n", node->package); - exit(EXIT_FAILURE); - } - - pkg_traverse(pkgdep, pkg_traverse_func, data, maxdepth - 1); - } + pkg_walk_list(root, root->requires, pkg_traverse_func, data, maxdepth - 1, flags); if (pkg_traverse_func != NULL) pkg_traverse_func(root, data); diff --git a/pkg.h b/pkg.h index e951919..d287385 100644 --- a/pkg.h +++ b/pkg.h @@ -99,8 +99,11 @@ struct pkg_ { pkg_tuple_t *vars; }; +#define PKGF_NONE 0x0 +#define PKGF_SEARCH_PRIVATE 0x1 + pkg_t *pkg_find(const char *name); -void pkg_traverse(pkg_t *root, void (*pkg_traverse_func)(pkg_t *package, void *data), void *data, int maxdepth); +void pkg_traverse(pkg_t *root, void (*pkg_traverse_func)(pkg_t *package, void *data), void *data, int maxdepth, unsigned int flags); void pkg_verify_graph(pkg_t *root, int depth); int pkg_compare_version(const char *a, const char *b); pkg_t *pkg_verify_dependency(pkg_dependency_t *pkgdep);