diff --git a/libpkg/pkg_ports.c b/libpkg/pkg_ports.c index d26e409..65facb6 100644 --- a/libpkg/pkg_ports.c +++ b/libpkg/pkg_ports.c @@ -37,6 +37,7 @@ #include #include #include +#include #include "pkg.h" #include "private/event.h" @@ -44,8 +45,8 @@ struct keyword { const char *keyword; - STAILQ_HEAD(actions, action) actions; - STAILQ_ENTRY(keyword) next; + STAILQ_HEAD(, action) actions; + UT_hash_handle hh; }; struct plist { @@ -67,7 +68,7 @@ struct plist { int64_t flatsize; struct hardlinks *hardlinks; mode_t perm; - STAILQ_HEAD(keywords, keyword) keywords; + struct keyword *keywords; }; struct action { @@ -420,7 +421,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = setprefix; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @ignore */ k = malloc(sizeof(struct keyword)); @@ -429,7 +430,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = ignore_next; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @comment */ k = malloc(sizeof(struct keyword)); @@ -438,7 +439,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = ignore; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @dirrm */ k = malloc(sizeof(struct keyword)); @@ -447,7 +448,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = dirrm; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @dirrmtry */ k = malloc(sizeof(struct keyword)); @@ -456,7 +457,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = dirrmtry; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @mode */ k = malloc(sizeof(struct keyword)); @@ -465,7 +466,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = setmod; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @owner */ k = malloc(sizeof(struct keyword)); @@ -474,7 +475,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = setowner; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @group */ k = malloc(sizeof(struct keyword)); @@ -483,7 +484,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = setgroup; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @exec */ k = malloc(sizeof(struct keyword)); @@ -492,7 +493,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = exec; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); /* @unexec */ k = malloc(sizeof(struct keyword)); @@ -501,7 +502,7 @@ populate_keywords(struct plist *p) STAILQ_INIT(&k->actions); a->perform = unexec; STAILQ_INSERT_TAIL(&k->actions, a, next); - STAILQ_INSERT_TAIL(&p->keywords, k, next); + HASH_ADD_STR(p->keywords, keyword, k); } static void @@ -515,10 +516,13 @@ keyword_free(struct keyword *k) } static void -plist_free(struct plist *plist) +plist_free(struct plist *p) { - struct keyword *k; - LIST_FREE(&plist->keywords, k, keyword_free); + struct keyword *k, *tmp; + HASH_ITER(hh, p->keywords, k, tmp) { + HASH_DEL(p->keywords, k); + keyword_free(k); + } } static int @@ -700,7 +704,6 @@ external_keyword(struct plist *plist, char *keyword, char *line) yaml_parser_delete(&parser); return (ret); - } static int @@ -710,15 +713,14 @@ parse_keywords(struct plist *plist, char *keyword, char *line) struct action *a; int ret = EPKG_FATAL; - STAILQ_FOREACH(k, &plist->keywords, next) { - if (!strcmp(k->keyword, keyword)) { - STAILQ_FOREACH(a, &k->actions, next) { - ret = a->perform(plist, line); - if (ret != EPKG_OK) - return (ret); - } - return (ret); + HASH_FIND_STR(plist->keywords, keyword, k); + if (k != NULL) { + STAILQ_FOREACH(a, &k->actions, next) { + ret = a->perform(plist, line); + if (ret != EPKG_OK) + return (ret); } + return (ret); } /* @@ -772,7 +774,7 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *stage) pplist.ignore_next = false; pplist.hardlinks = &hardlinks; pplist.flatsize = 0; - STAILQ_INIT(&pplist.keywords); + pplist.keywords = NULL; populate_keywords(&pplist);