aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--file.c6
-rw-r--r--gtk/follow_dlg.c5
-rw-r--r--gtk/keys.h7
-rw-r--r--gtk/main.c78
4 files changed, 53 insertions, 43 deletions
diff --git a/file.c b/file.c
index 8f1cb1ba18..108976ba92 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.270 2002/04/24 05:48:43 guy Exp $
+ * $Id: file.c,v 1.271 2002/05/03 03:24:45 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -852,8 +852,10 @@ filter_packets(capture_file *cf, gchar *dftext)
dfcode = NULL;
} else {
/*
- * We have a filter; try to compile it.
+ * We have a filter; make a copy of it (as we'll be saving it),
+ * and try to compile it.
*/
+ dftext = g_strdup(dftext);
if (!dfilter_compile(dftext, &dfcode)) {
/* The attempt failed; report an error. */
simple_dialog(ESD_TYPE_CRIT, NULL, dfilter_error_msg);
diff --git a/gtk/follow_dlg.c b/gtk/follow_dlg.c
index 1ac03a0f27..80f4f8ae2f 100644
--- a/gtk/follow_dlg.c
+++ b/gtk/follow_dlg.c
@@ -1,6 +1,6 @@
/* follow_dlg.c
*
- * $Id: follow_dlg.c,v 1.22 2002/03/05 11:55:59 guy Exp $
+ * $Id: follow_dlg.c,v 1.23 2002/05/03 03:24:47 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -216,6 +216,9 @@ follow_stream_cb(GtkWidget * w, gpointer data _U_)
/* Run the display filter so it goes in effect. */
filter_packets(&cfile, follow_filter);
+ /* Free the filter string, as we're done with it. */
+ g_free(follow_filter);
+
/* The data_out_file should now be full of the streams information */
fclose(data_out_file);
diff --git a/gtk/keys.h b/gtk/keys.h
index d4686fe9a9..aaf788a2f6 100644
--- a/gtk/keys.h
+++ b/gtk/keys.h
@@ -1,12 +1,11 @@
/* keys.h
* Key definitions for various objects
*
- * $Id: keys.h,v 1.12 2002/01/11 08:21:02 guy Exp $
+ * $Id: keys.h,v 1.13 2002/05/03 03:24:47 guy Exp $
*
* Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs
- *
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -29,8 +28,6 @@
/* Keys for gtk_object_set_data */
#define E_DFILTER_TE_KEY "display_filter_entry"
-#define E_DFILTER_CM_KEY "display_filter_combo"
-#define E_DFILTER_FL_KEY "display_filter_list"
#define E_RFILTER_TE_KEY "read_filter_te"
#define E_MPACKET_LIST_KEY "menu_packet_list"
#define E_MPACKET_LIST_ROW_KEY "menu_packet_list_row"
diff --git a/gtk/main.c b/gtk/main.c
index b0ecea0dbe..c2114de38f 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * $Id: main.c,v 1.245 2002/04/08 20:30:56 gram Exp $
+ * $Id: main.c,v 1.246 2002/05/03 03:24:47 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -183,6 +183,9 @@ static void console_log_handler(const char *log_domain,
static void create_main_window(gint, gint, gint, e_prefs*);
+#define E_DFILTER_CM_KEY "display_filter_combo"
+#define E_DFILTER_FL_KEY "display_filter_list"
+
/* About Ethereal window */
void
about_ethereal( GtkWidget *w _U_, gpointer data _U_ ) {
@@ -216,8 +219,8 @@ set_fonts(GdkFont *regular, GdkFont *bold)
static void
match_selected_cb_do(gpointer data, int action, gchar *text)
{
- char *ptr;
GtkWidget *filter_te;
+ char *cur_filter, *new_filter;
if (!text)
return;
@@ -225,59 +228,65 @@ match_selected_cb_do(gpointer data, int action, gchar *text)
filter_te = gtk_object_get_data(GTK_OBJECT(data), E_DFILTER_TE_KEY);
g_assert(filter_te);
- ptr = gtk_editable_get_chars(GTK_EDITABLE(filter_te),0,-1);
+ cur_filter = gtk_editable_get_chars(GTK_EDITABLE(filter_te), 0, -1);
switch (action&MATCH_SELECTED_MASK) {
case MATCH_SELECTED_REPLACE:
- ptr = g_strdup(text);
+ new_filter = g_strdup(text);
break;
case MATCH_SELECTED_AND:
- if ((!ptr) || (0 == strlen(ptr)))
- ptr = g_strdup(text);
+ if ((!cur_filter) || (0 == strlen(cur_filter)))
+ new_filter = g_strdup(text);
else
- ptr = g_strconcat("(", ptr, ") && (", text, ")", NULL);
+ new_filter = g_strconcat("(", cur_filter, ") && (", text, ")", NULL);
break;
case MATCH_SELECTED_OR:
- if ((!ptr) || (0 == strlen(ptr)))
- ptr = g_strdup(text);
+ if ((!cur_filter) || (0 == strlen(cur_filter)))
+ new_filter = g_strdup(text);
else
- ptr = g_strconcat("(", ptr, ") || (", text, ")", NULL);
+ new_filter = g_strconcat("(", cur_filter, ") || (", text, ")", NULL);
break;
case MATCH_SELECTED_NOT:
- ptr = g_strconcat("!(", text, ")", NULL);
+ new_filter = g_strconcat("!(", text, ")", NULL);
break;
case MATCH_SELECTED_AND_NOT:
- if ((!ptr) || (0 == strlen(ptr)))
- ptr = g_strconcat("!(", text, ")", NULL);
+ if ((!cur_filter) || (0 == strlen(cur_filter)))
+ new_filter = g_strconcat("!(", text, ")", NULL);
else
- ptr = g_strconcat("(", ptr, ") && !(", text, ")", NULL);
+ new_filter = g_strconcat("(", cur_filter, ") && !(", text, ")", NULL);
break;
case MATCH_SELECTED_OR_NOT:
- if ((!ptr) || (0 == strlen(ptr)))
- ptr = g_strconcat("!(", text, ")", NULL);
+ if ((!cur_filter) || (0 == strlen(cur_filter)))
+ new_filter = g_strconcat("!(", text, ")", NULL);
else
- ptr = g_strconcat("(", ptr, ") || !(", text, ")", NULL);
+ new_filter = g_strconcat("(", cur_filter, ") || !(", text, ")", NULL);
break;
default:
+ g_assert_not_reached();
break;
}
+ /* Free up the copy we got of the old filter text. */
+ g_free(cur_filter);
+
/* create a new one and set the display filter entry accordingly */
- gtk_entry_set_text(GTK_ENTRY(filter_te), ptr);
+ gtk_entry_set_text(GTK_ENTRY(filter_te), new_filter);
/* Run the display filter so it goes in effect. */
if (action&MATCH_SELECTED_APPLY_NOW)
- filter_packets(&cfile, ptr);
+ filter_packets(&cfile, new_filter);
- /* Don't g_free(ptr) here. filter_packets() will do it the next time
- it's called. */
+ /* Free up the new filter text. */
+ g_free(new_filter);
+
+ /* Free up the generated text we were handed. */
g_free(text);
}
@@ -527,18 +536,19 @@ static void
filter_activate_cb(GtkWidget *w, gpointer data)
{
GtkCombo *filter_cm = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_CM_KEY);
- GList *filter_list = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_FL_KEY);
- GList *li, *nl = NULL;
+ GList *filter_list = gtk_object_get_data(GTK_OBJECT(filter_cm), E_DFILTER_FL_KEY);
+ GList *li;
gboolean add_filter = TRUE;
- char *s = NULL;
+ gboolean free_filter = TRUE;
+ char *s;
g_assert(data);
- s = gtk_entry_get_text(GTK_ENTRY(data));
+ s = g_strdup(gtk_entry_get_text(GTK_ENTRY(data)));
/* GtkCombos don't let us get at their list contents easily, so we maintain
our own filter list, and feed it to gtk_combo_set_popdown_strings when
a new filter is added. */
- if (filter_packets(&cfile, g_strdup(s))) {
+ if (filter_packets(&cfile, s)) {
li = g_list_first(filter_list);
while (li) {
if (li->data && strcmp(s, li->data) == 0)
@@ -547,16 +557,15 @@ filter_activate_cb(GtkWidget *w, gpointer data)
}
if (add_filter) {
- filter_list = g_list_append(filter_list, g_strdup(s));
- li = g_list_first(filter_list);
- while (li) {
- nl = g_list_append(nl, strdup(li->data));
- li = li->next;
- }
- gtk_combo_set_popdown_strings(filter_cm, nl);
+ free_filter = FALSE;
+ filter_list = g_list_append(filter_list, s);
+ gtk_object_set_data(GTK_OBJECT(filter_cm), E_DFILTER_FL_KEY, filter_list);
+ gtk_combo_set_popdown_strings(filter_cm, filter_list);
gtk_entry_set_text(GTK_ENTRY(filter_cm->entry), g_list_last(filter_list)->data);
}
}
+ if (free_filter)
+ g_free(s);
}
/* redisplay with no display filter */
@@ -2305,10 +2314,10 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs)
filter_list = g_list_append (filter_list, "");
gtk_combo_set_popdown_strings(GTK_COMBO(filter_cm), filter_list);
gtk_combo_disable_activate(GTK_COMBO(filter_cm));
+ gtk_object_set_data(GTK_OBJECT(filter_cm), E_DFILTER_FL_KEY, filter_list);
filter_te = GTK_COMBO(filter_cm)->entry;
gtk_object_set_data(GTK_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
gtk_object_set_data(GTK_OBJECT(filter_te), E_DFILTER_CM_KEY, filter_cm);
- gtk_object_set_data(GTK_OBJECT(filter_te), E_DFILTER_FL_KEY, filter_list);
gtk_box_pack_start(GTK_BOX(stat_hbox), filter_cm, TRUE, TRUE, 3);
gtk_signal_connect(GTK_OBJECT(filter_te), "activate",
GTK_SIGNAL_FUNC(filter_activate_cb), filter_te);
@@ -2323,7 +2332,6 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs)
filter_apply = gtk_button_new_with_label("Apply");
gtk_object_set_data(GTK_OBJECT(filter_apply), E_DFILTER_CM_KEY, filter_cm);
- gtk_object_set_data(GTK_OBJECT(filter_apply), E_DFILTER_FL_KEY, filter_list);
gtk_signal_connect(GTK_OBJECT(filter_apply), "clicked",
GTK_SIGNAL_FUNC(filter_activate_cb), filter_te);
gtk_box_pack_start(GTK_BOX(stat_hbox), filter_apply, FALSE, TRUE, 1);