dfilter: Add a helper function to create test stnodes
This commit is contained in:
parent
f5fea52982
commit
a7c625808c
|
@ -110,26 +110,22 @@ expr(X) ::= logical_test(L). { X = L; }
|
|||
/* Logical tests */
|
||||
logical_test(T) ::= expr(E) TEST_AND expr(F).
|
||||
{
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set2(T, TEST_OP_AND, E, F);
|
||||
T = stnode_new_test(TEST_OP_AND, E, F);
|
||||
}
|
||||
|
||||
logical_test(T) ::= expr(E) TEST_OR expr(F).
|
||||
{
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set2(T, TEST_OP_OR, E, F);
|
||||
T = stnode_new_test(TEST_OP_OR, E, F);
|
||||
}
|
||||
|
||||
logical_test(T) ::= TEST_NOT expr(E).
|
||||
{
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set1(T, TEST_OP_NOT, E);
|
||||
T = stnode_new_test(TEST_OP_NOT, E, NULL);
|
||||
}
|
||||
|
||||
logical_test(T) ::= entity(E).
|
||||
{
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set1(T, TEST_OP_EXISTS, E);
|
||||
T = stnode_new_test(TEST_OP_EXISTS, E, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
@ -202,8 +198,7 @@ rel_binop(O) ::= TEST_CONTAINS. { O = TEST_OP_CONTAINS; }
|
|||
/* Relational tests */
|
||||
relation_test(T) ::= entity(E) rel_binop(O) entity(F).
|
||||
{
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set2(T, O, E, F);
|
||||
T = stnode_new_test(O, E, F);
|
||||
}
|
||||
|
||||
/* 'a == b == c' or 'a < b <= c <= d < e' */
|
||||
|
@ -220,11 +215,9 @@ relation_test(T) ::= entity(E) rel_binop(O) relation_test(R).
|
|||
sttype_test_get(F, NULL, &F, NULL);
|
||||
} while (stnode_type_id(F) == STTYPE_TEST);
|
||||
|
||||
L = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set2(L, O, E, stnode_dup(F));
|
||||
L = stnode_new_test(O, E, stnode_dup(F));
|
||||
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set2(T, TEST_OP_AND, L, R);
|
||||
T = stnode_new_test(TEST_OP_AND, L, R);
|
||||
}
|
||||
|
||||
/* "matches" does not chain with other relational tests. */
|
||||
|
@ -232,16 +225,14 @@ relation_test(T) ::= entity(E) TEST_MATCHES entity(F).
|
|||
{
|
||||
stnode_t *R = dfilter_new_regex(dfw, F);
|
||||
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
sttype_test_set2(T, TEST_OP_MATCHES, E, R);
|
||||
T = stnode_new_test(TEST_OP_MATCHES, E, R);
|
||||
}
|
||||
|
||||
relation_test(T) ::= entity(E) TEST_IN LBRACE set_node_list(L) RBRACE.
|
||||
{
|
||||
stnode_t *S;
|
||||
T = stnode_new(STTYPE_TEST, NULL);
|
||||
S = stnode_new(STTYPE_SET, L);
|
||||
sttype_test_set2(T, TEST_OP_IN, E, S);
|
||||
stnode_t *S = stnode_new(STTYPE_SET, L);
|
||||
|
||||
T = stnode_new_test(TEST_OP_IN, E, S);
|
||||
}
|
||||
|
||||
set_node_list(L) ::= entity(E).
|
||||
|
|
|
@ -10,25 +10,6 @@
|
|||
#ifndef STTYPE_TEST_H
|
||||
#define STTYPE_TEST_H
|
||||
|
||||
typedef enum {
|
||||
TEST_OP_UNINITIALIZED,
|
||||
TEST_OP_EXISTS,
|
||||
TEST_OP_NOT,
|
||||
TEST_OP_AND,
|
||||
TEST_OP_OR,
|
||||
TEST_OP_ANY_EQ,
|
||||
TEST_OP_ALL_NE,
|
||||
TEST_OP_ANY_NE,
|
||||
TEST_OP_GT,
|
||||
TEST_OP_GE,
|
||||
TEST_OP_LT,
|
||||
TEST_OP_LE,
|
||||
TEST_OP_BITWISE_AND,
|
||||
TEST_OP_CONTAINS,
|
||||
TEST_OP_MATCHES,
|
||||
TEST_OP_IN
|
||||
} test_op_t;
|
||||
|
||||
void
|
||||
sttype_test_set1(stnode_t *node, test_op_t op, stnode_t *val1);
|
||||
|
||||
|
|
|
@ -147,6 +147,19 @@ stnode_new(sttype_id_t type_id, gpointer data)
|
|||
return node;
|
||||
}
|
||||
|
||||
stnode_t *
|
||||
stnode_new_test(test_op_t op, stnode_t *val1, stnode_t *val2)
|
||||
{
|
||||
stnode_t *node;
|
||||
|
||||
node = stnode_new(STTYPE_TEST, NULL);
|
||||
if (val2 != NULL)
|
||||
sttype_test_set2(node, op, val1, val2);
|
||||
else
|
||||
sttype_test_set1(node, op, val1);
|
||||
return node;
|
||||
}
|
||||
|
||||
stnode_t*
|
||||
stnode_dup(const stnode_t *node)
|
||||
{
|
||||
|
|
|
@ -34,6 +34,25 @@ typedef enum {
|
|||
STTYPE_NUM_TYPES
|
||||
} sttype_id_t;
|
||||
|
||||
typedef enum {
|
||||
TEST_OP_UNINITIALIZED,
|
||||
TEST_OP_EXISTS,
|
||||
TEST_OP_NOT,
|
||||
TEST_OP_AND,
|
||||
TEST_OP_OR,
|
||||
TEST_OP_ANY_EQ,
|
||||
TEST_OP_ALL_NE,
|
||||
TEST_OP_ANY_NE,
|
||||
TEST_OP_GT,
|
||||
TEST_OP_GE,
|
||||
TEST_OP_LT,
|
||||
TEST_OP_LE,
|
||||
TEST_OP_BITWISE_AND,
|
||||
TEST_OP_CONTAINS,
|
||||
TEST_OP_MATCHES,
|
||||
TEST_OP_IN
|
||||
} test_op_t;
|
||||
|
||||
typedef gpointer (*STTypeNewFunc)(gpointer);
|
||||
typedef gpointer (*STTypeDupFunc)(gconstpointer);
|
||||
typedef void (*STTypeFreeFunc)(gpointer);
|
||||
|
@ -83,6 +102,9 @@ sttype_register(sttype_t *type);
|
|||
stnode_t*
|
||||
stnode_new(sttype_id_t type_id, gpointer data);
|
||||
|
||||
stnode_t *
|
||||
stnode_new_test(test_op_t op, stnode_t *val1, stnode_t *val2);
|
||||
|
||||
stnode_t*
|
||||
stnode_dup(const stnode_t *org);
|
||||
|
||||
|
|
Loading…
Reference in New Issue