]> git.samba.org - metze/wireshark/wip.git/blobdiff - epan/filter_expressions.c
Snort: speed up parsing of options by avoiding g_snprintf()
[metze/wireshark/wip.git] / epan / filter_expressions.c
index ec1c3f2ba6017b3328a150873f12fcf282fdca70..2364a7891a65b2dc29ce44b4da0bd1fa25f60323 100644 (file)
@@ -1,8 +1,6 @@
 /* filter_expressions.c
  * Submitted by Edwin Groothuis <wireshark@mavetju.org>
  *
- * $Id$
- *
  * Wireshark - Network traffic analyzer
  * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
 
 #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)
+UAT_CSTRING_CB_DEF(display_filter_macro_uat, comment, 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)
+                     const gchar *comment, const gboolean enabled)
+{
+       filter_expression_t 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.comment = g_strdup(comment);
+       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_iterate_expressions(wmem_foreach_func func, void* user_data)
 {
-       struct filter_expression *expression;
-       struct filter_expression *prev;
-
-       expression = (struct filter_expression *)g_malloc(sizeof(struct filter_expression));
-       memset(expression, '\0', sizeof(struct filter_expression));
-       expression->button = NULL;
-       expression->label = g_strdup(label);
-       expression->expression = g_strdup(expr);
-       expression->enabled = enabled;
-       expression->deleted = FALSE;
-       expression->index = 0;
-
-       expression->next = NULL;
-
-       /* 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->index = prev->index + 1;
+       guint i;
+
+       for (i = 0; i < num_display_filter_macros; i++)
+       {
+               func(NULL, &display_filter_macros[i], user_data);
        }
+}
 
-       return(expression);
+static void display_filter_free_cb(void*r) {
+       filter_expression_t* rec = (filter_expression_t*)r;
+
+       g_free(rec->label);
+       g_free(rec->expression);
+       g_free(rec->comment);
 }
 
-void
-filter_expression_init(gboolean enable_prefs)
+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->comment = g_strdup(old_record->comment);
+
+       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, "Show in toolbar",
+               "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_FLD_CSTRING(display_filter_macro_uat, comment, "Comment",
+               "Comment describing filter expression"),
+       UAT_END_FIELDS
+};
+
+void filter_expression_register_uat(module_t* pref_module)
 {
-       if (enable_prefs)
-               prefs.filter_expressions = pfilter_expression_head;
+       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);
 }
+
+
+/*
+ * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */