forked from ariadne/pkgconf
fragment: refactor using pkg_list_t framework
parent
74e40fd128
commit
8330056dc1
89
fragment.c
89
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;
|
||||
}
|
||||
|
|
41
main.c
41
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))
|
||||
{
|
||||
|
|
65
pkg.c
65
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;
|
||||
|
|
25
pkg.h
25
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);
|
||||
|
|
Loading…
Reference in New Issue