summaryrefslogtreecommitdiff
path: root/epan/filter_expressions.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/filter_expressions.c')
-rw-r--r--epan/filter_expressions.c114
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);
+}
/*