aboutsummaryrefslogtreecommitdiff
path: root/libq
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2021-08-16 15:21:57 +0200
committerFabian Groffen <grobian@gentoo.org>2021-08-16 15:21:57 +0200
commit18c65792094cb90b6876940b86a35e21e3da488c (patch)
tree6a56f3e46ce05fc8e42727a68c91cdaada44c3c3 /libq
parentTODO: update qmerge items (diff)
downloadportage-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.c50
-rw-r--r--libq/atom.h10
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,