dfilter: Avoid double strdup to save token value

Store the lval token value instead.
This commit is contained in:
João Valverde 2021-11-28 12:41:23 +00:00
parent 557cee31fc
commit 647decd509
5 changed files with 27 additions and 25 deletions

View File

@ -66,11 +66,11 @@ df_lval_new(void)
return g_new0(df_lval_t, 1);
}
static inline const char *
static inline char *
df_lval_value(df_lval_t *lval)
{
if (!lval || !lval->value)
return "(fixme: null)";
return NULL;
return lval->value;
}
@ -81,10 +81,12 @@ df_lval_number(df_lval_t *lval)
}
static inline void
df_lval_free(df_lval_t *lval)
df_lval_free(df_lval_t *lval, gboolean free_value)
{
if (lval) {
g_free(lval->value);
if (free_value) {
g_free(lval->value);
}
g_free(lval);
}
}

View File

@ -402,7 +402,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
/* If we created a df_lval_t but didn't use it, free it; the
* parser doesn't know about it and won't free it for us. */
if (df_lval) {
df_lval_free(df_lval);
df_lval_free(df_lval, TRUE);
df_lval = NULL;
}

View File

@ -36,7 +36,7 @@ new_test(dfwork_t *dfw, test_op_t op, df_lval_t *lval);
%token_type {df_lval_t*}
%token_destructor {
(void)dfw;
df_lval_free($$);
df_lval_free($$, TRUE);
}
%type sentence {stnode_t*}
@ -126,7 +126,7 @@ expr(X) ::= logical_test(L). { X = L; }
new_test(dfwork_t *dfw _U_, test_op_t op, df_lval_t *lval)
{
stnode_t *node = stnode_new_test(op, df_lval_value(lval));
df_lval_free(lval);
df_lval_free(lval, FALSE);
return node;
}
}
@ -162,18 +162,18 @@ logical_test(T) ::= entity(E).
entity(E) ::= STRING(S).
{
E = stnode_new_string(df_lval_value(S), df_lval_value(S));
df_lval_free(S);
df_lval_free(S, FALSE);
}
entity(E) ::= CHARCONST(C).
{
E = stnode_new_charconst(df_lval_number(C), df_lval_value(C));
df_lval_free(C);
df_lval_free(C, FALSE);
}
entity(E) ::= UNPARSED(U).
{
E = stnode_new_unparsed(df_lval_value(U), df_lval_value(U));
dfilter_resolve_unparsed(dfw, E);
df_lval_free(U);
df_lval_free(U, FALSE);
}
entity(E) ::= range(R). { E = R; }
entity(E) ::= function(F). { E = F; }
@ -210,7 +210,7 @@ range_node(D) ::= RANGE(R).
g_free(err);
}
df_lval_free(R);
df_lval_free(R, TRUE);
}
/* Relational tests */
@ -316,7 +316,7 @@ set_element(N) ::= entity(X) DOTDOT entity(Y).
dfilter_fail(dfw, "Function '%s' does not exist", name);
}
stnode_t *node = stnode_new(STTYPE_FUNCTION, def, df_lval_value(lval));
df_lval_free(lval);
df_lval_free(lval, FALSE);
return node;
}
}

View File

@ -98,7 +98,7 @@ stnode_clear(stnode_t *node)
}
void
stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *token)
stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, char *token)
{
sttype_t *type;
@ -108,7 +108,7 @@ stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *toke
node->flags = 0;
node->repr_display = NULL;
node->repr_debug = NULL;
node->repr_token = g_strdup(token);
node->repr_token = token;
if (type_id == STTYPE_UNINITIALIZED) {
node->type = NULL;
@ -141,7 +141,7 @@ stnode_replace(stnode_t *node, sttype_id_t type_id, gpointer data)
}
stnode_t*
stnode_new(sttype_id_t type_id, gpointer data, const char *token)
stnode_new(sttype_id_t type_id, gpointer data, char *token)
{
stnode_t *node;
@ -154,7 +154,7 @@ stnode_new(sttype_id_t type_id, gpointer data, const char *token)
}
stnode_t *
stnode_new_test(test_op_t op, const char *token)
stnode_new_test(test_op_t op, char *token)
{
stnode_t *node;
@ -164,19 +164,19 @@ stnode_new_test(test_op_t op, const char *token)
}
stnode_t *
stnode_new_string(const char *str, const char *token)
stnode_new_string(const char *str, char *token)
{
return stnode_new(STTYPE_STRING, g_strdup(str), token);
}
stnode_t *
stnode_new_unparsed(const char *str, const char *token)
stnode_new_unparsed(const char *str, char *token)
{
return stnode_new(STTYPE_UNPARSED, g_strdup(str), token);
}
stnode_t *
stnode_new_charconst(unsigned long number, const char *token)
stnode_new_charconst(unsigned long number, char *token)
{
return stnode_new(STTYPE_CHARCONST, g_memdup2(&number, sizeof(number)), token);
}

View File

@ -101,19 +101,19 @@ void
sttype_register(sttype_t *type);
stnode_t*
stnode_new(sttype_id_t type_id, gpointer data, const char *token);
stnode_new(sttype_id_t type_id, gpointer data, char *token);
stnode_t *
stnode_new_test(test_op_t op, const char *token);
stnode_new_test(test_op_t op, char *token);
stnode_t *
stnode_new_string(const char *str, const char *token);
stnode_new_string(const char *str, char *token);
stnode_t *
stnode_new_unparsed(const char *str, const char *token);
stnode_new_unparsed(const char *str, char *token);
stnode_t *
stnode_new_charconst(unsigned long number, const char *token);
stnode_new_charconst(unsigned long number, char *token);
stnode_t*
stnode_dup(const stnode_t *org);
@ -122,7 +122,7 @@ void
stnode_clear(stnode_t *node);
void
stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *token);
stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, char *token);
void
stnode_replace(stnode_t *node, sttype_id_t type_id, gpointer data);