diff options
Diffstat (limited to 'epan/filter_expressions.c')
-rw-r--r-- | epan/filter_expressions.c | 114 |
1 files changed, 78 insertions, 36 deletions
diff --git a/epan/filter_expressions.c b/epan/filter_expressions.c index bf5a29033a..048bad65bd 100644 --- a/epan/filter_expressions.c +++ b/epan/filter_expressions.c @@ -22,64 +22,106 @@ #include "config.h" -#include <stdlib.h> -#include <string.h> #include <glib.h> #include <epan/prefs.h> +#include <epan/uat.h> +#include <epan/uat-int.h> #include "epan/filter_expressions.h" -static struct filter_expression *_filter_expression_head = NULL; -struct filter_expression **pfilter_expression_head = &_filter_expression_head; +/* UAT variables */ +static uat_t *display_filter_macro_uat = NULL; +static filter_expression_t *display_filter_macros = NULL; +static guint num_display_filter_macros = 0; + +/* Field callbacks. */ +UAT_BOOL_CB_DEF(display_filter_macro_uat, enabled, filter_expression_t) +UAT_CSTRING_CB_DEF(display_filter_macro_uat, label, filter_expression_t) +UAT_DISPLAY_FILTER_CB_DEF(display_filter_macro_uat, expression, filter_expression_t) /* * Create a new filter_expression and add it to the end of the list * of filter_expressions. */ -struct filter_expression * +filter_expression_t* filter_expression_new(const gchar *label, const gchar *expr, const gboolean enabled) { - struct filter_expression *expression; - struct filter_expression *prev; - - expression = (struct filter_expression *)g_malloc0(sizeof(struct filter_expression)); - expression->label = g_strdup(label); - expression->expression = g_strdup(expr); - expression->enabled = enabled; - - /* Add it at the end so the button order is always the same*/ - if (*pfilter_expression_head == NULL) { - _filter_expression_head = expression; - } else { - prev = *pfilter_expression_head; - while (prev->next != NULL) - prev = prev->next; - prev->next = expression; - expression->filter_index = prev->filter_index + 1; - } + filter_expression_t expression; - return(expression); + //UAT does the allocation of memory before copying structure + memset(&expression, 0, sizeof(expression)); + expression.label = g_strdup(label); + expression.expression = g_strdup(expr); + expression.enabled = enabled; + + /* XXX - This is just returned to make GTK GUI work. */ + return (filter_expression_t*)uat_add_record(display_filter_macro_uat, &expression, TRUE); } -void -filter_expression_init(void) +void filter_expression_iterate_expressions(wmem_foreach_func func, void* user_data) { - prefs.filter_expressions = pfilter_expression_head; + guint i; + + for (i = 0; i < num_display_filter_macros; i++) + { + func(NULL, &display_filter_macros[i], user_data); + } } -void -filter_expression_free(struct filter_expression *list_head) -{ - if (list_head == NULL) - return; - filter_expression_free(list_head->next); - g_free(list_head->label); - g_free(list_head->expression); - g_free(list_head); +static void display_filter_free_cb(void*r) { + filter_expression_t* rec = (filter_expression_t*)r; + + g_free(rec->label); + g_free(rec->expression); +} + +static void* display_filter_copy_cb(void* n, const void* o, size_t siz _U_) { + filter_expression_t* new_record = (filter_expression_t*)n; + const filter_expression_t* old_record = (const filter_expression_t*)o; + + new_record->button = old_record->button; + new_record->label = g_strdup(old_record->label); + new_record->expression = g_strdup(old_record->expression); + + new_record->enabled = old_record->enabled; + + return new_record; } +static uat_field_t display_filter_uat_flds[] = { + UAT_FLD_BOOL(display_filter_macro_uat, enabled, "Enabled", + "Checked to add display filter button to toolbar"), + UAT_FLD_CSTRING(display_filter_macro_uat, label, "Button Label", + "Name of the display filter button"), + UAT_FLD_DISPLAY_FILTER(display_filter_macro_uat, expression, "Filter Expression", + "Filter expression to be applied by the button"), + UAT_END_FIELDS +}; + +void filter_expression_register_uat(module_t* pref_module) +{ + display_filter_macro_uat = uat_new("Display expressions", + sizeof(filter_expression_t), /* record size */ + "dfilter_buttons", /* filename */ + TRUE, /* from_profile */ + &display_filter_macros, /* data_ptr */ + &num_display_filter_macros, /* numitems_ptr */ + 0, /* Doesn't not explicitly effect dissection */ + NULL, /* help */ + display_filter_copy_cb, /* copy callback */ + NULL, /* update callback */ + display_filter_free_cb, /* free callback */ + NULL, /* post update callback */ + NULL, /* reset callback */ + display_filter_uat_flds); /* UAT field definitions */ + + prefs_register_uat_preference(pref_module, "expressions", + "Display filter expressions", + "Macros for display filters", + display_filter_macro_uat); +} /* |