summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 5bd193e)
raw | patch | inline | side by side (parent: 5bd193e)
author | Sebastian Harl <sh@tokkee.org> | |
Sun, 6 Apr 2014 17:17:51 +0000 (19:17 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Sun, 6 Apr 2014 17:17:51 +0000 (19:17 +0200) |
This creates a matcher objects which matches the inverse (logical NOT) of the
specified matcher.
specified matcher.
src/core/store-private.h | patch | blob | history | |
src/core/store_lookup.c | patch | blob | history | |
src/include/core/store.h | patch | blob | history | |
t/core/store_lookup_test.c | patch | blob | history |
index 22f6e07c43259671664053e3f88647f4a666c846..823cd18feea6731da32660130149df1d24588df5 100644 (file)
--- a/src/core/store-private.h
+++ b/src/core/store-private.h
enum {
MATCHER_OR,
MATCHER_AND,
+ MATCHER_NOT,
MATCHER_ATTR,
MATCHER_SERVICE,
MATCHER_HOST,
};
#define M(m) ((sdb_store_matcher_t *)(m))
-/* logical operator matcher */
+/* logical infix operator matcher */
typedef struct {
sdb_store_matcher_t super;
} op_matcher_t;
#define OP_M(m) ((op_matcher_t *)(m))
+/* logical unary operator matcher */
+typedef struct {
+ sdb_store_matcher_t super;
+
+ /* operand */
+ sdb_store_matcher_t *op;
+} uop_matcher_t;
+#define UOP_M(m) ((uop_matcher_t *)(m))
+
/* match any type of object by it's base information */
typedef struct {
sdb_store_matcher_t super;
index b73068486cf69811a85d7487b27ad7f41f741c5a..d43b9e32c764c10e0a372dabd71a79d3d30668f2 100644 (file)
--- a/src/core/store_lookup.c
+++ b/src/core/store_lookup.c
static int
match_logical(sdb_store_matcher_t *m, sdb_store_base_t *obj);
static int
+match_unary(sdb_store_matcher_t *m, sdb_store_base_t *obj);
+static int
match_obj(sdb_store_matcher_t *m, sdb_store_base_t *obj);
/* specific matchers */
static matcher_cb matchers[] = {
match_logical,
match_logical,
+ match_unary,
match_obj,
match_obj,
match_obj,
return sdb_store_matcher_matches(OP_M(m)->right, obj);
} /* match_logical */
+static int
+match_unary(sdb_store_matcher_t *m, sdb_store_base_t *obj)
+{
+ assert(m && obj);
+ assert(UOP_M(m)->op);
+
+ return !sdb_store_matcher_matches(UOP_M(m)->op, obj);
+} /* match_unary */
+
static int
match_obj(sdb_store_matcher_t *m, sdb_store_base_t *obj)
{
sdb_object_deref(SDB_OBJ(OP_M(obj)->right));
} /* op_matcher_destroy */
+static int
+uop_matcher_init(sdb_object_t *obj, va_list ap)
+{
+ M(obj)->type = va_arg(ap, int);
+ if (M(obj)->type != MATCHER_NOT)
+ return -1;
+
+ UOP_M(obj)->op = va_arg(ap, sdb_store_matcher_t *);
+ sdb_object_ref(SDB_OBJ(UOP_M(obj)->op));
+
+ if (! UOP_M(obj)->op)
+ return -1;
+ return 0;
+} /* uop_matcher_init */
+
+static void
+uop_matcher_destroy(sdb_object_t *obj)
+{
+ if (UOP_M(obj)->op)
+ sdb_object_deref(SDB_OBJ(UOP_M(obj)->op));
+} /* uop_matcher_destroy */
+
static sdb_type_t attr_type = {
/* size = */ sizeof(attr_matcher_t),
/* init = */ attr_matcher_init,
/* destroy = */ op_matcher_destroy,
};
+static sdb_type_t uop_type = {
+ /* size = */ sizeof(uop_matcher_t),
+ /* init = */ uop_matcher_init,
+ /* destroy = */ uop_matcher_destroy,
+};
+
/*
* public API
*/
left, right));
} /* sdb_store_con_matcher */
+sdb_store_matcher_t *
+sdb_store_inv_matcher(sdb_store_matcher_t *m)
+{
+ return M(sdb_object_create("inv-matcher", uop_type, MATCHER_NOT, m));
+} /* sdb_store_inv_matcher */
+
int
sdb_store_matcher_matches(sdb_store_matcher_t *m, sdb_store_base_t *obj)
{
index 9f232758b6e1a99b337c959b4174206fbb1080ed..cde6ad0b8c2763dd15b4759b27f005b87441db5a 100644 (file)
--- a/src/include/core/store.h
+++ b/src/include/core/store.h
sdb_store_matcher_t *
sdb_store_con_matcher(sdb_store_matcher_t *left, sdb_store_matcher_t *right);
+/*
+ * sdb_store_con_matcher::
+ * Creates a matcher matching the inverse (logical NOT) of a matcher.
+ */
+sdb_store_matcher_t *
+sdb_store_inv_matcher(sdb_store_matcher_t *m);
+
/*
* sdb_store_matcher_matches:
* Check whether the specified matcher matches the specified store object.
index 15a67b10a7809ac5f92d4a534a99f3600fd1cf65..977bd9568d3203aab6a27f6c7354403494eee72b 100644 (file)
"sdb_store_get_host(a) = NULL; expected: <host>");
for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
- sdb_store_matcher_t *h, *s, *a;
+ sdb_store_matcher_t *h, *s, *a, *n;
int status;
s = sdb_store_service_matcher(golden_data[i].service_name,
golden_data[i].attr_value, golden_data[i].attr_value_re,
status, golden_data[i].expected);
+ n = sdb_store_inv_matcher(h);
+ fail_unless(n != NULL,
+ "sdb_store_inv_matcher() = NULL; expected: <matcher>");
sdb_object_deref(SDB_OBJ(h));
+
+ /* now match the inverted set of objects */
+ status = sdb_store_matcher_matches(n, obj);
+ fail_unless(status == !golden_data[i].expected,
+ "sdb_store_matcher_matches(NOT{{%s, %s},{%s, %s},"
+ "{%s, %s, %s, %s}}, <host a>) = %d; expected: %d",
+ golden_data[i].hostname, golden_data[i].hostname_re,
+ golden_data[i].service_name, golden_data[i].service_name_re,
+ golden_data[i].attr_name, golden_data[i].attr_name_re,
+ golden_data[i].attr_value, golden_data[i].attr_value_re,
+ status, !golden_data[i].expected);
+
+ sdb_object_deref(SDB_OBJ(n));
}
}
END_TEST