From fede4b07cdfdcebbf31ece9ce26175a5b66b7fb3 Mon Sep 17 00:00:00 2001 From: gram Date: Fri, 13 Aug 1999 23:47:43 +0000 Subject: [PATCH] Moved global memory alloction used in display filters (which was stored 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 | 79 ++++++++++--------------------- dfilter-int.h | 10 +++- dfilter-scanner.l | 5 +- dfilter.c | 118 +++++++++++++++++++++++++++++++++------------- dfilter.h | 39 ++++++++++++--- ethereal.c | 23 +++++++-- file.c | 20 ++++---- file.h | 8 +++- proto.c | 4 +- summary.c | 9 ++-- 10 files changed, 194 insertions(+), 121 deletions(-) diff --git a/dfilter-grammar.y b/dfilter-grammar.y index 47cb4738a9..8fe13809c0 100644 --- a/dfilter-grammar.y +++ b/dfilter-grammar.y @@ -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 @@ -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; diff --git a/dfilter-int.h b/dfilter-int.h index 1ad1502795..689ff4ebcf 100644 --- a/dfilter-int.h +++ b/dfilter-int.h @@ -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 @@ -29,9 +29,11 @@ /* 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 */ diff --git a/dfilter-scanner.l b/dfilter-scanner.l index 51c21d6b98..cb75f0f76f 100644 --- a/dfilter-scanner.l +++ b/dfilter-scanner.l @@ -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 @@ -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; diff --git a/dfilter.c b/dfilter.c index abf6d9aead..470657c1bc 100644 --- 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 @@ -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); } diff --git a/dfilter.h b/dfilter.h index 704dd919d7..cdf5c06dc4 100644 --- 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 @@ -26,12 +26,39 @@ #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__ */ diff --git a/ethereal.c b/ethereal.c index 9e09109f42..99bbbd6c61 100644 --- a/ethereal.c +++ b/ethereal.c @@ -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 @@ -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 e90cb09c11..0f78b660eb 100644 --- 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 @@ -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 b48f0d2779..c6a0b66355 100644 --- 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 @@ -44,6 +44,10 @@ #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 c9d7f07028..3c37ec2cc5 100644 --- 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 @@ -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 */ diff --git a/summary.c b/summary.c index fd02eb17e1..3d975f8ed2 100644 --- 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 @@ -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"); } -- 2.34.1