diff options
author | João Valverde <j@v6e.pt> | 2021-09-27 01:54:41 +0100 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-09-30 17:03:55 +0000 |
commit | b4af7c52a5bc386b2267dd10580a8a9cbdd14d0a (patch) | |
tree | 507d7ea455bd4cb7b60fc5dc2a521e5c046d9c56 /epan/dfilter | |
parent | eef110de80e681c8ead1a7a6a748710b62c00bf6 (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.lemon | 2 | ||||
-rw-r--r-- | epan/dfilter/semcheck.c | 4 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.c | 35 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.h | 13 |
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, |