aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2021-09-27 01:54:41 +0100
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-09-30 17:03:55 +0000
commitb4af7c52a5bc386b2267dd10580a8a9cbdd14d0a (patch)
tree507d7ea455bd4cb7b60fc5dc2a521e5c046d9c56 /epan/dfilter
parenteef110de80e681c8ead1a7a6a748710b62c00bf6 (diff)
dfilter: Add a flags member to the syntax tree node
Use it to record "inside parenthesis".
Diffstat (limited to 'epan/dfilter')
-rw-r--r--epan/dfilter/grammar.lemon2
-rw-r--r--epan/dfilter/semcheck.c4
-rw-r--r--epan/dfilter/syntax-tree.c35
-rw-r--r--epan/dfilter/syntax-tree.h13
4 files changed, 37 insertions, 17 deletions
diff --git a/epan/dfilter/grammar.lemon b/epan/dfilter/grammar.lemon
index 13a9ca5e94..814c0e3cc4 100644
--- a/epan/dfilter/grammar.lemon
+++ b/epan/dfilter/grammar.lemon
@@ -364,6 +364,6 @@ funcparams(P) ::= funcparams(L) COMMA entity(E).
expr(X) ::= LPAREN expr(Y) RPAREN.
{
X = Y;
- stnode_set_bracket(X, TRUE);
+ stnode_set_inside_parens(X, TRUE);
}
diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c
index 4ee3da1d80..f76b4737e1 100644
--- a/epan/dfilter/semcheck.c
+++ b/epan/dfilter/semcheck.c
@@ -1523,7 +1523,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node)
if (stnode_type_id(st_arg1) == STTYPE_TEST) {
sttype_test_get(st_arg1, &st_arg_op, NULL, NULL);
if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) {
- if (st_op != st_arg_op && !st_arg1->inside_brackets)
+ if (st_op != st_arg_op && !stnode_inside_parens(st_arg1))
g_ptr_array_add(dfw->deprecated, g_strdup("suggest parentheses around '&&' within '||'"));
}
}
@@ -1531,7 +1531,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node)
if (stnode_type_id(st_arg2) == STTYPE_TEST) {
sttype_test_get(st_arg2, &st_arg_op, NULL, NULL);
if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) {
- if (st_op != st_arg_op && !st_arg2->inside_brackets)
+ if (st_op != st_arg_op && !stnode_inside_parens(st_arg2))
g_ptr_array_add(dfw->deprecated, g_strdup("suggest parentheses around '&&' within '||'"));
}
}
diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c
index 02282c9201..18e2e2bad1 100644
--- a/epan/dfilter/syntax-tree.c
+++ b/epan/dfilter/syntax-tree.c
@@ -83,9 +83,8 @@ stnode_new(sttype_id_t type_id, gpointer data)
sttype_t *type;
stnode_t *node;
- node = g_new(stnode_t, 1);
+ node = g_new0(stnode_t, 1);
node->magic = STNODE_MAGIC;
- node->inside_brackets = FALSE;
if (type_id == STTYPE_UNINITIALIZED) {
node->type = NULL;
@@ -107,12 +106,6 @@ stnode_new(sttype_id_t type_id, gpointer data)
return node;
}
-void
-stnode_set_bracket(stnode_t *node, gboolean bracket)
-{
- node->inside_brackets = bracket;
-}
-
stnode_t*
stnode_dup(const stnode_t *org)
{
@@ -127,12 +120,13 @@ stnode_dup(const stnode_t *org)
node = g_new(stnode_t, 1);
node->magic = STNODE_MAGIC;
node->type = type;
+ node->flags = org->flags;
+
if (type && type->func_dup)
node->data = type->func_dup(org->data);
else
node->data = org->data;
node->value = org->value;
- node->inside_brackets = org->inside_brackets;
return node;
}
@@ -149,6 +143,8 @@ stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data)
type = sttype_lookup(type_id);
ws_assert(type);
node->type = type;
+ node->flags = 0;
+
if (type->func_new) {
node->data = type->func_new(data);
}
@@ -223,6 +219,23 @@ stnode_value(stnode_t *node)
return node->value;
}
+gboolean
+stnode_inside_parens(stnode_t *node)
+{
+ return node->flags & STNODE_F_INSIDE_PARENS;
+}
+
+void
+stnode_set_inside_parens(stnode_t *node, gboolean inside)
+{
+ if (inside) {
+ node->flags |= STNODE_F_INSIDE_PARENS;
+ }
+ else {
+ node->flags &= ~STNODE_F_INSIDE_PARENS;
+ }
+}
+
char *
stnode_tostr(stnode_t *node)
{
@@ -253,11 +266,13 @@ sprint_node(stnode_t *node)
wmem_strbuf_append_printf(buf, "stnode <%p> = {\n", (void *)node);
wmem_strbuf_append_printf(buf, "\tmagic = %"PRIx32"\n", node->magic);
wmem_strbuf_append_printf(buf, "\ttype = %s\n", stnode_type_name(node));
+ wmem_strbuf_append_printf(buf,
+ "\tflags = %"PRIx16" (inside_parens = %s)\n",
+ node->flags, true_or_false(stnode_inside_parens(node)));
s = node->type->func_tostr(node->data);
wmem_strbuf_append_printf(buf, "\tdata = %s\n", s);
g_free(s);
wmem_strbuf_append_printf(buf, "\tvalue = %"PRId32"\n", node->value);
- wmem_strbuf_append_printf(buf, "\tinside_brackets = %s\n", true_or_false(node->inside_brackets));
wmem_strbuf_append_printf(buf, "}\n");
return wmem_strbuf_finalize(buf);
}
diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h
index b4ab91aa36..f42e257b34 100644
--- a/epan/dfilter/syntax-tree.h
+++ b/epan/dfilter/syntax-tree.h
@@ -50,16 +50,18 @@ typedef struct {
STTypeToStrFunc func_tostr;
} sttype_t;
+#define STNODE_F_INSIDE_PARENS (1 << 0)
+
/** Node (type instance) information */
typedef struct {
uint32_t magic;
sttype_t *type;
+ uint16_t flags;
/* This could be made an enum, but I haven't
* set aside to time to do so. */
gpointer data;
int32_t value;
- gboolean inside_brackets;
} stnode_t;
/* These are the sttype_t registration function prototypes. */
@@ -83,9 +85,6 @@ sttype_register(sttype_t *type);
stnode_t*
stnode_new(sttype_id_t type_id, gpointer data);
-void
-stnode_set_bracket(stnode_t *node, gboolean bracket);
-
stnode_t*
stnode_dup(const stnode_t *org);
@@ -116,6 +115,12 @@ stnode_value(stnode_t *node);
char *
stnode_tostr(stnode_t *node);
+gboolean
+stnode_inside_parens(stnode_t *node);
+
+void
+stnode_set_inside_parens(stnode_t *node, gboolean inside);
+
void
stnode_log_full(enum ws_log_level level,
const char *file, int line, const char *func,