forked from osmocom/wireshark
dfilter: Avoid double strdup to save token value
Store the lval token value instead.
This commit is contained in:
parent
557cee31fc
commit
647decd509
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue