queue: refactor to use pkg_list_t framework

pull/48/head
William Pitcock 2013-03-01 10:24:57 -06:00
parent b475859cfa
commit ae063d8922
4 changed files with 68 additions and 53 deletions

22
iter.h
View File

@ -51,6 +51,28 @@ pkg_node_insert(pkg_node_t *node, void *data, pkg_list_t *list)
list->head = node; list->head = node;
} }
static inline void
pkg_node_insert_tail(pkg_node_t *node, void *data, pkg_list_t *list)
{
pkg_node_t *tnode;
node->data = data;
if (list->head == NULL)
{
list->head = node;
list->tail = node;
return;
}
tnode = list->tail;
node->prev = tnode;
tnode->next = node;
list->tail = node;
}
static inline void static inline void
pkg_node_delete(pkg_node_t *node, pkg_list_t *list) pkg_node_delete(pkg_node_t *node, pkg_list_t *list)
{ {

40
main.c
View File

@ -487,8 +487,7 @@ int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int ret; int ret;
pkg_queue_t *pkgq = NULL; pkg_list_t pkgq = PKG_LIST_INITIALIZER;
pkg_queue_t *pkgq_head = NULL;
char *builddir; char *builddir;
char *required_pkgconfig_version = NULL; char *required_pkgconfig_version = NULL;
char *required_exact_module_version = NULL; char *required_exact_module_version = NULL;
@ -750,11 +749,7 @@ main(int argc, char *argv[])
if (argv[pkg_optind + 1] == NULL || !PKG_OPERATOR_CHAR(*(argv[pkg_optind + 1]))) if (argv[pkg_optind + 1] == NULL || !PKG_OPERATOR_CHAR(*(argv[pkg_optind + 1])))
{ {
pkgq = pkg_queue_push(pkgq, package); pkg_queue_push(&pkgq, package);
if (pkgq_head == NULL)
pkgq_head = pkgq;
pkg_optind++; pkg_optind++;
} }
else else
@ -764,14 +759,11 @@ main(int argc, char *argv[])
snprintf(packagebuf, sizeof packagebuf, "%s %s %s", package, argv[pkg_optind + 1], argv[pkg_optind + 2]); snprintf(packagebuf, sizeof packagebuf, "%s %s %s", package, argv[pkg_optind + 1], argv[pkg_optind + 2]);
pkg_optind += 3; pkg_optind += 3;
pkgq = pkg_queue_push(pkgq, packagebuf); pkg_queue_push(&pkgq, packagebuf);
if (pkgq_head == NULL)
pkgq_head = pkgq;
} }
} }
if (pkgq_head == NULL) if (pkgq.head == NULL)
{ {
fprintf(stderr, "Please specify at least one package name on the command line.\n"); fprintf(stderr, "Please specify at least one package name on the command line.\n");
return EXIT_FAILURE; return EXIT_FAILURE;
@ -779,7 +771,7 @@ main(int argc, char *argv[])
ret = EXIT_SUCCESS; ret = EXIT_SUCCESS;
if (!pkg_queue_validate(pkgq_head, maximum_traverse_depth, global_traverse_flags)) if (!pkg_queue_validate(&pkgq, maximum_traverse_depth, global_traverse_flags))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -788,7 +780,7 @@ main(int argc, char *argv[])
if ((want_flags & PKG_UNINSTALLED) == PKG_UNINSTALLED) if ((want_flags & PKG_UNINSTALLED) == PKG_UNINSTALLED)
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
pkg_queue_apply(pkgq_head, apply_uninstalled, maximum_traverse_depth, global_traverse_flags, &ret); pkg_queue_apply(&pkgq, apply_uninstalled, maximum_traverse_depth, global_traverse_flags, &ret);
goto out; goto out;
} }
@ -796,7 +788,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_digraph, maximum_traverse_depth, global_traverse_flags, NULL)) if (!pkg_queue_apply(&pkgq, apply_digraph, maximum_traverse_depth, global_traverse_flags, NULL))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -807,7 +799,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_simulate, -1, global_traverse_flags, NULL)) if (!pkg_queue_apply(&pkgq, apply_simulate, -1, global_traverse_flags, NULL))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -818,7 +810,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_modversion, 2, global_traverse_flags, NULL)) if (!pkg_queue_apply(&pkgq, apply_modversion, 2, global_traverse_flags, NULL))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -829,7 +821,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_variables, 2, global_traverse_flags, NULL)) if (!pkg_queue_apply(&pkgq, apply_variables, 2, global_traverse_flags, NULL))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -840,7 +832,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_variable, 2, global_traverse_flags | PKGF_SKIP_ROOT_VIRTUAL, want_variable)) if (!pkg_queue_apply(&pkgq, apply_variable, 2, global_traverse_flags | PKGF_SKIP_ROOT_VIRTUAL, want_variable))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -851,7 +843,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_requires, maximum_traverse_depth, global_traverse_flags, NULL)) if (!pkg_queue_apply(&pkgq, apply_requires, maximum_traverse_depth, global_traverse_flags, NULL))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -862,7 +854,7 @@ main(int argc, char *argv[])
{ {
want_flags &= ~(PKG_CFLAGS|PKG_LIBS); want_flags &= ~(PKG_CFLAGS|PKG_LIBS);
if (!pkg_queue_apply(pkgq_head, apply_requires_private, maximum_traverse_depth, global_traverse_flags, NULL)) if (!pkg_queue_apply(&pkgq, apply_requires_private, maximum_traverse_depth, global_traverse_flags, NULL))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out; goto out;
@ -873,7 +865,7 @@ main(int argc, char *argv[])
{ {
pkg_fragment_t *frag_list = NULL; pkg_fragment_t *frag_list = NULL;
if (!pkg_queue_apply(pkgq_head, apply_cflags, maximum_traverse_depth, global_traverse_flags, &frag_list)) if (!pkg_queue_apply(&pkgq, apply_cflags, maximum_traverse_depth, global_traverse_flags, &frag_list))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out_println; goto out_println;
@ -884,14 +876,14 @@ main(int argc, char *argv[])
{ {
pkg_fragment_t *frag_list = NULL; pkg_fragment_t *frag_list = NULL;
if (!pkg_queue_apply(pkgq_head, apply_libs, maximum_traverse_depth, global_traverse_flags, &frag_list)) if (!pkg_queue_apply(&pkgq, apply_libs, maximum_traverse_depth, global_traverse_flags, &frag_list))
{ {
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
goto out_println; goto out_println;
} }
} }
pkg_queue_free(pkgq_head); pkg_queue_free(&pkgq);
out_println: out_println:
if (want_flags & (PKG_CFLAGS|PKG_LIBS)) if (want_flags & (PKG_CFLAGS|PKG_LIBS))

15
pkg.h
View File

@ -74,11 +74,6 @@ struct pkg_tuple_ {
char *value; char *value;
}; };
typedef struct pkg_queue_ {
struct pkg_queue_ *prev, *next;
char *package;
} pkg_queue_t;
#define PKG_PROPF_NONE 0x0 #define PKG_PROPF_NONE 0x0
#define PKG_PROPF_VIRTUAL 0x1 #define PKG_PROPF_VIRTUAL 0x1
#define PKG_PROPF_CACHED 0x2 #define PKG_PROPF_CACHED 0x2
@ -186,11 +181,11 @@ void pkg_tuple_define_global(const char *kv);
extern FILE *error_msgout; extern FILE *error_msgout;
/* queue.c */ /* queue.c */
pkg_queue_t *pkg_queue_push(pkg_queue_t *parent, const char *package); void pkg_queue_push(pkg_list_t *list, const char *package);
bool pkg_queue_compile(pkg_t *world, pkg_queue_t *head); bool pkg_queue_compile(pkg_t *world, pkg_list_t *list);
void pkg_queue_free(pkg_queue_t *head); void pkg_queue_free(pkg_list_t *list);
bool pkg_queue_apply(pkg_queue_t *head, pkg_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data); bool pkg_queue_apply(pkg_list_t *list, pkg_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data);
bool pkg_queue_validate(pkg_queue_t *head, int maxdepth, unsigned int flags); bool pkg_queue_validate(pkg_list_t *list, int maxdepth, unsigned int flags);
/* cache.c */ /* cache.c */
pkg_t *pkg_cache_lookup(const char *id); pkg_t *pkg_cache_lookup(const char *id);

44
queue.c
View File

@ -16,29 +16,33 @@
#include "pkg.h" #include "pkg.h"
#include "bsdstubs.h" #include "bsdstubs.h"
pkg_queue_t * typedef struct {
pkg_queue_push(pkg_queue_t *parent, const char *package) pkg_node_t iter;
char *package;
} pkg_queue_t;
void
pkg_queue_push(pkg_list_t *list, const char *package)
{ {
pkg_queue_t *pkgq = calloc(sizeof(pkg_queue_t), 1); pkg_queue_t *pkgq = calloc(sizeof(pkg_queue_t), 1);
pkgq->package = strdup(package); pkgq->package = strdup(package);
pkgq->prev = parent; pkg_node_insert_tail(&pkgq->iter, pkgq, list);
if (pkgq->prev != NULL)
pkgq->prev->next = pkgq;
return pkgq;
} }
bool bool
pkg_queue_compile(pkg_t *world, pkg_queue_t *head) pkg_queue_compile(pkg_t *world, pkg_list_t *list)
{ {
pkg_queue_t *pkgq; pkg_node_t *iter;
PKG_FOREACH_LIST_ENTRY(head, pkgq) PKG_FOREACH_LIST_ENTRY(list->head, iter)
{ {
pkg_queue_t *pkgq;
pkg_dependency_t *pkgdep; pkg_dependency_t *pkgdep;
pkgq = iter->data;
pkgdep = pkg_dependency_parse(world, pkgq->package); pkgdep = pkg_dependency_parse(world, pkgq->package);
if (pkgdep != NULL) if (pkgdep != NULL)
world->requires = pkg_dependency_append(world->requires, pkgdep); world->requires = pkg_dependency_append(world->requires, pkgdep);
else else
@ -49,28 +53,30 @@ pkg_queue_compile(pkg_t *world, pkg_queue_t *head)
} }
void void
pkg_queue_free(pkg_queue_t *head) pkg_queue_free(pkg_list_t *list)
{ {
pkg_queue_t *pkgq, *next_pkgq; pkg_node_t *node, *tnode;
PKG_FOREACH_LIST_ENTRY_SAFE(head, next_pkgq, pkgq) PKG_FOREACH_LIST_ENTRY_SAFE(list->head, tnode, node)
{ {
pkg_queue_t *pkgq = node->data;
free(pkgq->package); free(pkgq->package);
free(pkgq); free(pkgq);
} }
} }
static inline unsigned int static inline unsigned int
pkg_queue_verify(pkg_t *world, pkg_queue_t *head, int maxdepth, unsigned int flags) pkg_queue_verify(pkg_t *world, pkg_list_t *list, int maxdepth, unsigned int flags)
{ {
if (!pkg_queue_compile(world, head)) if (!pkg_queue_compile(world, list))
return PKG_ERRF_DEPGRAPH_BREAK; return PKG_ERRF_DEPGRAPH_BREAK;
return pkg_verify_graph(world, maxdepth, flags); return pkg_verify_graph(world, maxdepth, flags);
} }
bool bool
pkg_queue_apply(pkg_queue_t *head, pkg_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data) pkg_queue_apply(pkg_list_t *list, pkg_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data)
{ {
pkg_t world = { pkg_t world = {
.id = "world", .id = "world",
@ -82,7 +88,7 @@ pkg_queue_apply(pkg_queue_t *head, pkg_queue_apply_func_t func, int maxdepth, un
if (!maxdepth) if (!maxdepth)
maxdepth = -1; maxdepth = -1;
if (pkg_queue_verify(&world, head, maxdepth, flags) != PKG_ERRF_OK) if (pkg_queue_verify(&world, list, maxdepth, flags) != PKG_ERRF_OK)
return false; return false;
if (!func(&world, data, maxdepth, flags)) if (!func(&world, data, maxdepth, flags))
@ -97,7 +103,7 @@ pkg_queue_apply(pkg_queue_t *head, pkg_queue_apply_func_t func, int maxdepth, un
} }
bool bool
pkg_queue_validate(pkg_queue_t *head, int maxdepth, unsigned int flags) pkg_queue_validate(pkg_list_t *list, int maxdepth, unsigned int flags)
{ {
bool retval = true; bool retval = true;
pkg_t world = { pkg_t world = {
@ -110,7 +116,7 @@ pkg_queue_validate(pkg_queue_t *head, int maxdepth, unsigned int flags)
if (!maxdepth) if (!maxdepth)
maxdepth = -1; maxdepth = -1;
if (pkg_queue_verify(&world, head, maxdepth, flags) != PKG_ERRF_OK) if (pkg_queue_verify(&world, list, maxdepth, flags) != PKG_ERRF_OK)
retval = false; retval = false;
pkg_free(&world); pkg_free(&world);