add 'and' filter operation
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
struct filter {
|
struct filter {
|
||||||
union {
|
union {
|
||||||
struct { struct filter *a, *b; } eq;
|
struct { struct filter *a, *b; } op2;
|
||||||
int v;
|
int v;
|
||||||
struct { int event_type; int arg_index; } evarg;
|
struct { int event_type; int arg_index; } evarg;
|
||||||
} v;
|
} v;
|
||||||
@@ -19,10 +19,16 @@ struct filter {
|
|||||||
/* evaluation functions */
|
/* 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 eval_eq(struct filter *f, event e)
|
||||||
{
|
{
|
||||||
int a = f->v.eq.a->eval(f->v.eq.a, e);
|
int a = f->v.op2.a->eval(f->v.op2.a, e);
|
||||||
int b = f->v.eq.b->eval(f->v.eq.b, e);
|
int b = f->v.op2.b->eval(f->v.op2.b, e);
|
||||||
return a == b;
|
return a == b;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,13 +55,23 @@ int eval_evarg(struct filter *f, event e)
|
|||||||
/* filter construction functions */
|
/* 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)
|
filter *filter_eq(filter *a, filter *b)
|
||||||
{
|
{
|
||||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||||
if (ret == NULL) abort();
|
if (ret == NULL) abort();
|
||||||
ret->eval = eval_eq;
|
ret->eval = eval_eq;
|
||||||
ret->v.eq.a = a;
|
ret->v.op2.a = a;
|
||||||
ret->v.eq.b = b;
|
ret->v.op2.b = b;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
typedef void filter;
|
typedef void filter;
|
||||||
|
|
||||||
|
filter *filter_and(filter *a, filter *b);
|
||||||
filter *filter_eq(filter *a, filter *b);
|
filter *filter_eq(filter *a, filter *b);
|
||||||
filter *filter_int(int v);
|
filter *filter_int(int v);
|
||||||
filter *filter_evarg(void *database, char *event_name, char *varname);
|
filter *filter_evarg(void *database, char *event_name, char *varname);
|
||||||
|
|||||||
Reference in New Issue
Block a user