When a new display filter is to be applied, don't set "cf.dfilter" or
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 11 Oct 1999 06:39:26 +0000 (06:39 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 11 Oct 1999 06:39:26 +0000 (06:39 +0000)
"cf.dfcode" if the new filter doesn't compile, because the filter
currently in effect will be the one that was last applied - just free up
the text of the new filter, and whatever memory was allocated for the
new filter code.

This means we allocate a new dfilter when a new filter is to be applied,
rather than recycling stuff from the old filter, as we want the old
filter code to remain around if the new filter doesn't compile.

This means that "cf.dfilter" and "cf.dfcode" will be null if there's no
filter in effect.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@803 f5534014-38df-0310-8fa8-9805f1628bb7

colors.c
dfilter-grammar.y
dfilter-int.h
dfilter.c
dfilter.h
file.c
file.h
gtk/file_dlg.c
gtk/main.c
summary.c

index 323b7dc51370fe91c79d15f051af057ec69291c9..7cd4074e61169d951343d8ff518dae0fa0596bd8 100644 (file)
--- a/colors.c
+++ b/colors.c
@@ -1,7 +1,7 @@
 /* colors.c
  * Definitions for color structures and routines
  *
- * $Id: colors.c,v 1.12 1999/10/07 22:50:44 guy Exp $
+ * $Id: colors.c,v 1.13 1999/10/11 06:39:02 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -116,9 +116,8 @@ colors_init(capture_file *cf)
        new_color_filter(cf->colors, default_colors[i].proto, default_colors[i].proto);
        color_filter(cf,i)->bg_color = color;
 
-       color_filter(cf,i)->c_colorfilter = dfilter_new();
-       if(dfilter_compile((color_filter(cf,i)->c_colorfilter),
-         default_colors[i].proto) != 0){
+       color_filter(cf,i)->c_colorfilter = dfilter_compile(default_colors[i].proto);
+       if(color_filter(cf,i)->c_colorfilter == NULL){
                simple_dialog(ESD_TYPE_WARN, NULL,
                  "Cannot compile default filter %s.\n%s",
                  default_colors[i].proto, dfilter_error_msg);
@@ -244,14 +243,11 @@ read_filters(capture_file *cf)
                name, filter, &bg_r, &bg_g, &bg_b, &fg_r, &fg_g, &fg_b) == 8){
                /* we got a filter */
 
-            /* test the dfilter before putting it into the list of color dfilters */
-           /*if(dfilter_compile((color_filter(cf,i)->c_colorfilter),filter) != 0){*/
-           temp_dfilter = dfilter_new();
-           if(dfilter_compile(temp_dfilter, filter) != 0){
+           temp_dfilter = dfilter_compile(filter);
+           if(temp_dfilter == NULL){
                simple_dialog(ESD_TYPE_WARN, NULL,
                 "Could not compile filter %s from saved filters because\n%s",
                 name, dfilter_error_msg);
-               dfilter_destroy(temp_dfilter);
                continue;
            }
             new_color_filter(cf->colors, name, filter);
@@ -493,7 +489,7 @@ color_ok_cb                            (GtkButton       *button,
 
   /* colorize list */
 
-  filter_packets(&cf);
+  colorize_packets(&cf);
   gtk_container_remove(GTK_CONTAINER(GTK_WIDGET(cf.colors->color_filters)->parent),
        cf.colors->color_filters);
   gtk_widget_destroy(dialog);
@@ -507,7 +503,7 @@ color_apply_cb                         (GtkButton       *button,
 {
   capture_file *cf;
   cf = (capture_file *)user_data;
-  filter_packets(cf);
+  colorize_packets(cf);
 }
 
 /* Exit dialog and do not process list */
@@ -593,12 +589,11 @@ colorize_ok_cb                         (GtkButton       *button,
 
 
 
-  compiled_filter = dfilter_new();
+  compiled_filter = dfilter_compile(filter_text);
   
-  if( dfilter_compile( compiled_filter, filter_text) != 0 ){
+  if(compiled_filter == NULL ){
        simple_dialog(ESD_TYPE_WARN, NULL, "Filter \"%s\" did not compile correctly.\n"
                " Please try again. Filter unchanged.\n%s\n", filter_name,dfilter_error_msg);
-       dfilter_destroy(compiled_filter);
   } else {
 
        if( color_filter(&cf, cf.colors->row_selected)->c_colorfilter != NULL)
index 0677cb5e1312df20e3dbba69997cf68ad970942d..0f298bd2a0f06d8962ee906ee3a55b03f1508448 100644 (file)
@@ -3,7 +3,7 @@
 /* dfilter-grammar.y
  * Parser for display filters
  *
- * $Id: dfilter-grammar.y,v 1.21 1999/10/11 03:03:10 guy Exp $
+ * $Id: dfilter-grammar.y,v 1.22 1999/10/11 06:39:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -94,14 +94,7 @@ static int ether_str_to_guint8_array(const char *s, guint8 *mac);
 /* This is the dfilter we're currently processing. It's how
  * dfilter_compile communicates with us.
  */
-dfilter *global_df = NULL;;
-
-/* list of GNodes allocated during parsing. If the parsing fails, we'll
- * use this list to free all the GNodes. If the parsing succeeds, we'll
- * just clear this list since dfilter_clear_filter() will take care of
- * freeing the GNodes when they're no longer needed.
- */
-GSList *gnode_slist = NULL;
+dfilter *global_df = NULL;
 
 %}
 
@@ -369,7 +362,6 @@ dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2)
        g_node_append(gnode_root, n1);
        g_node_append(gnode_root, n2);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode_root);
        return gnode_root;
 }
 
@@ -389,7 +381,6 @@ dfilter_mknode_unary(int operand, GNode *n2)
        gnode_root = g_node_new(node_root);
        g_node_append(gnode_root, n2);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode_root);
        return gnode_root;
 }
 
@@ -408,7 +399,6 @@ dfilter_mknode_numeric_variable(gint id)
        node->value.variable = id;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -426,7 +416,6 @@ dfilter_mknode_ether_variable(gint id)
        node->value.variable = id;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -444,7 +433,6 @@ dfilter_mknode_ipxnet_variable(gint id)
        node->value.variable = id;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -462,7 +450,6 @@ dfilter_mknode_ipv4_variable(gint id)
        node->value.variable = id;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -482,7 +469,6 @@ dfilter_mknode_bytes_variable(gint id, gint offset, guint length)
        node->length = length;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -500,7 +486,6 @@ dfilter_mknode_numeric_value(guint32 val)
        node->value.numeric = val;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -528,7 +513,6 @@ dfilter_mknode_ether_value(gchar *byte_string)
        }
 
        gnode = g_node_new(node);
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -546,7 +530,6 @@ dfilter_mknode_ipxnet_value(guint32 ipx_net_val)
        node->value.numeric = ipx_net_val;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -570,7 +553,6 @@ dfilter_mknode_ipv4_value(char *host)
        node->value.numeric = htonl(node->value.numeric);
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -590,7 +572,6 @@ dfilter_mknode_bytes_value(GByteArray *barray)
        node->length = barray->len;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
@@ -620,7 +601,6 @@ dfilter_mknode_existence(gint id)
        node->value.variable = id;
        gnode = g_node_new(node);
 
-       gnode_slist = g_slist_append(gnode_slist, gnode);
        return gnode;
 }
 
index 213d9ccba61e8af299337f515aeaaf23e36bab7f..e447701d2e3e1072c58abc92a54d39e19f6ba2e0 100644 (file)
@@ -2,7 +2,7 @@
  * Definitions for routines common to multiple modules in the display
  * filter code, but not used outside that code.
  *
- * $Id: dfilter-int.h,v 1.7 1999/10/11 03:03:11 guy Exp $
+ * $Id: dfilter-int.h,v 1.8 1999/10/11 06:39:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -34,7 +34,6 @@ void dfilter_scanner_cleanup(void);
 
 /* in dfilter-grammar.y */
 extern dfilter *global_df;
-extern GSList *gnode_slist;
 
 /* Here we provide interfaces to make our scanner act and look like lex */
 int dfilter_lex(void);
index 5d162ccce41296a609baa1941731b0c52dba249d..9efbff124cff2d6385575021ea54b9e422de71b0 100644 (file)
--- a/dfilter.c
+++ b/dfilter.c
@@ -1,7 +1,7 @@
 /* dfilter.c
  * Routines for display filters
  *
- * $Id: dfilter.c,v 1.25 1999/10/11 03:03:10 guy Exp $
+ * $Id: dfilter.c,v 1.26 1999/10/11 06:39:05 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -94,8 +94,6 @@ static GArray* get_values_from_ptree(dfilter_node *dnode, proto_tree *ptree, con
 static GArray* get_values_from_dfilter(dfilter_node *dnode, GNode *gnode);
 static gboolean check_existence_in_ptree(dfilter_node *dnode, proto_tree *ptree);
 static void clear_byte_array(gpointer data, gpointer user_data);
-static void unlink_gnode_children(gpointer gnode_ptr, gpointer user_data);
-static void destroy_gnode(gpointer gnode_ptr, gpointer user_data);
 
 /* this is not so pretty. I need my own g_array "function" (macro) to
  * retreive the pointer to the data stored in an array cell. I need this
@@ -135,28 +133,28 @@ dfilter_cleanup(void)
  * display filter each time, without having to clear any memory used, since
  * dfilter_compile will take care of that automatically.
  * 
- * Returns 0 on success, non-zero on failure.
+ * Returns a pointer to a newly-allocated dfilter strucutre on success,
+ * NULL on failure.
  * If a failure, dfilter_error_msg points to an appropriate error message.
  * This error message is a global string, so another invocation of
  * dfilter_compile will clear it. If the caller needs is stored, he
  * needs to g_strdup it himself.
  */
-int
-dfilter_compile(dfilter *df, gchar *dfilter_text)
+dfilter*
+dfilter_compile(gchar *dfilter_text)
 {
+       dfilter *df;
        int retval;
 
        g_assert(dfilter_text != NULL);
 
-       dfilter_clear_filter(df);
-       df->dftext = g_strdup(dfilter_text);
+       df = dfilter_new();
 
-       /* tell the scanner to use this string as input */
-       dfilter_scanner_text(df->dftext);
+       /* tell the scanner to use the filter string as input */
+       dfilter_scanner_text(dfilter_text);
 
        /* Assign global variable so dfilter_parse knows which dfilter we're
-        * talking about. Reset the global error message. We don't have to set
-        * gnode_slist since it will always be NULL by the time we get here.
+        * talking about. Reset the global error message.
         */
        global_df = df;
        dfilter_error_msg = NULL;
@@ -183,42 +181,15 @@ dfilter_compile(dfilter *df, gchar *dfilter_text)
                }
        }
 
-       /* Clear the list of allocated nodes */
-       if (gnode_slist) {
-               g_slist_free(gnode_slist);
-               gnode_slist = NULL;
-       }
-
-       return retval;
-}
-
-/* clear the current filter, w/o clearing memchunk area which is where we'll
- * put new nodes in a future filter */
-void
-dfilter_clear_filter(dfilter *df)
-{
-       if (!df)
-               return;
-
-       if (df->dftext)
-               g_free(df->dftext);
-
-       if (df->dftree != NULL)
-               g_node_destroy(df->dftree);
-
-       /* clear the memory that the tree was using for nodes */
-       if (df->node_memchunk)
-               g_mem_chunk_reset(df->node_memchunk);
+       /* Set global_df to NULL just to be tidy. */
+       global_df = NULL;
 
-       /* clear the memory that the tree was using for byte arrays */
-       if (df->list_of_byte_arrays) {
-               g_slist_foreach(df->list_of_byte_arrays, clear_byte_array, NULL);
-               g_slist_free(df->list_of_byte_arrays);
+       if (retval == 0)
+               return df;
+       else {
+               dfilter_destroy(df);
+               return NULL;
        }
-
-       df->dftext = NULL;
-       df->dftree = NULL;
-       df->list_of_byte_arrays = NULL;
 }
 
 /* Allocates new dfilter, initializes values, and returns pointer to dfilter */
@@ -229,7 +200,6 @@ dfilter_new(void)
 
        df = g_malloc(sizeof(dfilter));
 
-       df->dftext = NULL;
        df->dftree = NULL;
        df->node_memchunk = g_mem_chunk_new("df->node_memchunk",
                sizeof(dfilter_node), 20 * sizeof(dfilter_node), G_ALLOC_ONLY);
@@ -245,7 +215,21 @@ dfilter_destroy(dfilter *df)
        if (!df)
                return;
 
-       dfilter_clear_filter(df);
+       if (df->dftree != NULL)
+               g_node_destroy(df->dftree);
+
+       /* clear the memory that the tree was using for nodes */
+       if (df->node_memchunk)
+               g_mem_chunk_reset(df->node_memchunk);
+
+       /* clear the memory that the tree was using for byte arrays */
+       if (df->list_of_byte_arrays) {
+               g_slist_foreach(df->list_of_byte_arrays, clear_byte_array, NULL);
+               g_slist_free(df->list_of_byte_arrays);
+       }
+
+       df->dftree = NULL;
+       df->list_of_byte_arrays = NULL;
 
        /* Git rid of memchunk */
        if (df->node_memchunk)
@@ -267,64 +251,25 @@ clear_byte_array(gpointer data, gpointer user_data)
 void
 dfilter_error(char *s)
 {
-       /* The only data we have to worry about freeing is the
-        * data used by any GNodes that were allocated during
-        * parsing. The data in those Gnodes will be cleared
-        * later via df->node_memchunk. Use gnode_slist to
-        * clear the GNodes, and set global_df to NULL just
-        * to be tidy.
-        */
-       global_df = NULL;
-
-       /* I don't want to call g_node_destroy on each GNode ptr,
-        * since that function frees any children. That could
-        * mess me up later in the list if I try to free a GNode
-        * that has already been freed. So, I'll unlink the
-        * children firs,t then call g_node_destroy on each GNode ptr.
-        */
-       if (!gnode_slist)
-               return;
-
-       g_slist_foreach(gnode_slist, unlink_gnode_children, NULL);
-       g_slist_foreach(gnode_slist, destroy_gnode, NULL);
-
-       /* notice we don't clear gnode_slist itself. dfilter_compile()
-        * will take care of that.
-        */
 }
 
 /* Called when an error other than a parsing error occurs. */
 void
 dfilter_fail(char *format, ...)
 {
-  va_list    ap;
+       va_list    ap;
 
-  /* If we've already reported one error, don't overwrite it with this
-   * one. */
-  if (dfilter_error_msg != NULL)
-    return;
-
-  va_start(ap, format);
-  vsnprintf(dfilter_error_msg_buf, sizeof dfilter_error_msg_buf, format, ap);
-  dfilter_error_msg = dfilter_error_msg_buf;
-  va_end(ap);
-}
-
-static void
-unlink_gnode_children(gpointer gnode_ptr, gpointer user_data)
-{
-       if (gnode_ptr)
-               g_node_unlink((GNode*) gnode_ptr);
-}
+       /* If we've already reported one error, don't overwrite it with this
+        * one. */
+       if (dfilter_error_msg != NULL)
+               return;
 
-static void
-destroy_gnode(gpointer gnode_ptr, gpointer user_data)
-{
-       if (gnode_ptr)
-               g_node_destroy((GNode*) gnode_ptr);
+       va_start(ap, format);
+       vsnprintf(dfilter_error_msg_buf, sizeof dfilter_error_msg_buf, format, ap);
+       dfilter_error_msg = dfilter_error_msg_buf;
+       va_end(ap);
 }
 
-
 /* lookup an abbreviation in our token tree, returing the ID #
  * If the abbreviation doesn't exit, returns -1 */
 int dfilter_lookup_token(char *abbrev)
index c42676061af55ca796ca016410de259dfbfdb738..f0c6f18a3b2530bfcae6601efb58279cf3bc05a9 100644 (file)
--- a/dfilter.h
+++ b/dfilter.h
@@ -1,7 +1,7 @@
 /* dfilter.h
  * Definitions for display filters
  *
- * $Id: dfilter.h,v 1.10 1999/08/26 06:20:49 gram Exp $
+ * $Id: dfilter.h,v 1.11 1999/10/11 06:39:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -26,7 +26,7 @@
 #ifndef __DFILTER_H__
 #define __DFILTER_H__
 
-#define DFILTER_CONTAINS_FILTER(x)     ((x)->dftree)
+#define DFILTER_CONTAINS_FILTER(x)     ((x) != NULL && (x)->dftree)
 
 /* dfilter_error_msg is NULL if there was no error during dfilter_compile,
  * otherwise it points to a displayable error message. */
@@ -36,7 +36,6 @@ extern gchar dfilter_error_msg_buf[1024];
 typedef struct {
 
        GNode *dftree;
-       gchar *dftext;
 
        /* space for dfilter_nodes */
        GMemChunk *node_memchunk;
@@ -59,12 +58,9 @@ dfilter* dfilter_new(void);
 void dfilter_destroy(dfilter *df);
 
 /* Compile display filter text */
-int dfilter_compile(dfilter* df, gchar* dfilter_text);
+dfilter* dfilter_compile(gchar* dfilter_text);
 
 /* Apply compiled dfilter to a proto_tree */
 gboolean dfilter_apply(dfilter *df, proto_tree *ptree, const guint8* pd);
 
-/* Clears the current filter int the dfilter */
-void dfilter_clear_filter(dfilter *df);
-
 #endif /* ! __DFILTER_H__ */
diff --git a/file.c b/file.c
index ccc84f2fbaec38d13614e29801b7a2b4fa962285..cadd519754593e085082f193d48e97661480d5f1 100644 (file)
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
 /* file.c
  * File I/O routines
  *
- * $Id: file.c,v 1.104 1999/10/10 11:50:38 sharpe Exp $
+ * $Id: file.c,v 1.105 1999/10/11 06:39:06 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -771,25 +771,57 @@ wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
 }
 
 void
-filter_packets(capture_file *cf)
+filter_packets(capture_file *cf, gchar *dftext)
 {
-  frame_data *fd;
-  guint32 progbar_quantum;
-  guint32 progbar_nextstep;
+  dfilter *dfcode;
 
-  if (cf->dfilter == NULL) {
-       dfilter_clear_filter(cf->dfcode);
-  }
-  else {
+  if (dftext == NULL) {
+    /* The new filter is an empty filter (i.e., display all packets). */
+    dfcode = NULL;
+  else {
     /*
-     * Compile the filter.
+     * We have a filter; try to compile it.
      */
-    if (dfilter_compile(cf->dfcode, cf->dfilter) != 0) {
+    dfcode = dfilter_compile(dftext);
+    if (dfcode == NULL) {
       simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg);
       return;
     }
+
+    /* Was it empty? */
+    if (dfcode->dftree == NULL) {
+      /* Yes - free the filter text and filter code, and set them to
+         NULL. */
+      g_free(dftext);
+      dftext = NULL;
+      dfilter_destroy(dfcode);
+      dfcode = NULL;
+    }
   }
 
+  /* We have a valid filter.  Replace the current filter. */
+  if (cf->dfilter != NULL)
+    g_free(cf->dfilter);
+  cf->dfilter = dftext;
+  if (cf->dfcode != NULL)
+    dfilter_destroy(cf->dfcode);
+  cf->dfcode = dfcode;
+
+  /* Now go through the list of packets we've read from the capture file,
+     applying the current display filter, and, if the packet passes the
+     display filter, add it to the summary display, appropriately
+     colored.  (That's how we colorize the display - it's like filtering
+     the display, only we don't install a new filter.) */
+  colorize_packets(cf);
+}
+
+void
+colorize_packets(capture_file *cf)
+{
+  frame_data *fd;
+  guint32 progbar_quantum;
+  guint32 progbar_nextstep;
+
   gtk_progress_set_activity_mode(GTK_PROGRESS(prog_bar), FALSE);
 
   /* Freeze the packet list while we redo it, so we don't get any
diff --git a/file.h b/file.h
index 031ed6aaa02a70dccd7fc777581e0608bad7f798..39ba7b0f2ea4f10e0192e938891f9343a2e4c79f 100644 (file)
--- a/file.h
+++ b/file.h
@@ -1,7 +1,7 @@
 /* file.h
  * Definitions for file structures and routines
  *
- * $Id: file.h,v 1.48 1999/10/02 20:23:53 guy Exp $
+ * $Id: file.h,v 1.49 1999/10/11 06:39:03 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -104,9 +104,6 @@ typedef struct _capture_file {
   wtap        *wth;       /* Wiretap session */
   dfilter     *rfcode;    /* Compiled read filter program */ 
   gchar       *dfilter;   /* Display filter string */
-#if 0
-  GNode       *dfcode;    /* Compiled display filter program */ 
-#endif
   colfilter   *colors;   /* Colors for colorizing packet window */
   dfilter     *dfcode;    /* Compiled display filter program */ 
 #ifdef HAVE_LIBPCAP
@@ -130,8 +127,9 @@ int  read_cap_file(capture_file *);
 int  tail_cap_file(char *, capture_file *);
 /* size_t read_frame_header(capture_file *); */
 
+void filter_packets(capture_file *cf, gchar *dfilter);
+void colorize_packets(capture_file *);
 int print_packets(capture_file *cf, print_args_t *print_args);
-void filter_packets(capture_file *);
 void change_time_formats(capture_file *);
 void select_packet(capture_file *, int);
 void unselect_packet(capture_file *);
index f7e8c7c3d4c7e92c3ee4a3cdaff4a067f28449ee..571dd1c47f63a654a957f134488e715e8cd9551f 100644 (file)
@@ -1,7 +1,7 @@
 /* file_dlg.c
  * Dialog boxes for handling files
  *
- * $Id: file_dlg.c,v 1.8 1999/10/08 07:31:10 guy Exp $
+ * $Id: file_dlg.c,v 1.9 1999/10/11 06:39:25 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -122,10 +122,9 @@ file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
   filter_te = gtk_object_get_data(GTK_OBJECT(w), E_RFILTER_TE_KEY);
   rfilter = gtk_entry_get_text(GTK_ENTRY(filter_te));
   if (rfilter[0] != '\0') {
-       rfcode = dfilter_new();
-       if (dfilter_compile(rfcode, rfilter) != 0) {
+       rfcode = dfilter_compile(rfilter);
+       if (rfcode != NULL) {
                simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg);
-               dfilter_destroy(rfcode);
                return;
        }
   }
index 59a0a26f0f1a111f3a4f66e62f623cfac7274f83..14c219fdf4d915edbaa0f47c1140daa9098d7323 100644 (file)
@@ -1,6 +1,6 @@
 /* main.c
  *
- * $Id: main.c,v 1.18 1999/10/09 14:05:04 deniel Exp $
+ * $Id: main.c,v 1.19 1999/10/11 06:39:26 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -162,6 +162,7 @@ follow_stream_cb( GtkWidget *w, gpointer data ) {
   char      filename1[128+1];
   GtkWidget *streamwindow, *box, *text, *vscrollbar, *table;
   int        tmp_fd;
+  gchar     *follow_filter;
 
   if( pi.ipproto == 6 ) {
     /* we got tcp so we can follow */
@@ -191,10 +192,10 @@ follow_stream_cb( GtkWidget *w, gpointer data ) {
     /* Create a new filter that matches all packets in the TCP stream,
        and set the display filter entry accordingly */
     reset_tcp_reassembly();
-    cf.dfilter = build_follow_filter( &pi );
+    follow_filter = build_follow_filter( &pi );
 
     /* Run the display filter so it goes in effect. */
-    filter_packets(&cf);
+    filter_packets(&cf, follow_filter);
 
     /* the data_out_file should now be full of the streams information */
     fclose( data_out_file );
@@ -317,17 +318,12 @@ match_selected_cb(GtkWidget *w, gpointer data)
            }
     }
 
-    if( cf.dfilter != NULL ) {
-      /* get rid of this one */
-      g_free( cf.dfilter );
-    }
     /* create a new one and set the display filter entry accordingly */
-    cf.dfilter = buf;
     if (filter_te) {
-       gtk_entry_set_text(GTK_ENTRY(filter_te), cf.dfilter);
+       gtk_entry_set_text(GTK_ENTRY(filter_te), buf);
     }
     /* Run the display filter so it goes in effect. */
-    filter_packets(&cf);
+    filter_packets(&cf, buf);
 }
 
 /* Run the current display filter on the current packet set, and
@@ -337,18 +333,7 @@ filter_activate_cb(GtkWidget *w, gpointer data)
 {
   char *s = gtk_entry_get_text(GTK_ENTRY(w));
 
-  if (cf.dfilter)
-       g_free(cf.dfilter);
-
-  /* simple check for empty string. XXX - need to modify to search for /^\s+$/ */
-  if (s[0] == '\0' ) {
-       cf.dfilter = NULL;
-  }
-  else {
-       cf.dfilter = g_strdup(s);
-  }
-
-  filter_packets(&cf);
+  filter_packets(&cf, g_strdup(s));
 }
 
 /* What to do when a list item is selected/unselected */
@@ -522,7 +507,7 @@ main(int argc, char *argv[])
   cf.fh                        = NULL;
   cf.rfcode            = NULL;
   cf.dfilter           = NULL;
-  cf.dfcode            = dfilter_new();
+  cf.dfcode            = NULL;
 #ifdef HAVE_LIBPCAP
   cf.cfilter           = NULL;
 #endif
@@ -876,10 +861,9 @@ main(int argc, char *argv[])
        up on top of us. */
     if (cf_name) {
       if (rfilter != NULL) {
-        rfcode = dfilter_new();
-        if (dfilter_compile(rfcode, rfilter) != 0) {
+        rfcode = dfilter_compile(rfilter);
+        if (rfcode == NULL) {
           simple_dialog(ESD_TYPE_WARN, NULL, dfilter_error_msg);
-          dfilter_destroy(rfcode);
           rfilter_parse_failed = TRUE;
         }
       }
index 9375ce8bd17cf18ef28bf51098403275cc6631ed..77a0b23162dbab1ae429143a6f083fa925b11bde 100644 (file)
--- a/summary.c
+++ b/summary.c
@@ -1,7 +1,7 @@
 /* summary.c
  * Routines for capture file summary window
  *
- * $Id: summary.c,v 1.12 1999/09/09 02:42:26 gram Exp $
+ * $Id: summary.c,v 1.13 1999/10/11 06:39:01 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -249,8 +249,8 @@ traffic_bytes/seconds);
   add_string_to_box(string_buff, capture_box);
 
   /* Display filter */
-  if (DFILTER_CONTAINS_FILTER(cf.dfcode)) {
-    snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfcode->dftext);
+  if (cf.dfilter) {
+    snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfilter);
   } else {
     sprintf(string_buff, "Display filter: none");
   }