diff options
author | Fabian Groffen <grobian@gentoo.org> | 2021-08-16 15:21:57 +0200 |
---|---|---|
committer | Fabian Groffen <grobian@gentoo.org> | 2021-08-16 15:21:57 +0200 |
commit | 18c65792094cb90b6876940b86a35e21e3da488c (patch) | |
tree | 6a56f3e46ce05fc8e42727a68c91cdaada44c3c3 /libq | |
parent | TODO: update qmerge items (diff) | |
download | portage-utils-18c65792094cb90b6876940b86a35e21e3da488c.tar.gz portage-utils-18c65792094cb90b6876940b86a35e21e3da488c.tar.bz2 portage-utils-18c65792094cb90b6876940b86a35e21e3da488c.zip |
libq/atom: introduce atom_compare_flg
atom_compare_flg allows to give match behaviour flags, such that often
used exceptions can now be handled without having to modify the input
atoms.
atom_compare is now a macro calling atom_compare_flg with
flags=ATOM_COMP_DEFAULT.
Updated all callers that can use this feature.
Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'libq')
-rw-r--r-- | libq/atom.c | 50 | ||||
-rw-r--r-- | libq/atom.h | 10 |
2 files changed, 37 insertions, 23 deletions
diff --git a/libq/atom.c b/libq/atom.c index f4c7c1e8..0959be54 100644 --- a/libq/atom.c +++ b/libq/atom.c @@ -514,7 +514,7 @@ _atom_compare_match(int ret, atom_operator op) * foo-1 <NOT_EQUAL> bar-1 */ atom_equality -atom_compare(const depend_atom *data, const depend_atom *query) +atom_compare_flg(const depend_atom *data, const depend_atom *query, int flags) { atom_operator pfx_op; atom_operator sfx_op; @@ -551,27 +551,32 @@ atom_compare(const depend_atom *data, const depend_atom *query) */ bl_op = query->blocker; if (bl_op == ATOM_BL_ANTISLOT) { - /* ^perl -> match anything with a SLOT */ - if (query->SLOT == NULL && data->SLOT == NULL) - return NOT_EQUAL; - if (query->SLOT != NULL) { - if (query->SUBSLOT == NULL) { - /* ^perl:0 -> match different SLOT */ - if (data->SLOT == NULL || - strcmp(query->SLOT, data->SLOT) == 0) - return NOT_EQUAL; - } else { - /* ^perl:0/5.28 -> match SLOT, but different SUBSLOT */ - if (data->SLOT == NULL || - strcmp(query->SLOT, data->SLOT) != 0) - return NOT_EQUAL; - if (data->SUBSLOT == NULL || - strcmp(query->SUBSLOT, data->SUBSLOT) == 0) - return NOT_EQUAL; + /* just disable/ignore antislot op when SLOT is supposed to be + * ignored */ + if (!(flags & ATOM_COMP_NOSLOT)) { + /* ^perl -> match anything with a SLOT */ + if (query->SLOT == NULL && data->SLOT == NULL) + return NOT_EQUAL; + if (query->SLOT != NULL) { + if (query->SUBSLOT == NULL || flags & ATOM_COMP_NOSUBSLOT) { + /* ^perl:0 -> match different SLOT */ + if (data->SLOT == NULL || + strcmp(query->SLOT, data->SLOT) == 0) + return NOT_EQUAL; + } else { + /* ^perl:0/5.28 -> match SLOT, but different SUBSLOT */ + if (data->SLOT == NULL || + strcmp(query->SLOT, data->SLOT) != 0) + return NOT_EQUAL; + if (!(flags & ATOM_COMP_NOSUBSLOT)) + if (data->SUBSLOT == NULL || + strcmp(query->SUBSLOT, data->SUBSLOT) == 0) + return NOT_EQUAL; + } } } bl_op = ATOM_BL_NONE; /* ease work below */ - } else if (query->SLOT != NULL) { + } else if (query->SLOT != NULL && !(flags & ATOM_COMP_NOSLOT)) { /* check SLOT only when query side has it */ if (data->SLOT == NULL) { if (bl_op == ATOM_BL_NONE) @@ -581,7 +586,7 @@ atom_compare(const depend_atom *data, const depend_atom *query) /* slot has differs */ if (bl_op == ATOM_BL_NONE) return NOT_EQUAL; - } else { + } else if (!(flags & ATOM_COMP_NOSUBSLOT)) { if (query->SUBSLOT != NULL) { if (data->SUBSLOT == NULL) { if (bl_op == ATOM_BL_NONE) @@ -623,7 +628,7 @@ atom_compare(const depend_atom *data, const depend_atom *query) } /* check REPO, if query has it, ignore blocker stuff for this one */ - if (query->REPO != NULL) { + if (query->REPO != NULL && !(flags & ATOM_COMP_NOREPO)) { if (data->REPO == NULL) return NOT_EQUAL; if (strcmp(query->REPO, data->REPO) != 0) @@ -753,8 +758,9 @@ atom_compare(const depend_atom *data, const depend_atom *query) return EQUAL; /* Make sure the -r# is the same. */ - if ((sfx_op == ATOM_OP_STAR && !query->PR_int) || + if ((sfx_op == ATOM_OP_STAR && query->PR_int == 0) || pfx_op == ATOM_OP_PV_EQUAL || + flags & ATOM_COMP_NOREV || data->PR_int == query->PR_int) return _atom_compare_match(EQUAL, pfx_op); else if (data->PR_int < query->PR_int) diff --git a/libq/atom.h b/libq/atom.h index ead91547..8291daf4 100644 --- a/libq/atom.h +++ b/libq/atom.h @@ -96,11 +96,19 @@ typedef enum { OLDER } atom_equality; +/* bitflags to control compare behaviour */ +#define ATOM_COMP_DEFAULT (0<<0) +#define ATOM_COMP_NOREV (1<<0) +#define ATOM_COMP_NOSLOT (1<<1) +#define ATOM_COMP_NOSUBSLOT (1<<2) +#define ATOM_COMP_NOREPO (1<<3) + depend_atom *atom_explode_cat(const char *atom, const char *cat); #define atom_explode(A) atom_explode_cat(A, NULL) depend_atom *atom_clone(depend_atom *atom); void atom_implode(depend_atom *atom); -atom_equality atom_compare(const depend_atom *a1, const depend_atom *a2); +atom_equality atom_compare_flg(const depend_atom *a1, const depend_atom *a2, int flags); +#define atom_compare(A,B) atom_compare_flg(A, B, ATOM_COMP_DEFAULT) atom_equality atom_compare_str(const char * const s1, const char * const s2); char *atom_to_string_r(char *buf, size_t buflen, depend_atom *a); char *atom_format_r(char *buf, size_t buflen, |