dfilter: Use singly linked list for registers

Replace calls to list append with list prepend where applicable.
This commit is contained in:
João Valverde 2022-03-21 11:43:28 +00:00
parent ea949ef719
commit 22f3d87a8f
5 changed files with 45 additions and 45 deletions

View File

@ -22,7 +22,7 @@ struct epan_dfilter {
GPtrArray *consts;
guint num_registers;
guint max_registers;
GList **registers;
GSList **registers;
gboolean *attempted_load;
gboolean *owns_memory;
int *interesting_fields;

View File

@ -207,7 +207,7 @@ dfilter_free(dfilter_t *df)
/* Clear registers with constant values (as set by dfvm_init_const).
* Other registers were cleared on RETURN by free_register_overhead. */
for (i = df->num_registers; i < df->max_registers; i++) {
g_list_free(df->registers[i]);
g_slist_free(df->registers[i]);
}
if (df->deprecated)
@ -468,7 +468,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
/* Initialize run-time space */
dfilter->num_registers = dfw->first_constant;
dfilter->max_registers = dfw->next_register;
dfilter->registers = g_new0(GList*, dfilter->max_registers);
dfilter->registers = g_new0(GSList *, dfilter->max_registers);
dfilter->attempted_load = g_new0(gboolean, dfilter->max_registers);
dfilter->owns_memory = g_new0(gboolean, dfilter->max_registers);

View File

@ -24,9 +24,9 @@
/* Convert an FT_STRING using a callback function */
static gboolean
string_walk(GList* arg1list, GList **retval, gchar(*conv_func)(gchar))
string_walk(GSList* arg1list, GSList **retval, gchar(*conv_func)(gchar))
{
GList *arg1;
GSList *arg1;
fvalue_t *arg_fvalue;
fvalue_t *new_ft_string;
char *s, *c;
@ -44,7 +44,7 @@ string_walk(GList* arg1list, GList **retval, gchar(*conv_func)(gchar))
new_ft_string = fvalue_new(FT_STRING);
fvalue_set_string(new_ft_string, s);
wmem_free(NULL, s);
*retval = g_list_append(*retval, new_ft_string);
*retval = g_slist_prepend(*retval, new_ft_string);
}
arg1 = arg1->next;
}
@ -54,23 +54,23 @@ string_walk(GList* arg1list, GList **retval, gchar(*conv_func)(gchar))
/* dfilter function: lower() */
static gboolean
df_func_lower(GList* arg1list, GList *arg2junk _U_, GList **retval)
df_func_lower(GSList* arg1list, GSList *arg2junk _U_, GSList **retval)
{
return string_walk(arg1list, retval, g_ascii_tolower);
}
/* dfilter function: upper() */
static gboolean
df_func_upper(GList* arg1list, GList *arg2junk _U_, GList **retval)
df_func_upper(GSList* arg1list, GSList *arg2junk _U_, GSList **retval)
{
return string_walk(arg1list, retval, g_ascii_toupper);
}
/* dfilter function: len() */
static gboolean
df_func_len(GList* arg1list, GList *arg2junk _U_, GList **retval)
df_func_len(GSList* arg1list, GSList *arg2junk _U_, GSList **retval)
{
GList *arg1;
GSList *arg1;
fvalue_t *arg_fvalue;
fvalue_t *ft_len;
@ -79,7 +79,7 @@ df_func_len(GList* arg1list, GList *arg2junk _U_, GList **retval)
arg_fvalue = (fvalue_t *)arg1->data;
ft_len = fvalue_new(FT_UINT32);
fvalue_set_uinteger(ft_len, fvalue_length(arg_fvalue));
*retval = g_list_append(*retval, ft_len);
*retval = g_slist_prepend(*retval, ft_len);
arg1 = arg1->next;
}
@ -88,25 +88,25 @@ df_func_len(GList* arg1list, GList *arg2junk _U_, GList **retval)
/* dfilter function: count() */
static gboolean
df_func_count(GList* arg1list, GList *arg2junk _U_, GList **retval)
df_func_count(GSList* arg1list, GSList *arg2junk _U_, GSList **retval)
{
fvalue_t *ft_ret;
guint32 num_items;
num_items = (guint32)g_list_length(arg1list);
num_items = (guint32)g_slist_length(arg1list);
ft_ret = fvalue_new(FT_UINT32);
fvalue_set_uinteger(ft_ret, num_items);
*retval = g_list_append(*retval, ft_ret);
*retval = g_slist_prepend(*retval, ft_ret);
return TRUE;
}
/* dfilter function: string() */
static gboolean
df_func_string(GList* arg1list, GList *arg2junk _U_, GList **retval)
df_func_string(GSList* arg1list, GSList *arg2junk _U_, GSList **retval)
{
GList *arg1 = arg1list;
GSList *arg1 = arg1list;
fvalue_t *arg_fvalue;
fvalue_t *new_ft_string;
char *s;
@ -159,7 +159,7 @@ df_func_string(GList* arg1list, GList *arg2junk _U_, GList **retval)
new_ft_string = fvalue_new(FT_STRING);
fvalue_set_string(new_ft_string, s);
wmem_free(NULL, s);
*retval = g_list_append(*retval, new_ft_string);
*retval = g_slist_prepend(*retval, new_ft_string);
arg1 = arg1->next;
}

View File

@ -15,7 +15,7 @@
#include "syntax-tree.h"
/* The run-time logic of the dfilter function */
typedef gboolean (*DFFuncType)(GList *arg1list, GList *arg2list, GList **retval);
typedef gboolean (*DFFuncType)(GSList *arg1list, GSList *arg2list, GSList **retval);
/* The semantic check for the dfilter function */
typedef void (*DFSemCheckType)(dfwork_t *dfw, const char *func_name,

View File

@ -312,7 +312,7 @@ read_tree(dfilter_t *df, proto_tree *tree, header_field_info *hfinfo, int reg)
GPtrArray *finfos;
field_info *finfo;
int i, len;
GList *fvalues = NULL;
GSList *fvalues = NULL;
gboolean found_something = FALSE;
/* Already loaded in this run of the dfilter? */
@ -339,8 +339,8 @@ read_tree(dfilter_t *df, proto_tree *tree, header_field_info *hfinfo, int reg)
len = finfos->len;
for (i = 0; i < len; i++) {
finfo = (field_info *)g_ptr_array_index(finfos, i);
fvalues = g_list_prepend(fvalues, &finfo->value);
finfo = g_ptr_array_index(finfos, i);
fvalues = g_slist_prepend(fvalues, &finfo->value);
}
hfinfo = hfinfo->same_name_next;
@ -362,7 +362,7 @@ read_tree(dfilter_t *df, proto_tree *tree, header_field_info *hfinfo, int reg)
static gboolean
put_fvalue(dfilter_t *df, fvalue_t *fv, int reg)
{
df->registers[reg] = g_list_append(NULL, fv);
df->registers[reg] = g_slist_prepend(NULL, fv);
df->owns_memory[reg] = FALSE;
return TRUE;
}
@ -372,7 +372,7 @@ put_fvalue(dfilter_t *df, fvalue_t *fv, int reg)
static gboolean
put_pcre(dfilter_t *df, ws_regex_t *pcre, int reg)
{
df->registers[reg] = g_list_append(NULL, pcre);
df->registers[reg] = g_slist_prepend(NULL, pcre);
df->owns_memory[reg] = FALSE;
return TRUE;
}
@ -387,7 +387,7 @@ typedef gboolean (*DFVMMatchFunc)(const fvalue_t*, const fvalue_t*);
static gboolean
cmp_test(dfilter_t *df, enum match_how how, DFVMMatchFunc match_func, int reg1, int reg2)
{
GList *list_a, *list_b;
GSList *list_a, *list_b;
gboolean want_all = (how == MATCH_ALL);
gboolean want_any = (how == MATCH_ANY);
gboolean have_match;
@ -404,9 +404,9 @@ cmp_test(dfilter_t *df, enum match_how how, DFVMMatchFunc match_func, int reg1,
else if (want_any && have_match) {
return TRUE;
}
list_b = g_list_next(list_b);
list_b = g_slist_next(list_b);
}
list_a = g_list_next(list_a);
list_a = g_slist_next(list_a);
}
/* want_all || !want_any */
return want_all;
@ -457,19 +457,19 @@ all_ne(dfilter_t *df, int reg1, int reg2)
static gboolean
any_matches(dfilter_t *df, int reg1, int reg2)
{
GList *list_a, *list_b;
GSList *list_a, *list_b;
list_a = df->registers[reg1];
while (list_a) {
list_b = df->registers[reg2];
while (list_b) {
if (fvalue_matches((fvalue_t *)list_a->data, list_b->data)) {
if (fvalue_matches(list_a->data, list_b->data)) {
return TRUE;
}
list_b = g_list_next(list_b);
list_b = g_slist_next(list_b);
}
list_a = g_list_next(list_a);
list_a = g_slist_next(list_a);
}
return FALSE;
}
@ -477,8 +477,8 @@ any_matches(dfilter_t *df, int reg1, int reg2)
static gboolean
any_in_range(dfilter_t *df, int reg1, int reg2, int reg3)
{
GList *list1, *list_low, *list_high;
fvalue_t *low, *high;
GSList *list1, *list_low, *list_high;
fvalue_t *low, *high, *value;
list1 = df->registers[reg1];
list_low = df->registers[reg2];
@ -490,17 +490,17 @@ any_in_range(dfilter_t *df, int reg1, int reg2, int reg3)
* the list length MUST be one. This should have been enforced by
* grammar.lemon.
*/
ws_assert(list_low && !g_list_next(list_low));
ws_assert(list_high && !g_list_next(list_high));
low = (fvalue_t *)list_low->data;
high = (fvalue_t *)list_high->data;
ws_assert(list_low && !g_slist_next(list_low));
ws_assert(list_high && !g_slist_next(list_high));
low = list_low->data;
high = list_high->data;
while (list1) {
fvalue_t *value = (fvalue_t *)list1->data;
value = list1->data;
if (fvalue_ge(value, low) && fvalue_le(value, high)) {
return TRUE;
}
list1 = g_list_next(list1);
list1 = g_slist_next(list1);
}
return FALSE;
}
@ -524,10 +524,10 @@ free_register_overhead(dfilter_t* df)
df->attempted_load[i] = FALSE;
if (df->registers[i]) {
if (df->owns_memory[i]) {
g_list_foreach(df->registers[i], free_owned_register, NULL);
g_slist_foreach(df->registers[i], free_owned_register, NULL);
df->owns_memory[i] = FALSE;
}
g_list_free(df->registers[i]);
g_slist_free(df->registers[i]);
df->registers[i] = NULL;
}
}
@ -539,7 +539,7 @@ free_register_overhead(dfilter_t* df)
static void
mk_range(dfilter_t *df, int from_reg, int to_reg, drange_t *d_range)
{
GList *from_list, *to_list;
GSList *from_list, *to_list;
fvalue_t *old_fv, *new_fv;
to_list = NULL;
@ -552,9 +552,9 @@ mk_range(dfilter_t *df, int from_reg, int to_reg, drange_t *d_range)
* already caught the cases in which a slice
* cannot be made. */
ws_assert(new_fv);
to_list = g_list_append(to_list, new_fv);
to_list = g_slist_prepend(to_list, new_fv);
from_list = g_list_next(from_list);
from_list = g_slist_next(from_list);
}
df->registers[to_reg] = to_list;
@ -574,8 +574,8 @@ dfvm_apply(dfilter_t *df, proto_tree *tree)
dfvm_value_t *arg3 = NULL;
dfvm_value_t *arg4 = NULL;
header_field_info *hfinfo;
GList *param1;
GList *param2;
GSList *param1;
GSList *param2;
ws_assert(tree);