dfilter: Add a helper function to create test stnodes

This commit is contained in:
João Valverde 2021-10-27 06:38:36 +01:00
parent f5fea52982
commit a7c625808c
4 changed files with 46 additions and 39 deletions

View File

@ -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).

View File

@ -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);

View File

@ -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)
{

View File

@ -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);