From 1dff773eb2466eb2d17b3df6c4c8093788a5aa2f Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Wed, 8 Jun 2016 16:47:45 +0200
Subject: [PATCH] add 'and' filter operation

---
 common/utils/T/tracer/filter/filter.c | 26 +++++++++++++++++++++-----
 common/utils/T/tracer/filter/filter.h |  1 +
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/common/utils/T/tracer/filter/filter.c b/common/utils/T/tracer/filter/filter.c
index 9c1e96a611..b09b01259d 100644
--- a/common/utils/T/tracer/filter/filter.c
+++ b/common/utils/T/tracer/filter/filter.c
@@ -7,7 +7,7 @@
 
 struct filter {
   union {
-    struct { struct filter *a, *b; } eq;
+    struct { struct filter *a, *b; } op2;
     int v;
     struct { int event_type; int arg_index; } evarg;
   } v;
@@ -19,10 +19,16 @@ struct filter {
 /*                     evaluation functions                                 */
 /****************************************************************************/
 
+int eval_and(struct filter *f, event e)
+{
+  if (f->v.op2.a->eval(f->v.op2.a, e) == 0) return 0;
+  return f->v.op2.b->eval(f->v.op2.b, e);
+}
+
 int eval_eq(struct filter *f, event e)
 {
-  int a = f->v.eq.a->eval(f->v.eq.a, e);
-  int b = f->v.eq.b->eval(f->v.eq.b, e);
+  int a = f->v.op2.a->eval(f->v.op2.a, e);
+  int b = f->v.op2.b->eval(f->v.op2.b, e);
   return a == b;
 }
 
@@ -49,13 +55,23 @@ int eval_evarg(struct filter *f, event e)
 /*                     filter construction functions                        */
 /****************************************************************************/
 
+filter *filter_and(filter *a, filter *b)
+{
+  struct filter *ret = calloc(1, sizeof(struct filter));
+  if (ret == NULL) abort();
+  ret->eval = eval_and;
+  ret->v.op2.a = a;
+  ret->v.op2.b = b;
+  return ret;
+}
+
 filter *filter_eq(filter *a, filter *b)
 {
   struct filter *ret = calloc(1, sizeof(struct filter));
   if (ret == NULL) abort();
   ret->eval = eval_eq;
-  ret->v.eq.a = a;
-  ret->v.eq.b = b;
+  ret->v.op2.a = a;
+  ret->v.op2.b = b;
   return ret;
 }
 
diff --git a/common/utils/T/tracer/filter/filter.h b/common/utils/T/tracer/filter/filter.h
index b47b755dbc..eba02d7fb7 100644
--- a/common/utils/T/tracer/filter/filter.h
+++ b/common/utils/T/tracer/filter/filter.h
@@ -5,6 +5,7 @@
 
 typedef void filter;
 
+filter *filter_and(filter *a, filter *b);
 filter *filter_eq(filter *a, filter *b);
 filter *filter_int(int v);
 filter *filter_evarg(void *database, char *event_name, char *varname);
-- 
GitLab