diff options
author | João Valverde <j@v6e.pt> | 2021-09-27 23:22:59 +0100 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2021-09-30 17:26:19 +0100 |
commit | 0e7ba54d98bfd3d0fe756274fd8ac952abdd7427 (patch) | |
tree | 76a467dc6f79638e90d96a5bcbeaf538fcbc4af0 /epan/dfilter | |
parent | d6836d103d839dd4144262fc6f190c939e6c2106 (diff) |
dfilter: Clean up handling of "deprecated" tokens
Pass the deprecated data struture to the scanner and insert the deprecated
tokens there. This avoids having to keep a dedicated syntax node field
for this.
Pass the deprecated argument in dfwork_t instead of in a separate
argument. This is less cumbersome than adding an extra argument
to every level of the semantic checker.
Diffstat (limited to 'epan/dfilter')
-rw-r--r-- | epan/dfilter/dfilter-int.h | 8 | ||||
-rw-r--r-- | epan/dfilter/dfilter.c | 62 | ||||
-rw-r--r-- | epan/dfilter/scanner.l | 12 | ||||
-rw-r--r-- | epan/dfilter/semcheck.c | 22 | ||||
-rw-r--r-- | epan/dfilter/semcheck.h | 2 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.c | 12 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.h | 4 |
7 files changed, 54 insertions, 68 deletions
diff --git a/epan/dfilter/dfilter-int.h b/epan/dfilter/dfilter-int.h index 7124b2159f..402275033a 100644 --- a/epan/dfilter/dfilter-int.h +++ b/epan/dfilter/dfilter-int.h @@ -42,6 +42,7 @@ typedef struct { int next_const_id; int next_register; int first_constant; /* first register used as a constant */ + GPtrArray *deprecated; } dfwork_t; /* @@ -52,6 +53,7 @@ typedef struct { GString* quoted_string; gboolean raw_string; gboolean in_set; /* true if parsing set elements for the membership operator */ + GPtrArray *deprecated; } df_scanner_state_t; /* Constructor/Destructor prototypes for Lemon Parser */ @@ -71,6 +73,12 @@ void dfilter_fail(dfwork_t *dfw, const char *format, ...) G_GNUC_PRINTF(2, 3); void +add_deprecated_token(GPtrArray *deprecated, const char *token); + +void +free_deprecated(GPtrArray *deprecated); + +void DfilterTrace(FILE *TraceFILE, char *zTracePrompt); const char *tokenstr(int token); diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c index 450ab77dac..e7c48f73a0 100644 --- a/epan/dfilter/dfilter.c +++ b/epan/dfilter/dfilter.c @@ -236,6 +236,29 @@ const char *tokenstr(int token) ws_assert_not_reached(); } +void +add_deprecated_token(GPtrArray *deprecated, const char *token) +{ + for (guint i = 0; i < deprecated->len; i++) { + const char *str = (const char *)g_ptr_array_index(deprecated, i); + if (g_ascii_strcasecmp(token, str) == 0) { + /* It's already in our list */ + return; + } + } + g_ptr_array_add(deprecated, g_strdup(token)); +} + +void +free_deprecated(GPtrArray *deprecated) +{ + for (guint i = 0; i < deprecated->len; ++i) { + gpointer *depr = g_ptr_array_index(deprecated,i); + g_free(depr); + } + g_ptr_array_free(deprecated, TRUE); +} + gboolean dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg) { @@ -247,8 +270,6 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg) yyscan_t scanner; YY_BUFFER_STATE in_buffer; gboolean failure = FALSE; - const char *depr_test; - guint i; /* XXX, GHashTable */ GPtrArray *deprecated; @@ -279,15 +300,16 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg) dfw = dfwork_new(); + deprecated = g_ptr_array_new(); + state.dfw = dfw; state.quoted_string = NULL; state.in_set = FALSE; state.raw_string = FALSE; + state.deprecated = deprecated; df_set_extra(&state, scanner); - deprecated = g_ptr_array_new(); - while (1) { df_lval = stnode_new(STTYPE_UNINITIALIZED, NULL); token = df_lex(scanner); @@ -303,22 +325,6 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg) break; } - /* See if the node is deprecated */ - depr_test = stnode_deprecated(df_lval); - - if (depr_test) { - for (i = 0; i < deprecated->len; i++) { - if (g_ascii_strcasecmp(depr_test, (const gchar *)g_ptr_array_index(deprecated, i)) == 0) { - /* It's already in our list */ - depr_test = NULL; - } - } - } - - if (depr_test) { - g_ptr_array_add(deprecated, g_strdup(depr_test)); - } - ws_debug("Token: %d %s", token, tokenstr(token)); /* Give the token to the parser */ @@ -365,17 +371,15 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg) * it and set *dfp to NULL */ if (dfw->st_root == NULL) { *dfp = NULL; - for (i = 0; i < deprecated->len; ++i) { - gchar* depr = (gchar*)g_ptr_array_index(deprecated,i); - g_free(depr); - } - g_ptr_array_free(deprecated, TRUE); + free_deprecated(deprecated); } else { log_syntax_tree(LOG_LEVEL_NOISY, dfw->st_root, "Syntax tree before semantic check"); + dfw->deprecated = deprecated; + /* Check semantics and do necessary type conversion*/ - if (!dfw_semcheck(dfw, deprecated)) { + if (!dfw_semcheck(dfw)) { goto FAILURE; } @@ -424,11 +428,7 @@ FAILURE: global_dfw = NULL; dfwork_free(dfw); } - for (i = 0; i < deprecated->len; ++i) { - gchar* depr = (gchar*)g_ptr_array_index(deprecated,i); - g_free(depr); - } - g_ptr_array_free(deprecated, TRUE); + free_deprecated(deprecated); if (err_msg != NULL) { /* * Default error message. diff --git a/epan/dfilter/scanner.l b/epan/dfilter/scanner.l index 672e178c14..1a50d1200d 100644 --- a/epan/dfilter/scanner.l +++ b/epan/dfilter/scanner.l @@ -88,7 +88,6 @@ static int set_lval(int token, gpointer data); static int set_lval_int(dfwork_t *dfw, int token, char *s); static int simple(int token); static gboolean str_to_gint32(dfwork_t *dfw, char *s, gint32* pint); -static void mark_lval_deprecated(const char *s); /* * Sleazy hack to suppress compiler warnings in yy_fatal_error(). @@ -139,11 +138,11 @@ static void mark_lval_deprecated(const char *s); "==" return simple(TOKEN_TEST_EQ); "eq" return simple(TOKEN_TEST_EQ); "!=" { - mark_lval_deprecated("!="); + add_deprecated_token(yyextra->deprecated, "!="); return simple(TOKEN_TEST_NE); } "ne" { - mark_lval_deprecated("ne"); + add_deprecated_token(yyextra->deprecated, "ne"); return simple(TOKEN_TEST_NE); } ">" return simple(TOKEN_TEST_GT); @@ -418,7 +417,7 @@ static void mark_lval_deprecated(const char *s); /* Yes, it's an aliased field name */ /* XXX Do we need to make a copy of yytext? dfilter_compile * will dup this later on. */ - mark_lval_deprecated(yytext); + add_deprecated_token(yyextra->deprecated, yytext); return set_lval(TOKEN_FIELD, hfinfo); } @@ -581,8 +580,3 @@ str_to_gint32(dfwork_t *dfw, char *s, gint32* pint) return TRUE; } -static void -mark_lval_deprecated(const char *s) -{ - df_lval->deprecated_token = s; -} diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c index 36595c1f8f..4ee3da1d80 100644 --- a/epan/dfilter/semcheck.c +++ b/epan/dfilter/semcheck.c @@ -30,7 +30,7 @@ static void -semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated); +semcheck(dfwork_t *dfw, stnode_t *st_node); static stnode_t* check_param_entity(dfwork_t *dfw, stnode_t *st_node); @@ -1492,7 +1492,7 @@ check_relation(dfwork_t *dfw, const char *relation_string, /* Check the semantics of any type of TEST */ static void -check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) +check_test(dfwork_t *dfw, stnode_t *st_node) { test_op_t st_op, st_arg_op; stnode_t *st_arg1, *st_arg2; @@ -1515,7 +1515,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) break; case TEST_OP_NOT: - semcheck(dfw, st_arg1, deprecated); + semcheck(dfw, st_arg1); break; case TEST_OP_AND: @@ -1524,7 +1524,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) 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) - g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); + g_ptr_array_add(dfw->deprecated, g_strdup("suggest parentheses around '&&' within '||'")); } } @@ -1532,12 +1532,12 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) 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) - g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); + g_ptr_array_add(dfw->deprecated, g_strdup("suggest parentheses around '&&' within '||'")); } } - semcheck(dfw, st_arg1, deprecated); - semcheck(dfw, st_arg2, deprecated); + semcheck(dfw, st_arg1); + semcheck(dfw, st_arg2); break; case TEST_OP_EQ: @@ -1581,7 +1581,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) /* Check the entire syntax tree. */ static void -semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) +semcheck(dfwork_t *dfw, stnode_t *st_node) { #ifndef WS_DISABLE_DEBUG static guint i = 0; @@ -1592,7 +1592,7 @@ semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) * node will be a TEST node, no matter what. So assert that. */ switch (stnode_type_id(st_node)) { case STTYPE_TEST: - check_test(dfw, st_node, deprecated); + check_test(dfw, st_node); break; default: ws_assert_not_reached(); @@ -1604,7 +1604,7 @@ semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated) * some of the nodes into the form they need to be in order to * later generate the DFVM bytecode. */ gboolean -dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated) +dfw_semcheck(dfwork_t *dfw) { volatile gboolean ok_filter = TRUE; #ifndef WS_DISABLE_DEBUG @@ -1617,7 +1617,7 @@ dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated) * the semantic-checking, the semantic-checking code will * throw an exception if a problem is found. */ TRY { - semcheck(dfw, dfw->st_root, deprecated); + semcheck(dfw, dfw->st_root); } CATCH(TypeError) { ok_filter = FALSE; diff --git a/epan/dfilter/semcheck.h b/epan/dfilter/semcheck.h index f4fe452240..72b969a474 100644 --- a/epan/dfilter/semcheck.h +++ b/epan/dfilter/semcheck.h @@ -11,7 +11,7 @@ #define SEMCHECK_H gboolean -dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated); +dfw_semcheck(dfwork_t *dfw); #endif diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c index 3a8f213c39..02282c9201 100644 --- a/epan/dfilter/syntax-tree.c +++ b/epan/dfilter/syntax-tree.c @@ -85,7 +85,6 @@ stnode_new(sttype_id_t type_id, gpointer data) node = g_new(stnode_t, 1); node->magic = STNODE_MAGIC; - node->deprecated_token = NULL; node->inside_brackets = FALSE; if (type_id == STTYPE_UNINITIALIZED) { @@ -127,7 +126,6 @@ stnode_dup(const stnode_t *org) node = g_new(stnode_t, 1); node->magic = STNODE_MAGIC; - node->deprecated_token = NULL; node->type = type; if (type && type->func_dup) node->data = type->func_dup(org->data); @@ -225,15 +223,6 @@ stnode_value(stnode_t *node) return node->value; } -const char * -stnode_deprecated(stnode_t *node) -{ - if (!node) { - return NULL; - } - return node->deprecated_token; -} - char * stnode_tostr(stnode_t *node) { @@ -269,7 +258,6 @@ sprint_node(stnode_t *node) 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, "\tdeprecated_token = %s\n", node->deprecated_token); 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 dd99b3d4c1..b4ab91aa36 100644 --- a/epan/dfilter/syntax-tree.h +++ b/epan/dfilter/syntax-tree.h @@ -60,7 +60,6 @@ typedef struct { gpointer data; int32_t value; gboolean inside_brackets; - const char *deprecated_token; } stnode_t; /* These are the sttype_t registration function prototypes. */ @@ -114,9 +113,6 @@ stnode_steal_data(stnode_t *node); gint32 stnode_value(stnode_t *node); -const char * -stnode_deprecated(stnode_t *node); - char * stnode_tostr(stnode_t *node); |