Moved global memory alloction used in display filters (which was stored
authorgram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 13 Aug 1999 23:47:43 +0000 (23:47 +0000)
committergram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 13 Aug 1999 23:47:43 +0000 (23:47 +0000)
in dfilter-grammar.y) to a new struct dfilter. Display filters now have
their own struct, rather than simply being GNode's. This allows multiple
display filters to exist at once, aiding John McDermott in his
work on colorization.

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

dfilter-grammar.y
dfilter-int.h
dfilter-scanner.l
dfilter.c
dfilter.h
ethereal.c
file.c
file.h
proto.c
summary.c

index 47cb4738a9230bf70e1ff0ead30338d949a06095..8fe13809c0d5a3830245ea2408e8dc82ab7d6cc0 100644 (file)
@@ -3,7 +3,7 @@
 /* dfilter-grammar.y
  * Parser for display filters
  *
- * $Id: dfilter-grammar.y,v 1.8 1999/08/12 21:16:31 guy Exp $
+ * $Id: dfilter-grammar.y,v 1.9 1999/08/13 23:47:39 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -67,7 +67,6 @@
 #include "resolv.h"
 #endif
 
-void dfilter_yacc_init(void);
 static GNode* dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2);
 static GNode* dfilter_mknode_unary(int operand, GNode *n2);
 static GNode* dfilter_mknode_numeric_variable(gint id);
@@ -86,15 +85,10 @@ static GNode* dfilter_mknode_boolean_variable(gint id);
 
 static guint32 string_to_value(char *s);
 
-/* space for dfilter_nodes */
-GMemChunk *gmc_dfilter_nodes = NULL;
-
-/* this is how we pass display filter tree (dfcode) back to calling routine */
-GNode *dfilter_tree = NULL;
-
-/* list of byte arrays we allocate during parse. We can traverse this list
- * faster than the tree when we go back and free the byte arrays */
-GSList *dfilter_list_byte_arrays = NULL;
+/* This is the dfilter we're currently processing. It's how
+ * dfilter_compile communicates with us.
+ */
+dfilter *global_df = NULL;;
 
 %}
 
@@ -155,9 +149,9 @@ GSList *dfilter_list_byte_arrays = NULL;
 
 statement: expression
                {
-                       dfilter_tree = $1;
+                       global_df->dftree = $1;
                }
-       |       /* NULL */ { dfilter_tree = NULL; }
+       |       /* NULL */ { global_df->dftree = NULL; }
        ;
 
 expression:    '(' expression ')' { $$ = $2; }
@@ -262,7 +256,7 @@ bytes_value:        T_VAL_BYTES
        {                                                               /* one or 4 bytes */
                GByteArray      *barray;
 
-               /* the next function appends to dfilter_list_byte_arrays for me */
+               /* the next function appends to list_of_byte_arrays for me */
                barray = byte_str_to_guint8_array($1);
                $$ = dfilter_mknode_bytes_value(barray);
                g_free($1);
@@ -272,7 +266,7 @@ bytes_value:        T_VAL_BYTES
        {                                                               /* 6 bytes */
                GByteArray      *barray = g_byte_array_new();
 
-               dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray);
+               global_df->list_of_byte_arrays = g_slist_append(global_df->list_of_byte_arrays, barray);
                g_byte_array_append(barray, $1, 6);
                $$ = dfilter_mknode_bytes_value(barray);
        }
@@ -341,38 +335,13 @@ bytes_relation:           TOK_EQ { $$ = TOK_EQ; }
 
 %%
 
-void
-dfilter_yacc_init(void)
-{
-       if (gmc_dfilter_nodes)
-               g_mem_chunk_destroy(gmc_dfilter_nodes);
-
-       gmc_dfilter_nodes = g_mem_chunk_new("gmc_dfilter_nodes",
-               sizeof(dfilter_node), 50 * sizeof(dfilter_node),
-               G_ALLOC_ONLY);
-
-       if (dfilter_list_byte_arrays) {
-               /* clear the byte arrays */
-               g_slist_free(dfilter_list_byte_arrays);
-       }
-               
-}
-
-void
-dfilter_yacc_cleanup(void)
-{
-       if (gmc_dfilter_nodes)
-               g_mem_chunk_destroy(gmc_dfilter_nodes);
-}
-
-
 static GNode*
 dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2)
 {
        dfilter_node    *node_root;
        GNode           *gnode_root;
 
-       node_root = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node_root = g_mem_chunk_alloc(global_df->node_memchunk);
        node_root->ntype = ntype;
        node_root->elem_size = 0;
        node_root->fill_array_func = NULL;
@@ -400,7 +369,7 @@ dfilter_mknode_unary(int operand, GNode *n2)
        dfilter_node    *node_root;
        GNode           *gnode_root;
 
-       node_root = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node_root = g_mem_chunk_alloc(global_df->node_memchunk);
        node_root->ntype = logical;
        node_root->value.logical = operand;
        node_root->elem_size = 0;
@@ -420,7 +389,7 @@ dfilter_mknode_numeric_variable(gint id)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = variable;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = fill_array_numeric_variable;
@@ -437,7 +406,7 @@ dfilter_mknode_ether_variable(gint id)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = variable;
        node->elem_size = sizeof(guint8) * 6;
        node->fill_array_func = fill_array_ether_variable;
@@ -454,7 +423,7 @@ dfilter_mknode_ipxnet_variable(gint id)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = variable;
        node->elem_size = sizeof(guint8) * 4;
        node->fill_array_func = fill_array_numeric_variable; /* cheating ! */
@@ -471,7 +440,7 @@ dfilter_mknode_ipv4_variable(gint id)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = variable;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = fill_array_numeric_variable; /* cheating ! */
@@ -488,7 +457,7 @@ dfilter_mknode_bytes_variable(gint id, gint offset, guint length)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = variable;
        node->elem_size = sizeof(GByteArray*);
        node->fill_array_func = fill_array_bytes_variable;
@@ -507,7 +476,7 @@ dfilter_mknode_boolean_variable(gint id)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = variable;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = fill_array_boolean_variable; /* cheating ! */
@@ -524,7 +493,7 @@ dfilter_mknode_numeric_value(guint32 val)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = numeric;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = fill_array_numeric_value;
@@ -541,7 +510,7 @@ dfilter_mknode_ether_value(guint8 *ether_bytes)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = ether;
        node->elem_size = sizeof(guint8) * 6;
        node->fill_array_func = fill_array_ether_value;
@@ -559,7 +528,7 @@ dfilter_mknode_ipxnet_value(guint32 ipx_net_val)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = ipxnet;
        node->elem_size = sizeof(guint8) * 4;
        node->fill_array_func = fill_array_numeric_value; /* cheating ! */
@@ -576,7 +545,7 @@ dfilter_mknode_ipv4_value(char *host)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = numeric;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = fill_array_numeric_value; /* cheating ! */
@@ -594,7 +563,7 @@ dfilter_mknode_bytes_value(GByteArray *barray)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = bytes;
        node->elem_size = sizeof(GByteArray*);
        node->fill_array_func = fill_array_bytes_value;
@@ -613,7 +582,7 @@ dfilter_mknode_boolean_value(gint truth_value)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = numeric;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = fill_array_boolean_value;
@@ -642,7 +611,7 @@ dfilter_mknode_existence(gint id)
        dfilter_node    *node;
        GNode           *gnode;
 
-       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node = g_mem_chunk_alloc(global_df->node_memchunk);
        node->ntype = existence;
        node->elem_size = sizeof(guint32);
        node->fill_array_func = NULL;
index 1ad150279509fa14af9b69abbd39cc7bd4237798..689ff4ebcf5cfd5d08980653784c92801827faab 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.1 1999/08/12 21:16:31 guy Exp $
+ * $Id: dfilter-int.h,v 1.2 1999/08/13 23:47:40 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 
 /* in dfilter-scanner.l */
 GByteArray *byte_str_to_guint8_array(const char *s);
+void dfilter_scanner_text(char*);
+void dfilter_scanner_cleanup(void);
 
 /* in dfilter-grammar.y */
-extern GSList *dfilter_list_byte_arrays;
+extern dfilter *global_df;
 
 /* Here we provide interfaces to make our scanner act and look like lex */
 int yylex(void);
@@ -53,6 +55,10 @@ gboolean fill_array_bytes_variable(GNode *gnode, gpointer data);
 gboolean fill_array_boolean_value(GNode *gnode, gpointer data);
 gboolean fill_array_boolean_variable(GNode *gnode, gpointer data);
 
+#ifdef WIN32
+#define boolean truth_value
+#endif
+
 enum node_type {
        relation,       /* eq, ne, gt, ge, lt, le */
        logical,        /* and, or, not, xor */
index 51c21d6b988860ff6ef2ac67c957a79207fa3480..cb75f0f76ff8d16655234fe61e36f813d46470f4 100644 (file)
@@ -3,7 +3,7 @@
 /* dfilter-scanner.l
  * Scanner for display filters
  *
- * $Id: dfilter-scanner.l,v 1.6 1999/08/12 21:16:31 guy Exp $
+ * $Id: dfilter-scanner.l,v 1.7 1999/08/13 23:47:40 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -327,7 +327,8 @@ byte_str_to_guint8_array(const char *s)
        char            *p, *str;
 
        barray = g_byte_array_new();
-       dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray);
+       /* XXX - don't use global_df, but pass in pointer to GSList* */
+       global_df->list_of_byte_arrays = g_slist_append(global_df->list_of_byte_arrays, barray);
 
        byte_str = g_strdup(s);
        str = byte_str;
index abf6d9aeadcfbbab75b7393c01e88b68b764791f..470657c1bc0d9cf662c1fc896e9ab4493e11e0bc 100644 (file)
--- a/dfilter.c
+++ b/dfilter.c
@@ -1,7 +1,7 @@
 /* dfilter.c
  * Routines for display filters
  *
- * $Id: dfilter.c,v 1.8 1999/08/12 21:16:30 guy Exp $
+ * $Id: dfilter.c,v 1.9 1999/08/13 23:47:40 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -69,15 +69,6 @@ int bytes_length = 0;
 
 YYSTYPE yylval;
 
-/* in dfilter-grammar.y */
-extern GMemChunk *gmc_dfilter_nodes; 
-extern GNode *dfilter_tree;
-extern GSList *dfilter_list_byte_arrays;
-
-/* in dfilter-scanner.l */
-void dfilter_scanner_text(char*);
-void dfilter_scanner_cleanup(void);
-
 static gboolean dfilter_apply_node(GNode *gnode, proto_tree *ptree, const guint8 *pd);
 static gboolean check_relation(gint operand, GNode *a, GNode *b, proto_tree *ptree, const guint8 *pd);
 static gboolean check_logical(gint operand, GNode *a, GNode *b, proto_tree *ptree, const guint8 *pd);
@@ -111,43 +102,104 @@ dfilter_init(void)
                }
        }
 }
-/* I should eventually g_tree_destroy(dfilter_tokens), when ethereal shuts down */
+/* XXX - I should eventually g_tree_destroy(dfilter_tokens), when ethereal shuts down */
 
 /* Compiles the textual representation of the display filter into a tree
- * of operations to perform.
+ * of operations to perform. Can be called multiple times, compiling a new
+ * display filter each time, without having to clear any memory used, since
+ * dfilter_compile will take care of that automatically.
  */
 int
-dfilter_compile(char *dfilter_text, GNode **p_dfcode)
+dfilter_compile(dfilter *df, gchar *dfilter_text)
 {
        int retval;
 
        g_assert(dfilter_text != NULL);
-       dfilter_scanner_text(dfilter_text);
 
-       if (dfilter_tree) {
-               /* clear tree */
-               dfilter_tree = NULL;
-       }
-       /* clear the memory that the tree was using for nodes */
-       g_mem_chunk_reset(gmc_dfilter_nodes);
+       dfilter_clear_filter(df);
+       df->dftext = g_strdup(dfilter_text);
 
-       /* clear the memory that the tree was using for byte arrays */
-       if (dfilter_list_byte_arrays) {
-               g_slist_foreach(dfilter_list_byte_arrays, clear_byte_array, NULL);
-               g_slist_free(dfilter_list_byte_arrays);
-               dfilter_list_byte_arrays = NULL;
-       }
+       /* tell the scanner to use this string as input */
+       dfilter_scanner_text(df->dftext);
 
-       if (*p_dfcode != NULL)
-               g_node_destroy(*p_dfcode);
+       /* Assign global variable so yyparse knows which dfilter we're talking about */
+       global_df = df;
 
+       /* The magic happens right here. */
        retval = yyparse();
+
+       /* clean up lex */
        dfilter_scanner_cleanup();
-       *p_dfcode = dfilter_tree;
 
        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);
+
+       /* 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->dftext = NULL;
+       df->dftree = NULL;
+       df->list_of_byte_arrays = NULL;
+}
+
+/* Allocates new dfilter, initializes values, and returns pointer to dfilter */
+dfilter*
+dfilter_new(void)
+{
+       dfilter *df;
+
+       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);
+       df->list_of_byte_arrays = NULL;
+
+       return df;
+}
+
+/* Frees all memory used by dfilter, and frees dfilter itself */
+void
+dfilter_destroy(dfilter *df)
+{
+       if (!df)
+               return;
+
+       dfilter_clear_filter(df);
+
+       /* Git rid of memchunk */
+       if (df->node_memchunk)
+               g_mem_chunk_destroy(df->node_memchunk);
+
+       g_free(df);
+}
+
+
+
+
+
 static void
 clear_byte_array(gpointer data, gpointer user_data)
 {
@@ -166,7 +218,7 @@ yyerror(char *s)
 void
 dfilter_yyerror(char *fmt, ...)
 {
-       dfilter_tree = NULL;
+       global_df->dftree = NULL;
        yyerror(fmt);
 }
 
@@ -193,10 +245,10 @@ g_strcmp(gconstpointer a, gconstpointer b)
 
 
 gboolean
-dfilter_apply(GNode *dfcode, proto_tree *ptree, const guint8* pd)
+dfilter_apply(dfilter *dfcode, proto_tree *ptree, const guint8* pd)
 {
        gboolean retval;
-       retval = dfilter_apply_node(dfcode, ptree, pd);
+       retval = dfilter_apply_node(dfcode->dftree, ptree, pd);
        return retval;
 }
 
@@ -404,7 +456,7 @@ gboolean fill_array_bytes_variable(GNode *gnode, gpointer data)
 
        if (fi->hfinfo->id == sinfo->target_field) {
                barray = g_byte_array_new();
-               /*dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray);*/
+               /*list_of_byte_arrays = g_slist_append(list_of_byte_arrays, barray);*/
                g_byte_array_append(barray, sinfo->packet_data + fi->start + bytes_offset, bytes_length);
                g_array_append_val(sinfo->result_array, barray);
        }
index 704dd919d7a6ec1b98c8c198a90159a72d1b829d..cdf5c06dc434eafbba0e7ebe6e434294761480d6 100644 (file)
--- a/dfilter.h
+++ b/dfilter.h
@@ -1,7 +1,7 @@
 /* dfilter.h
  * Definitions for display filters
  *
- * $Id: dfilter.h,v 1.6 1999/08/12 21:16:32 guy Exp $
+ * $Id: dfilter.h,v 1.7 1999/08/13 23:47:41 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #ifndef __DFILTER_H__
 #define __DFILTER_H__
 
+#define DFILTER_CONTAINS_FILTER(x)     ((x)->dftree)
+
+typedef struct {
+
+       GNode *dftree;
+       gchar *dftext;
+
+       /* space for dfilter_nodes */
+       GMemChunk *node_memchunk;
+
+       /* list of byte arrays we allocate during parse. We can traverse this list
+        * faster than the tree when we go back and free the byte arrays */
+       GSList *list_of_byte_arrays;
+
+} dfilter;
+
+/* Initialization of the symbol table. Called once during program startup */
 void dfilter_init(void);
-int dfilter_compile(char* dfilter_text, GNode** p_dfcode);
-gboolean dfilter_apply(GNode *dfcode, proto_tree *ptree, const guint8* pd);
 
-#ifdef WIN32
-#define boolean truth_value
-#endif
+/* Allocate and initialize new dfilter struct. Returns pointer to new dfilter */
+dfilter* dfilter_new(void);
+
+/* Frees all memory used by dfilter, and frees dfilter itself */
+void dfilter_destroy(dfilter *df);
+
+/* Compile display filter text */
+int dfilter_compile(dfilter* df, 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__ */
index 9e09109f425f464b51f8e62d5da238aebd05afc0..99bbbd6c617a6ff5720d3d403e9ab25ec4053642 100644 (file)
@@ -1,6 +1,6 @@
 /* ethereal.c
  *
- * $Id: ethereal.c,v 1.82 1999/08/12 07:36:41 guy Exp $
+ * $Id: ethereal.c,v 1.83 1999/08/13 23:47:41 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -543,9 +543,21 @@ file_reload_cmd_cb(GtkWidget *w, gpointer data) {
 /* Run the current display filter on the current packet set, and
    redisplay. */
 static void
-filter_activate_cb(GtkWidget *w, gpointer data) {
-  if (cf.dfilter) g_free(cf.dfilter);
-  cf.dfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(w)));
+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);
 }
 
@@ -1032,8 +1044,9 @@ main(int argc, char *argv[])
   cf.plist_end         = NULL;
   cf.wth               = NULL;
   cf.fh                        = NULL;
+  cf.rfilter           = NULL;
   cf.dfilter           = NULL;
-  cf.dfcode            = NULL;
+  cf.dfcode            = dfilter_new();
 #ifdef HAVE_LIBPCAP
   cf.cfilter           = NULL;
 #endif
diff --git a/file.c b/file.c
index e90cb09c11e73d16e000a3fe2c99d125d755cd11..0f78b660eb3db1c053db06d5294f6c860cf95e4d 100644 (file)
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
 /* file.c
  * File I/O routines
  *
- * $Id: file.c,v 1.61 1999/08/10 07:12:52 guy Exp $
+ * $Id: file.c,v 1.62 1999/08/13 23:47:42 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -88,7 +88,7 @@ guint cap_input_id;
 static guint32 firstsec, firstusec;
 static guint32 lastsec, lastusec;
 
-static GNode *rfcode
+static dfilter *rfcode = NULL
 
 static void wtap_dispatch_cb(u_char *, const struct wtap_pkthdr *, int,
     const u_char *);
@@ -204,12 +204,13 @@ load_cap_file(char *fname, char *rfilter, capture_file *cf) {
   else
     name_ptr++;
 
-  rfcode = NULL;
-  if (rfilter)
-    if (dfilter_compile(rfilter, &rfcode) != 0) {
+  if (rfilter) {
+    rfcode = dfilter_new();
+    if (dfilter_compile(rfcode, rfilter) != 0) {
       simple_dialog(ESD_TYPE_WARN, NULL,
         "Unable to parse filter string \"%s\".", rfilter);
       goto fail;
+    }
   }
 
   err = open_cap_file(fname, cf);
@@ -448,7 +449,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf
   if (check_col(fdata, COL_NUMBER))
     col_add_fstr(fdata, COL_NUMBER, "%d", cf->count);
   /* Apply the display filter */
-  if (cf->dfcode) {
+  if (DFILTER_CONTAINS_FILTER(cf->dfcode)) {
        protocol_tree = proto_tree_create_root();
        dissect_packet(buf, fdata, protocol_tree);
        fdata->passed_dfilter = dfilter_apply(cf->dfcode, protocol_tree, cf->pd);
@@ -524,11 +525,14 @@ filter_packets(capture_file *cf)
 /*  gint timeout;*/
   frame_data *fd;
 
-  if (cf->dfilter != NULL) {
+  if (cf->dfilter == NULL) {
+       dfilter_clear_filter(cf->dfcode);
+  }
+  else {
     /*
      * Compile the filter.
      */
-    if (dfilter_compile(cf->dfilter, &cf->dfcode) != 0) {
+    if (dfilter_compile(cf->dfcode, cf->dfilter) != 0) {
       simple_dialog(ESD_TYPE_WARN, NULL,
       "Unable to parse filter string \"%s\".", cf->dfilter);
       return;
diff --git a/file.h b/file.h
index b48f0d2779a2a772cd766be5b92f915c5fdd6b2f..c6a0b663552d296a136f62bdeb094383c5ace809 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.31 1999/08/11 17:02:27 gram Exp $
+ * $Id: file.h,v 1.32 1999/08/13 23:47:42 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #endif
 #endif
 
+#ifndef __DFILTER_H__
+#include "dfilter.h"
+#endif
+
 typedef struct bpf_program bpf_prog;
 
 typedef struct _capture_file {
@@ -65,7 +69,7 @@ typedef struct _capture_file {
   wtap        *wth;       /* Wiretap session */
   gchar       *rfilter;   /* Read filter string */
   gchar       *dfilter;   /* Display filter string */
-  GNode       *dfcode;    /* Compiled display filter program */ 
+  dfilter     *dfcode;    /* Compiled display filter program */ 
 #ifdef HAVE_LIBPCAP
   gchar       *cfilter;   /* Capture filter string */
   bpf_prog     fcode;     /* Compiled capture filter program */
diff --git a/proto.c b/proto.c
index c9d7f07028ffab3847a95db27baf394578a419ba..3c37ec2cc5d8ada55bc07cd23072f97ccd160b93 100644 (file)
--- a/proto.c
+++ b/proto.c
@@ -1,7 +1,7 @@
 /* proto.c
  * Routines for protocol tree
  *
- * $Id: proto.c,v 1.13 1999/08/10 20:05:40 guy Exp $
+ * $Id: proto.c,v 1.14 1999/08/13 23:47:43 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -242,8 +242,6 @@ proto_init(void)
                /* ftype */     FT_TEXT_ONLY,
                /* parent */    -1,
                /* vals[] */    NULL );
-
-       dfilter_yacc_init();
 }
 
 /* frees the resources that the dissection a proto_tree uses */
index fd02eb17e1db21928bb5a345a00eaceb36e337a4..3d975f8ed22c85909b036686c55372f673eafadb 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.8 1999/08/10 04:13:36 guy Exp $
+ * $Id: summary.c,v 1.9 1999/08/13 23:47:43 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -250,10 +250,9 @@ traffic_bytes/seconds);
   }
   add_string_to_box(string_buff, capture_box);
 
-  /* Display filter. The situation where cf.dfilter="" and cf.dfcode=NULL can exist,
-       so I'll check for both */
-  if (cf.dfilter && cf.dfcode) {
-    snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfilter);
+  /* Display filter */
+  if (DFILTER_CONTAINS_FILTER(cf.dfcode)) {
+    snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfcode->dftext);
   } else {
     sprintf(string_buff, "Display filter: none");
   }